https://vuepress.github.io/zh/advanced/cookbook/markdown-and-vue-sfc.html
经过markdown-it
处理后的html
,会被转换成一个sfc
文件,然后交给vue-loader
处理。
文件中的script
和style
标签以外的标签都是template
所以,如果要开发一些vue组件,如将【json转成table】的插件,就可以通过插入vue组件来实现。
分别在转换成html
之前和html
之后进行处理
重点,渲染分为:
- 容器:可以包裹一层东西,不会对里面的内容造成影响
- 块:多行,如表格
- inline:单行
::: table
xxx
:::
可以通过 markdown-it-container
来处理,容器部分会被提取出来,让我们自定义一个容器去包裹它,而里面的内容就交给其他流程取处理,上面可以转换为
<div class="table">
xxx // markdown-it其他插件处理、块(如表格) or inline (一行的语法)
</div>
我们可以通过这种方式,将文件转换成某些标记,然后在render之后进行处理:
// 保存filepath,注释 不会被处理markdown-it处理
<!--table-data-path:${filepath}:table-data-path-->
<!--table-data-path-content:
// 这个位置的内容vuepress会将文件内容插入这里面,后面在render之后去掉
:table-data-path-content-->
- Parser:将md文档解析为Tokens(类似ATS)
- Renderer:将Tokens内容渲染为html
-
首先去掉
<!--table-data-path-content:([\s\S]*?):table-data-path-content-->
中的内容 -
通过组件的方式去加载
filepath
和使用 匹配出filepath
这个字符串,在原本的render生成的html代码中,插入动态生成的vue组件代码,这样就能保证一个script,就能被vue-loader处理了。
插入的script如下
`
<scirpt>
import data1 from filepath1;
import data2 from filepath2;
export default {
name: 'markdown-table-xx'
components: {
"markdown-table-1": getVueSfcFn('data1'),
"markdown-table-2": getVueSfcFn('data2'),
}
}
</script>
`
下面是一个vue组件的生成函数,tableDataName
是上面import
进来的数据
function getVueSfcFn(tableDataName) {
retrun `
{
render: function renderTable (h) {
return h('markdown-table', {
props: {
columns: ${tableDataName}.columns,
tableData: ${tableDataName}.data
}
})
}
}
`
}
最后将组件插入到渲染后的html中使用:
替换掉<!--table-data-path:${filepath}:table-data-path-->
为上面注册的组件<markdown-table-1/>
,保证位置正确
一个sfc文件只允许有一个script
标签
所以如果存在其他插件已经插入了script
(比如下面的插件),那么就需要采用其他方式来插入代码,比如检查script
和component: {
,然后再将代码插入
https://docs.chenjianhui.site/vuepress-plugin-demo-container/zh/started.html#%E4%BD%BF%E7%94%A8