欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Vitepress的文檔渲染基礎(chǔ)教程

 更新時(shí)間:2022年10月27日 15:57:27   作者:小鑫同學(xué)  
這篇文章主要為大家介紹了Vitepress的文檔渲染基礎(chǔ)教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

1.引言

Vitepress的文檔渲染目的就是將程序員日常所寫的Markdown文件編譯為Html文件,并添加了更多的插件來豐富MD文件的功能,就比如說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 請按如下項(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語法解析模塊,快速且易于擴(kuò)展,遵循COmmonMark規(guī)范,且有大量的社區(qū)插件~

  • 執(zhí)行安裝模塊命令:pnpm i markdown-it @types/markdown-it -D;
  • 導(dǎo)入markdown-it模塊并實(shí)例化md對象;
import markdownIt from "markdown-it";
// 實(shí)例化md-it對象
const md = new markdownIt();
  • 通過fs-extra模塊讀取放置在src下的temp.md文件,讀取后的Buffer數(shù)組通過toString()轉(zhuǎn)為字符串;
const rawMd = fs.readFileSync(path.resolve(__dirname, "temp.md")).toString();
  • 利用md對象的render函數(shù)來講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)在瀏覽器打開index.html文檔;

3. 實(shí)現(xiàn)MD支持代碼塊高亮

代碼塊高亮所使用的模塊時(shí)highlight.js,該模塊同時(shí)內(nèi)置了很多常見的代碼塊樣式文件可供選擇~

3.1 第一步改造markdownIt對象的構(gòu)造函數(shù):

highlight屬性配置的函數(shù)傳入code片段代碼方言兩部分,通過在hljs庫中查找對應(yīng)的方言來利用hljs庫實(shí)現(xiàn)代碼的快速高亮,當(dāng)無法查找到對應(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)換,但是完成高亮還需要樣式配合渲染,我們這里可以通過在輸出output內(nèi)容到index.html時(shí)將hljs中喜歡的樣式文檔路徑傳入到html文件來加載~

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)并不支持的一種語法,在Vuejs的文檔有很多的應(yīng)用,實(shí)現(xiàn)自定義容易需要用到markdown-it-container模塊~

  • markdownIt通過插件的形式利用markdown-it-container來實(shí)現(xiàn)自定義容器,通過配置validate來做渲染前的語法校驗(yàn),通過render函數(shù)來組中容器部分的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';
        }
    }
})

提示:通過tokens[idx]取到的數(shù)據(jù)如下圖所示~

  • 上面的處理依舊是MDHTML結(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é)

通過使用markdown-it、highlight.js、markdown-it-container模塊實(shí)現(xiàn)了MarkdownHTML的文檔轉(zhuǎn)換,代碼塊高亮和自定義容器,VItepress搭建的組件庫文檔中的組件渲染和源碼展示功能就需要用到自定義容器的解析和組裝自定義的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ǔ)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • vue3 座位選座矩陣布局的實(shí)現(xiàn)方法(可點(diǎn)擊選中拖拽調(diào)換位置)

    vue3 座位選座矩陣布局的實(shí)現(xiàn)方法(可點(diǎn)擊選中拖拽調(diào)換位置)

    由于公司項(xiàng)目需求需要做一個(gè)線上設(shè)置考場相關(guān)的座位布局用于給學(xué)生考機(jī)排號(hào)考試,實(shí)現(xiàn)教室考場座位布局的矩陣布局,可點(diǎn)擊選中標(biāo)記是否有座無座拖拽調(diào)換位置橫向縱向排列,本文給大家分享實(shí)現(xiàn)代碼,一起看看吧
    2023-11-11
  • js 實(shí)現(xiàn)拖拽排序詳情

    js 實(shí)現(xiàn)拖拽排序詳情

    這篇文章主要介紹了js 實(shí)現(xiàn)拖拽排序,拖拽排序?qū)τ谛』锇閭儊碚f應(yīng)該不陌生,平時(shí)工作的時(shí)候,可能會(huì)選擇使用類似Sortable.js這樣的開源庫來實(shí)現(xiàn)需求。但在完成需求后,大家有沒有沒想過拖拽排序是如何實(shí)現(xiàn)的呢?感興趣得話一起來看看下面文章得小心內(nèi)容吧
    2021-11-11
  • Vue中$router.push()路由切換及如何傳參和獲取參數(shù)

    Vue中$router.push()路由切換及如何傳參和獲取參數(shù)

    這篇文章主要給大家介紹了關(guān)于Vue中$router.push()路由切換及如何傳參和獲取參數(shù)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用vue具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2023-03-03
  • vue的$http的get請求要加上params操作

    vue的$http的get請求要加上params操作

    這篇文章主要介紹了vue的$http的get請求要加上params操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • vuex中的四個(gè)map方法的使用小結(jié)

    vuex中的四個(gè)map方法的使用小結(jié)

    vuex里面有四個(gè)map方法,他們分別可以針對不同的元素進(jìn)行不同的代碼生成,本文就來詳細(xì)的介紹一下vuex中的四個(gè)map方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-05-05
  • Vue element商品列表的增刪改功能實(shí)現(xiàn)

    Vue element商品列表的增刪改功能實(shí)現(xiàn)

    這篇文章主要介紹了Vue+element 商品列表、新增、編輯、刪除業(yè)務(wù)實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Vue子組件向父組件傳值示范方法

    Vue子組件向父組件傳值示范方法

    這篇文章主要介紹了Vue子組件向父組件傳值方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-03-03
  • vue 項(xiàng)目引入echarts 添加點(diǎn)擊事件操作

    vue 項(xiàng)目引入echarts 添加點(diǎn)擊事件操作

    這篇文章主要介紹了vue 項(xiàng)目引入echarts 添加點(diǎn)擊事件操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • el-menu如何根據(jù)多層樹形結(jié)構(gòu)遞歸遍歷展示菜單欄

    el-menu如何根據(jù)多層樹形結(jié)構(gòu)遞歸遍歷展示菜單欄

    這篇文章主要介紹了el-menu根據(jù)多層樹形結(jié)構(gòu)遞歸遍歷展示菜單欄,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-07-07
  • vue2 router 動(dòng)態(tài)傳參,多個(gè)參數(shù)的實(shí)例

    vue2 router 動(dòng)態(tài)傳參,多個(gè)參數(shù)的實(shí)例

    下面小編就為大家?guī)硪黄獀ue2 router 動(dòng)態(tài)傳參,多個(gè)參數(shù)的實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-11-11

最新評論