搞一搞明白 Vitepress 的文档渲染基础
1. 前言
大家好,我是小鑫同学。一位从事过 Android 开发、混合开发,现在长期从事前端开发的编程爱好者,我觉得在编程之路上最重要的是知识的分享,所谓三人行必有我师。所以我开始在社区持续输出我所了解到、学习到、工作中遇到的各种编程知识,欢迎有想法、有同感的伙伴加我fe-xiaoxin微信交流~
Vitepress 的文档渲染目的就是将程序员日常所写的 Markdown 文件编译为 Html 文件,并添加了更多的插件来丰富 MD 文件的功能,就比如说 Vuejs 组件在 MD 文件中渲染等等,为了我们可以在使用 Vitepress 的时候可以更随心所欲的定制一些功能,我们要先搞一搞明白 Vitepress 是如何将 MD 文档渲染成 HTML 的~
看完可以明白这 3 点?
MD 文档转 HTML 文档流程;
如何支持代码块高亮;
如何实现自定义容器;
2. 实现 MD 文档转 HTML 文档
2.1 请按如下项目结构准备我们的实验环境~
2.2 利用 markdown-it 模块实现文档转换:
markdown-it 是目前比较通用的 MD 语法解析模块,快速且易于扩展,遵循 COmmonMark 规范,且有大量的社区插件~
执行安装模块命令:
pnpm i markdown-it @types/markdown-it -D
;导入
markdown-it
模块并实例化 md 对象;
通过
fs-extra
模块读取放置在src
下的temp.md
文件,读取后的 Buffer 数组通过toString()
转为字符串;
利用 md 对象的
render
函数来讲rawMd
进行转换;
转换完成后将
output
内容输出到index.html
文件中;
在转换完成后可以利用
child_process.exec(root-path)
自动在浏览器打开 index.html 文档;
3. 实现 MD 支持代码块高亮
代码块高亮所使用的模块时 highlight.js,该模块同时内置了很多常见的代码块样式文件可供选择~
3.1 第一步改造 markdownIt 对象的构造函数:
highlight
属性配置的函数传入 code 片段和代码方言两部分,通过在 hljs 库中查找对应的方言来利用 hljs 库实现代码的快速高亮,当无法查找到对应的方言时将返回仅仅转义后的 html 片段~
3.2 第二部整合 output 内容和高亮样式文本:
第一步的操作仅仅完成了由 code 片段到 html 结构的转换,但是完成高亮还需要样式配合渲染,我们这里可以通过在输出 output 内容到 index.html 时将 hljs 中喜欢的样式文档路径传入到 html 文件来加载~
更多的样式文档可以在./node_modules/highlight.js/styles
选择~
4. 实现 MD 支持自定义容器
自定义容器是 MD 文档默认并不支持的一种语法,在 Vuejs 的文档有很多的应用,实现自定义容易需要用到
markdown-it-container
模块~
markdownIt
通过插件的形式利用markdown-it-container
来实现自定义容器,通过配置validate
来做渲染前的语法校验,通过render
函数来组中容器部分的HTML
结构~
提示:通过tokens[idx]
取到的数据如下图所示~
上面的处理依旧是 MD 到 HTML 结构的转换,在自定义容器的时候我们预留的 css 名称,我们还是需要在输出
index.html
文件的时候自定义样式文档~
5. 总结
通过使用markdown-it
、highlight.js
、markdown-it-container
模块实现了 Markdown 到 HTML 的文档转换,代码块高亮和自定义容器,Vitepress 搭建的组件库文档中的组件渲染和源码展示功能就需要用到自定义容器的解析和组装自定义的 Vue 组件实现高级功能~
示例已推送至 GitHub,欢迎克隆演示:
git clone https://github.com/OSpoon/awesome-examples.git
如果看完觉得有收获,欢迎点赞、评论、分享支持一下。你的支持和肯定,是我坚持写作的动力~最后可以关注我 @小鑫同学。欢迎点此扫码加我微信fe-xiaoxin交流,共同进步(还可以帮你 fix🐛)~
版权声明: 本文为 InfoQ 作者【小鑫同学】的原创文章。
原文链接:【http://xie.infoq.cn/article/d9d8cbaa0762356e7f4c194e4】。文章转载请联系作者。
评论