Vue3造輪子之Typescript配置highlight過程
項目基礎是 vue3+typescript
實現(xiàn)一個簡單的 UI 組件庫。
在編寫組件介紹文檔時,需要提供一些代碼示例,這時候用到了 hightlight.js
來實現(xiàn)代碼的高亮。
一、安裝 highlight.js
執(zhí)行命令行進行依賴以及類型聲明的安裝
yarn add highlight.js @types/highlight.js
安裝完成后,按照官方地址配置發(fā)現(xiàn)是無法使用的,報錯情況如下
這個問題說明我們引入的類并沒有 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' // 路徑對應你創(chuàng)建的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>
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
vue?eslint報錯error?"Component?name?"*****"
這篇文章主要給大家介紹了關于vue?eslint報錯error?“Component?name?“*****“?should?always?be?multi-word”的解決方法,文中通過圖文以及實例代碼介紹的非常詳細,需要的朋友可以參考下2022-09-09關于vue-treeselect綁值、回顯等常見問題的總結(jié)
這篇文章主要介紹了關于vue-treeselect綁值、回顯等常見問題的總結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07vue如何通過點擊事件實現(xiàn)頁面跳轉(zhuǎn)詳解
頁面跳轉(zhuǎn),我們一般都通過路由跳轉(zhuǎn)實現(xiàn),通常情況下可直接使用router-link標簽實現(xiàn)頁面跳轉(zhuǎn),下面這篇文章主要給大家介紹了關于vue如何通過點擊事件實現(xiàn)頁面跳轉(zhuǎn)的相關資料,需要的朋友可以參考下2022-07-07vue中的attribute和property的具體使用及區(qū)別
本文主要介紹了vue中的attribute和property的具體使用及區(qū)別,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09vue子元素綁定的事件, 阻止觸發(fā)父級上的事件處理方式
這篇文章主要介紹了vue子元素綁定的事件, 阻止觸發(fā)父級上的事件處理方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11