Vue3造輪子之Typescript配置highlight過程
項(xiàng)目基礎(chǔ)是 vue3+typescript
實(shí)現(xiàn)一個(gè)簡單的 UI 組件庫。
在編寫組件介紹文檔時(shí),需要提供一些代碼示例,這時(shí)候用到了 hightlight.js
來實(shí)現(xiàn)代碼的高亮。
一、安裝 highlight.js
執(zhí)行命令行進(jìn)行依賴以及類型聲明的安裝
yarn add highlight.js @types/highlight.js
安裝完成后,按照官方地址配置發(fā)現(xiàn)是無法使用的,報(bào)錯(cuò)情況如下
這個(gè)問題說明我們引入的類并沒有 vuePlugin
這個(gè)屬性
二、增加 highlight.ts 文件
那么我們基于 typescript 來使用 highlight.js
的話,就需要解決這個(gè) vue.use()
的問題。
查閱資料得知,需要增加一個(gè)定義 vue 外部插件的 highlight.ts
如下所示,可放心復(fù)制
import Hljs from 'highlight.js'; import 'highlight.js/styles/monokai-sublime.css' // 自定義的interface會導(dǎo)致報(bào)錯(cuò) // 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
在這里曾嘗試定義一個(gè) Highlightjs
的接口類型,但是會導(dǎo)致報(bào)如下的錯(cuò)誤,而放棄
初步分析該報(bào)錯(cuò)的原因是 interface
里的類型定義還是存在一定的問題,所以用了 any 類型暴力解決了。
三、在入口文件引入
定義好 highlight.ts
文件后,在我們的入口文件 main.ts
中引入即可
下面的代碼可放心復(fù)制
import { createApp } from 'vue' import router from './router' import App from './App.vue' import Highlight from './libs/types/highlight' // 路徑對應(yīng)你創(chuàng)建的highlight.ts的路徑 const app = createApp(App) app.use(router) app.use(Highlight) app.mount('#app')
到此,我們就可以在 ts 文件中正常的引入 hightlight.js
并開始使用了。
個(gè)人測試驗(yàn)證第二、第三步不可行,以下是更正后的方法
四、在入口文件注冊指令
安裝好 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')
這樣我們在組件中可以通過指令進(jìn)行代碼高亮的編寫了,示例如下
<pre v-highlight> <code class="javascript"> let a = "hello world"; console.log(a) </code> </pre>
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue?eslint報(bào)錯(cuò)error?"Component?name?"*****"
這篇文章主要給大家介紹了關(guān)于vue?eslint報(bào)錯(cuò)error?“Component?name?“*****“?should?always?be?multi-word”的解決方法,文中通過圖文以及實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09使用vue3+vite導(dǎo)入圖片路徑錯(cuò)亂問題排查及解決
使用vue3+vite開發(fā)的時(shí)候,導(dǎo)入svg圖片時(shí),同一個(gè)文件夾下的文件,其中一個(gè)路徑正常解析,另一個(gè)不行,更改文件名之后,該圖片文件就可以正常解析了,本文給大家介紹了使用vue3+vite導(dǎo)入圖片路徑錯(cuò)亂問題排查及解決,需要的朋友可以參考下2024-03-03vue2.0 兄弟組件(平級)通訊的實(shí)現(xiàn)代碼
這篇文章主要介紹了vue2.0 兄弟組件(平級)通訊的實(shí)現(xiàn)代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2018-01-01關(guān)于vue-treeselect綁值、回顯等常見問題的總結(jié)
這篇文章主要介紹了關(guān)于vue-treeselect綁值、回顯等常見問題的總結(jié),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07vue如何通過點(diǎn)擊事件實(shí)現(xiàn)頁面跳轉(zhuǎn)詳解
頁面跳轉(zhuǎn),我們一般都通過路由跳轉(zhuǎn)實(shí)現(xiàn),通常情況下可直接使用router-link標(biāo)簽實(shí)現(xiàn)頁面跳轉(zhuǎn),下面這篇文章主要給大家介紹了關(guān)于vue如何通過點(diǎn)擊事件實(shí)現(xiàn)頁面跳轉(zhuǎn)的相關(guān)資料,需要的朋友可以參考下2022-07-07vue中的attribute和property的具體使用及區(qū)別
本文主要介紹了vue中的attribute和property的具體使用及區(qū)別,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09vue子元素綁定的事件, 阻止觸發(fā)父級上的事件處理方式
這篇文章主要介紹了vue子元素綁定的事件, 阻止觸發(fā)父級上的事件處理方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11