Vue3中實(shí)現(xiàn)代碼高亮的兩種方法(prismjs和highlight.js)
prismjs和highlight.js
prismjs使用
1.安裝依賴
//安裝prismjs 插件 npm install prismjs -S // vite npm install vite-plugin-prismjs -D
2.配置vite.config.js 2.配置vite.config.js
import { prismjsPlugin } from 'vite-plugin-prismjs';
export default defineConfig({
plugins: [
vue(),
prismjsPlugin({
languages: 'all', // 語(yǔ)言
plugins: ['line-numbers', 'copy-to-clipboard'], //官網(wǎng)有其他功能,這里開(kāi)啟行數(shù)和復(fù)制按鈕功能
theme: 'okaidia', // 主題
css: true,
}),
],
})參數(shù)解讀:
line-numbers顯示行數(shù)language顯示語(yǔ)言copy-to-clipboard 復(fù)制功能inline-color代碼中顯示顏色塊
3.html使用
設(shè)置語(yǔ)言只需要在class="language-語(yǔ)言",比如如下js設(shè)置language-js即可
<template>
<pre><code class="language-js line-numbers">{{ codes }}</code></pre>
</template>
<script lang="ts">
import { defineComponent } from 'vue';
import Prism from 'prismjs';
export default defineComponent({
name: 'HtmlRender',
setup() {
onMounted(() => {
Prism.highlightAll(); // 切換更新內(nèi)容則重新調(diào)用這個(gè)方法
});
}
});
</script>注意: pre 和 code 寫在同一行(不然行號(hào)會(huì)錯(cuò)亂)
效果圖:

4.額外擴(kuò)展
如果你想用Mac分格的樣式,則需要自定義pre樣式,如下是我自己的,大家可做參考:
pre {
overflow: hidden !important;
code{
display: inline-block;
padding-bottom: 20px;
position: relative;
top: 20px;
}
&::before {
content: "";
position: absolute;
background: red;
width: 10px;
height: 10px;
border-radius: 50%;
top: 10px;
left: 15px;
transform: translate(-50%);
}
&::after {
content: "";
position: absolute;
background: sandybrown;
width: 10px;
height: 10px;
border-radius: 50%;
top: 10px;
left: 30px;
transform: translate(-50%);
}
code:first-child{
&::after{
content: "";
position: absolute;
background: limegreen;
width: 10px;
height: 10px;
border-radius: 50%;
top: -24px;
left: -7px;
transform: translate(-50%);
}
}
}如果你到了這一步,那代表你使用prismjs實(shí)現(xiàn)的的代碼塊樣式功能完美實(shí)現(xiàn)啦!恭喜恭喜!
highlight使用
1.安裝依賴
npm install highlight.js --save 或 yarn add highlight.js
2.在main.js中引入,官方為我們提供了vue到插件
// highlight 的樣式,依賴包,組件
import hljs from "highlight.js";
import "highlight.js/styles/github.css";
const app = createApp(App);
app.use((app) => {
app.directive("highlight", {
mounted(el) {
const blocks = el.querySelectorAll("pre code"); // querySelectorAll可以根據(jù)自己的富文本生成的代碼做調(diào)整 我這里默認(rèn)剛好
blocks.forEach((block: any) => {
// 在forEach中做一些操作
// 1.創(chuàng)建ul節(jié)點(diǎn)
const ul = document.createElement("ul");
// 2.根據(jù)換行符獲取行數(shù),根據(jù)獲取的行數(shù)生成行號(hào)
const rowCount = block.outerHTML.split("\n").length;
for (let i = 1; i <= rowCount; i++) {
//創(chuàng)建li節(jié)點(diǎn),創(chuàng)建文本節(jié)點(diǎn)
const li = document.createElement("li");
const text = document.createTextNode(String(i));
//為li追加文本節(jié)點(diǎn),將li加入ul
li.appendChild(text);
ul.appendChild(li);
}
// 3.給行號(hào)添加類名
ul.className = "pre-numbering";
// 4.將ul節(jié)點(diǎn)加到 代碼塊
block.parentNode.appendChild(ul);
hljs.highlightBlock(block);
});
},
});
})
.mount("#app");3.css行數(shù)樣式自定義
我們對(duì)顯示行數(shù)做了擴(kuò)展,css如下
pre {
position: relative;
background-color: #fafafa;
font-size: 14px;
padding: 8px 8px 0px 8px;
overflow: hidden;
border: 1px solid #ccc;
}
code.hljs {
background-color: #fafafa !important;
line-height: 22px;
padding: 0 0 0.5em 2.2em !important;
white-space: unset;
}
.pre-numbering {
position: absolute;
top: 8px;
left: 0;
width: 30px;
border-right: 1px solid #c5c5c5;
background-color: #fafafa;
text-align: center;
line-height: 22px;
}
.pre-numbering li {
list-style: none;
color: #383a42;
font-size: 14px;
}行數(shù)以及背景顯示樣式可以根據(jù)自己的需求自定義
注意點(diǎn):
設(shè)置行數(shù)樣式中,有人反應(yīng)高亮的代碼死活就是錯(cuò)位顯示,正常沒(méi)有庫(kù)樣式覆蓋pre參照以上樣式基本沒(méi)問(wèn)題,如果引入其他css庫(kù)覆蓋可能是pre下面的code設(shè)置了white-space: pre-wrap;換行導(dǎo)致錯(cuò)位展示問(wèn)題,重點(diǎn)排查樣式覆蓋問(wèn)題。
4.html中使用
<highlightjs language='javascript' code="var x = 5;" />
如果你到了這一步,那代表你使用highlight實(shí)現(xiàn)的代碼塊樣式功能完美實(shí)現(xiàn)啦!恭喜恭喜!
總結(jié)
prismjs和highlight.js兩個(gè)插件感覺(jué)都很不錯(cuò),個(gè)人比較喜歡prismjs,當(dāng)然蘿卜青菜各有所愛(ài),大家根據(jù)自己的愛(ài)好選擇即可。
到此這篇關(guān)于Vue3實(shí)現(xiàn)代碼高亮的兩種方法(prismjs和highlight.js)的文章就介紹到這了,更多相關(guān)Vue3 prismjs和highlight.js代碼高亮內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue使用vue-area-linkage實(shí)現(xiàn)地址三級(jí)聯(lián)動(dòng)效果的示例
很多時(shí)候我們需要使用地址三級(jí)聯(lián)動(dòng),即省市區(qū)三級(jí)聯(lián)動(dòng),這篇文章主要介紹了Vue使用vue-area-linkage實(shí)現(xiàn)地址三級(jí)聯(lián)動(dòng)效果的示例,感興趣的小伙伴們可以參考一下2018-06-06
關(guān)于element-ui表頭吸附問(wèn)題的解決方案
數(shù)據(jù)過(guò)多滑動(dòng)表格的時(shí)候,看不到表頭不知道對(duì)應(yīng)的數(shù)據(jù)是什么,用戶體驗(yàn)操作不友好,要改成表頭固定住,所以本文給大家介紹了關(guān)于element-ui表頭吸附問(wèn)題的兩個(gè)解決方案,需要的朋友可以參考下2024-01-01
vue項(xiàng)目打包成桌面快捷方式(electron)的方法
本文主要介紹了vue項(xiàng)目打包成桌面快捷方式(electron)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
使用vue打包時(shí)vendor文件過(guò)大或者是app.js文件很大的問(wèn)題
這篇文章主要介紹了使用vue打包時(shí)vendor文件過(guò)大或者是app.js文件很大問(wèn)題的解決方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-06-06
vue 輸入電話號(hào)碼自動(dòng)按3-4-4分割功能的實(shí)現(xiàn)代碼
這篇文章主要介紹了vue 輸入電話號(hào)碼自動(dòng)按3-4-4分割功能的實(shí)現(xiàn)代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04
vue3項(xiàng)目中配置sass,vite報(bào)錯(cuò)Undefined mixin問(wèn)題
這篇文章主要介紹了vue3項(xiàng)目中配置sass,vite報(bào)錯(cuò)Undefined mixin問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02
Vue中l(wèi)ocalStorage的用法和監(jiān)聽(tīng)localStorage值的變化
這篇文章主要介紹了Vue中l(wèi)ocalStorage的用法和監(jiān)聽(tīng)localStorage值的變化,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04

