Vue3造轮子之Typescript配置highlight过程

 更新时间:2024年07月05日 10:29:20   作者:存梨  
这篇文章主要介绍了Vue3造轮子之Typescript配置highlight过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

项目基础是 vue3+typescript 实现一个简单的 UI 组件库。

在编写组件介绍文档时,需要提供一些代码示例,这时候用到了 hightlight.js 来实现代码的高亮。

一、安装 highlight.js

执行命令行进行依赖以及类型声明的安装

yarn add highlight.js @types/highlight.js

安装完成后,按照官方地址配置发现是无法使用的,报错情况如下

这个问题说明我们引入的类并没有 vuePlugin 这个属性

二、增加 highlight.ts 文件

那么我们基于 typescript 来使用 highlight.js 的话,就需要解决这个 vue.use() 的问题。

查阅资料得知,需要增加一个定义 vue 外部插件的 highlight.ts

如下所示,可放心复制

import Hljs from 'highlight.js';
import 'highlight.js/styles/monokai-sublime.css'
// 自定义的interface会导致报错
// interface Highlightjs {
//    [x:string]:any
// }
//let Highlight:Highlightjs = {};
let Highlight:any = {};

Highlight.install = function (Vue:any,options:any) {

    Vue.directive('highlightA',{
        inserted:function(el:any){
            let blocks = el.querySelectorAll('per code');
            for (let i = 0; i < blocks.length; i++) {
                const item = blocks[i]
                Hljs.highlightBlock(item)
            }
        }
    })

    Vue.directive('highlightB',{
        componentUpdated:function(el:any){
            let blocks = el.querySelectorAll('per code');
            for (let i = 0; i < blocks.length; i++) {
                const item = blocks[i]
                Hljs.highlightBlock(item)
            }
        }
    })
}

export default Highlight

在这里曾尝试定义一个 Highlightjs 的接口类型,但是会导致报如下的错误,而放弃

初步分析该报错的原因是 interface 里的类型定义还是存在一定的问题,所以用了 any 类型暴力解决了。

三、在入口文件引入

定义好 highlight.ts 文件后,在我们的入口文件 main.ts 中引入即可

下面的代码可放心复制

import { createApp } from 'vue'
import router from './router'
import App from './App.vue'
import Highlight from './libs/types/highlight' // 路径对应你创建的highlight.ts的路径

const app = createApp(App)
app.use(router)
app.use(Highlight)
app.mount('#app')

到此,我们就可以在 ts 文件中正常的引入 hightlight.js 并开始使用了。

个人测试验证第二、第三步不可行,以下是更正后的方法

四、在入口文件注册指令

安装好 highlight.js 之后,我们在入口文件注册 vue 的自定义指令 directive

代码如下

import { createApp } from 'vue'
import router from './router'
import App from './App.vue'
import hljs from 'highlight.js'
import 'highlight.js/styles/monokai-sublime.css'

const app = createApp(App)
app.use(router)

// 注册自定义指令高亮代码
app.directive('highlight', {
  // Directive has a set of lifecycle hooks:
  // called before bound element's parent component is mounted
  beforeMount(el:any) {
    // on first bind, highlight all targets
    let blocks = el.querySelectorAll('pre code');
    for(let i = 0 ;i < blocks.length ; i++){
      let item = blocks[i]
      console.log(item)
      hljs.highlightBlock(item)
    }
  },
  // called after the containing component's VNode and the VNodes of its children // have updated
  updated(el:any, binding:any) {
    // after an update, re-fill the content and then highlight
    let targets = el.querySelectorAll('code');
    for (let i = 0; i < targets.length; i += 1) {
        let target = targets[i];
        if (typeof binding.value === 'string') {
        target.textContent = binding.value;
        }
        hljs.highlightBlock(target);
    }
  }
})

app.mount('#app')

这样我们在组件中可以通过指令进行代码高亮的编写了,示例如下

<pre v-highlight>
  <code class="javascript">
    let a = "hello world";
    console.log(a)
  </code>
</pre>

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 对vue中的事件穿透与禁止穿透实例详解

    对vue中的事件穿透与禁止穿透实例详解

    今天小编就为大家分享一篇对vue中的事件穿透与禁止穿透实例详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-10-10
  • vue-cli3.0如何修改端口号

    vue-cli3.0如何修改端口号

    这篇文章主要介绍了vue-cli3.0如何修改端口号,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04
  • vue开发树形结构组件(组件递归)

    vue开发树形结构组件(组件递归)

    这篇文章主要为大家详细介绍了vue开发树形结构组件的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • weex里Vuex state使用storage持久化详解

    weex里Vuex state使用storage持久化详解

    本篇文章主要介绍了weex里Vuex state使用storage持久化详解,非常具有实用价值,需要的朋友可以参考下
    2017-09-09
  • vue项目初始化到登录login页面的示例

    vue项目初始化到登录login页面的示例

    今天小编就为大家分享一篇vue项目初始化到登录login页面的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-10-10
  • vue实现路由懒加载的3种方法示例

    vue实现路由懒加载的3种方法示例

    这篇文章主要给大家介绍了关于vue实现路由懒加载的3种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Vue——解决报错 Computed property

    Vue——解决报错 Computed property "****" was assigned to but it ha

    这篇文章主要介绍了Vue——解决报错 Computed property "****" was assigned to but it has no setter.的方法,帮助大家更好的理解和使用vue框架,感兴趣的朋友可以了解下
    2020-12-12
  • VUE 动态组件的应用案例分析

    VUE 动态组件的应用案例分析

    这篇文章主要介绍了VUE 动态组件的应用,结合具体案例形式分析了vue.js动态组件的应用场景、解决方案及相关操作技巧,需要的朋友可以参考下
    2019-12-12
  • 详解从零搭建 vue2 vue-router2 webpack3 工程

    详解从零搭建 vue2 vue-router2 webpack3 工程

    本篇文章主要介绍了详解从零搭建 vue2 vue-router2 webpack3 工程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • JS 函数的 call、apply 及 bind 超详细方法

    JS 函数的 call、apply 及 bind 超详细方法

    这篇文章主要描述JS 函数的 call、apply 及 bind 方法的超详细解说,感兴趣的朋友可以参考下文,希望能帮助到您
    2021-08-08

最新评论