Vitepress的文檔渲染基礎(chǔ)教程
1.引言
Vitepress的文檔渲染目的就是將程序員日常所寫(xiě)的Markdown文件編譯為Html文件,并添加了更多的插件來(lái)豐富MD文件的功能,就比如說(shuō)Vuejs組件在MD文件中渲染等等,為了我們可以在使用Vitepress的時(shí)候可以更隨心所欲的定制一些功能,我們要先搞一搞明白Vitepress是如何將MD文檔渲染成HTML的~
看完可以明白這3點(diǎn)?
- MD文檔轉(zhuǎn)HTML文檔流程;
- 如何支持代碼塊高亮;
- 如何實(shí)現(xiàn)自定義容器;

2. 實(shí)現(xiàn)MD文檔轉(zhuǎn)HTML文檔
2.1 請(qǐng)按如下項(xiàng)目結(jié)構(gòu)準(zhǔn)備我們的實(shí)驗(yàn)環(huán)境~
├─markdown-it-demo │ ├─src │ │ ├─index.ts │ │ ├─temp.md │ ├─index.html └─ └─package.json
2.2 利用markdown-it模塊實(shí)現(xiàn)文檔轉(zhuǎn)換:
markdown-it 是目前比較通用的MD語(yǔ)法解析模塊,快速且易于擴(kuò)展,遵循COmmonMark規(guī)范,且有大量的社區(qū)插件~
- 執(zhí)行安裝模塊命令:
pnpm i markdown-it @types/markdown-it -D; - 導(dǎo)入
markdown-it模塊并實(shí)例化md對(duì)象;
import markdownIt from "markdown-it"; // 實(shí)例化md-it對(duì)象 const md = new markdownIt();
- 通過(guò)
fs-extra模塊讀取放置在src下的temp.md文件,讀取后的Buffer數(shù)組通過(guò)toString()轉(zhuǎn)為字符串;
const rawMd = fs.readFileSync(path.resolve(__dirname, "temp.md")).toString();
- 利用md對(duì)象的
render函數(shù)來(lái)講rawMd進(jìn)行轉(zhuǎn)換;
const output = md.render(rawMd);
- 轉(zhuǎn)換完成后將
output內(nèi)容輸出到index.html文件中;
fs.writeFileSync(path.resolve(__dirname, "../index.html"), `
${output}
`);
- 在轉(zhuǎn)換完成后可以利用
child_process.exec(root-path)自動(dòng)在瀏覽器打開(kāi)index.html文檔;
3. 實(shí)現(xiàn)MD支持代碼塊高亮
代碼塊高亮所使用的模塊時(shí)highlight.js,該模塊同時(shí)內(nèi)置了很多常見(jiàn)的代碼塊樣式文件可供選擇~
3.1 第一步改造markdownIt對(duì)象的構(gòu)造函數(shù):
highlight屬性配置的函數(shù)傳入code片段和代碼方言兩部分,通過(guò)在hljs庫(kù)中查找對(duì)應(yīng)的方言來(lái)利用hljs庫(kù)實(shí)現(xiàn)代碼的快速高亮,當(dāng)無(wú)法查找到對(duì)應(yīng)的方言時(shí)將返回僅僅轉(zhuǎn)義后的html片段~
const md = new markdownIt({
highlight: (str: string, lang: string) => {
const defaultCode: string = `<pre class="hljs"><code>${md.utils.escapeHtml(str)}</code></pre>`;
if (lang && hljs.getLanguage(lang)) {
try {
return `<pre class="hljs"><code>${hljs.highlight(str, { language: lang, ignoreIllegals: true }).value}</code></pre>`
} catch (__) {
return defaultCode;
}
}
return defaultCode;
}
});
3.2 第二部整合output內(nèi)容和高亮樣式文本:
第一步的操作僅僅完成了由code片段到html結(jié)構(gòu)的轉(zhuǎn)換,但是完成高亮還需要樣式配合渲染,我們這里可以通過(guò)在輸出output內(nèi)容到index.html時(shí)將hljs中喜歡的樣式文檔路徑傳入到html文件來(lái)加載~
const output = md.render(rawMd);
const styles = `
<link rel="stylesheet" href="./node_modules/highlight.js/styles/a11y-dark.css" rel="external nofollow" rel="external nofollow" >
`;
// 輸出html文本
fs.writeFileSync(path.resolve(__dirname, "../index.html"), `
${styles}
${output}
`);
更多的樣式文檔可以在./node_modules/highlight.js/styles選擇~
4. 實(shí)現(xiàn)MD支持自定義容器
自定義容器是MD文檔默認(rèn)并不支持的一種語(yǔ)法,在Vuejs的文檔有很多的應(yīng)用,實(shí)現(xiàn)自定義容易需要用到markdown-it-container模塊~
markdownIt通過(guò)插件的形式利用markdown-it-container來(lái)實(shí)現(xiàn)自定義容器,通過(guò)配置validate來(lái)做渲染前的語(yǔ)法校驗(yàn),通過(guò)render函數(shù)來(lái)組中容器部分的HTML結(jié)構(gòu)~
::: warning *here be dragons* ::: ↓↓↓↓↓↓↓↓↓↓轉(zhuǎn)換為↓↓↓↓↓↓↓↓↓↓ <div class="warning"> <em>here be dragons</em> </div>
md.use(require("markdown-it-container"), "warning", {
validate: (params: string) => {
return params.trim().match(/^warning+(.*)$/m);
},
render: (tokens: Array<Token>, idx: number) => {
const m = tokens[idx].info.trim().match(/^warning+(.*)$/m);
if (tokens[idx].nesting === 1) {
return `<div class="warning">${md.utils.escapeHtml(m ? m[1] : '')}`
} else {
return '</div>\n';
}
}
})
提示:通過(guò)tokens[idx]取到的數(shù)據(jù)如下圖所示~

- 上面的處理依舊是MD到HTML結(jié)構(gòu)的轉(zhuǎn)換,在自定義容器的時(shí)候我們預(yù)留的css名稱,我們還是需要在輸出
index.html文件的時(shí)候自定義樣式文檔~
const output = md.render(rawMd);
const styles = `
<link rel="stylesheet" href="./node_modules/highlight.js/styles/a11y-dark.css" rel="external nofollow" rel="external nofollow" >
<style>
.warning{
margin: 28px 0;
padding: 10px 14px 4px 22px;
border-radius: 8px;
overflow-x: auto;
transition: color .5s,background-color .5s;
position: relative;
font-size: 14px;
line-height: 1.6;
font-weight: 500;
color: #0000008c;
background-color: #f9f9f9;
border: 1px solid #ffc517;
}
.hljs {
padding: 5px 8px;
border-radius: 5px;
}
</style>
`;
// 輸出html文本
fs.writeFileSync(path.resolve(__dirname, "../index.html"), `
${styles}
${output}
`);
5. 總結(jié)
通過(guò)使用markdown-it、highlight.js、markdown-it-container模塊實(shí)現(xiàn)了Markdown到HTML的文檔轉(zhuǎn)換,代碼塊高亮和自定義容器,VItepress搭建的組件庫(kù)文檔中的組件渲染和源碼展示功能就需要用到自定義容器的解析和組裝自定義的Vue組件實(shí)現(xiàn)高級(jí)功能~
本文項(xiàng)目已推送至GitHub,歡迎克隆演示:git clone
https://github.com/OSpoon/awesome-examples.git
以上就是Vitepress的文檔渲染基礎(chǔ)教程的詳細(xì)內(nèi)容,更多關(guān)于Vitepress 文檔渲染基礎(chǔ)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
教你使用vue-autofit 一行代碼搞定自適應(yīng)可視化大屏
這篇文章主要為大家介紹了使用vue-autofit 一行代碼搞定自適應(yīng)可視化大屏教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
vue3.0 CLI - 3.2 路由的初級(jí)使用教程
這篇文章主要介紹了vue3.0 CLI - 3.2 - 路由的初級(jí)使用教程,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-09-09
Vue仿微信app頁(yè)面跳轉(zhuǎn)動(dòng)畫(huà)效果
這篇文章主要介紹了Vue仿微信app頁(yè)面跳轉(zhuǎn)動(dòng)畫(huà)效果,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08
在Vue3中實(shí)現(xiàn)拖拽文件上傳功能的過(guò)程詳解
文件上傳是我們?cè)陂_(kāi)發(fā)Web應(yīng)用時(shí)經(jīng)常遇到的功能之一,為了提升用戶體驗(yàn),我們可以利用HTML5的拖放API來(lái)實(shí)現(xiàn)拖拽文件上傳的功能,本文將介紹如何在Vue3中實(shí)現(xiàn)這一功能,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下2023-12-12
Vue3從0搭建Monorepo項(xiàng)目組件庫(kù)
這篇文章主要為大家介紹了Vue3從0搭建Monorepo項(xiàng)目組件庫(kù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
Vue異步更新DOM及$nextTick執(zhí)行機(jī)制解讀
這篇文章主要介紹了Vue異步更新DOM及$nextTick執(zhí)行機(jī)制解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
vue-cli2.x項(xiàng)目?jī)?yōu)化之引入本地靜態(tài)庫(kù)文件的方法
這篇文章主要介紹了vue-cli2.x項(xiàng)目?jī)?yōu)化之引入本地靜態(tài)庫(kù)文件的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-06-06

