当前位置: 首页 > Web前端 > vue.js

让Markdown中的Vue代码运行

时间:2023-04-01 01:14:35 vue.js

起源一定是你看过ElementUi和AntDesignVue等文档,里面的例子和例子的源码通常是同时展示的。这种形式是如何实现的?当然,最笨的办法就是自己写一个使用示例,然后把示例的源码复制粘贴到示例下面。当然这种方式对于后期的维护来说会很麻烦。更合理高效的做法是通过某种形式自动完成复制粘贴的过程。基本原理为webpack写一个loader,将Markdown格式的文档渲染成html;将其中的示例代码包装成一个单文件组件;将整个文档包装成一个单文件组件,将第2步中的示例代码包装成一个文件组件导入进来;利用loader的链式调用特性将这些处理结果传递给vue-loader。实现步骤第一步:将Markdown文件渲染成HTML这一步比较简单。你可以使用markdown-it直接将Markdown格式的文档渲染成HTML,然后用标签包裹起来。加载程序部分代码:constMarkdownIt=require('markdown-it')module.exports=function(mdFileString){constmd=newMarkdownIt({html:true,breaks:true})consthtml=md.render(mdFileString)}第二步:将文档的示例代码单独打包成一个【单文件组件】一般的文档都是用Markdown格式写的,Markdown格式的代码示例格式如下:```html代码示例```根据对于这个规则,我们可以通过常规方法提取代码块:module.exports=function(mdFileString){constcodeReg=newRegExp('```html\n(.|\n)*?\n```','g')constdemoCodes=mdFileString.match(codeReg)}然后将提取出来的代码块内容写入本地文件目录:constfs=require('fs')module.exports=function(mdFileString){constcodeReg=newRegExp('```html\n(.|\n)*?\n```','g')constdemoCodes=mdFileString.match(codeReg)for(letindex=0;index${html}

`;}很简单,我们只是将html包裹在普通单文件组件的标签中。如果细心的话,应该会发现上面还有两个我们没有提到的变量,分别是:importVuesString和components。这两个也很容易理解。在第2步中,我们将每个示例代码打包到一个单独的单文件组件中。这里我们需要将它们导入并注册到组件中。当然还有不足之处就是将我们分离出来的每个示例代码组件写在了中相应的位置。这一步不详述,主要是一些简单的逻辑。第四步:将处理结果交给vue-loader。我们处理的结果是返回一个单文件组件,其中导入了每个示例代码打包的单文件组件。然后我们通过webpack的配置把这些内容传递给vue-loader,相当于写了一个Markdown格式的文档,但是自动替换成一个vue组件,运行里面的示例代码,示例代码也展示出来了。其他细节1.其他实现方式及优缺点分析ElementUi文档的实现方式也是使用loader将Markdown格式的文档转换成vue单文件组件。不同的是ElementUi使用component-compiler-utils将示例代码直接编译成JavaScript并内联到主文档的单文件组件中。这样做的好处是不会生成额外的文件。缺点是实现逻辑比较复杂,相比本文的方法不够简洁。2.更加合理地放置示例代码生成的单文件组件和对应的源代码。第3步中有一个内容没有详述,就是如何将示例代码的单文件组件放置到主文档中。显然,示例代码的单文件组件应该放在对应示例代码的源代码旁边,以便用户在阅读示例代码时可以参考示例运行的结果。比较合理的做法是:samplecode
上面的做法是将示例代码的单文件组件和示例代码放在一个有两个slot的组件中,组件名可以通过loader的options传入。这样就可以实现类似于点击查看源码的交互体验。3.如何语法高亮使用highlight.js来高亮文档外部组件中的代码。4.选择性转换处理示例代码文档中的示例代码并不是所有的示例代码都需要经过上面这一系列的处理,但是从上面的第2步我们知道,以下格式的代码都已经处理过了:```html代码example```这里偷懒一点,我们只假装处理三个反引号+空格+html的示例代码,如果不想假装处理某段代码,只需要在反引号和html可以。当然,肯定有更合理的做法,这里不做讨论。5、Markdown渲染成HTML后的样式大家可以去github等网站拉一个Markdown渲染后的HTML代码样式表的样式表,然后根据情况修改。6.为Markdown添加更多自定义容器Markdown的原生格式有时过于单调,不符合需求。您可以通过markdown-it-container和相应的css添加更多自定义容器。相关项目基于以上原理的开源项目vue-markdown-loader,让你开箱即用。