vue组件文档(.md)中如何自动导入示例(.vue)详解


Posted in Javascript onJanuary 25, 2019

症结(懒癌患者)

在写组件库文档的时候,会把示例代码粘贴到文档里,这样做有一个很恶心的地方:每次组件迭代或修改示例都需要重新修改文档中的代码片段。长年累月,苦不堪言。

猜想(狂想曲)

所以我想,可不可以把.vue文件里的template块和script块取出来,放入对应的.md文件中

比如在.md文件中 {{:xx.vue?type=(template|script)}} 便替换示例中对应的template|script块

# xx

## 示例代码

// {{:}} 定义变量规则模版(加个冒号防冲突)
{{:image.vue?type=template}} // 对应.vue 的template

{{:image.vue?type=script}} // 对应.vue 的template

{{:index.js}} // 对应index.js

## 参数说明

xxx...

output

# xx

## 示例代码

 
// image.vue template
<template>
 <div>xx</div>
</template>

// image.vue script
<script>
 ...
</script>

// index.js

var x = 1

## 参数说明

xxx...

动手(能动手绝不**)

要实现以上功能,需要探索以下几点:

  • 从.vue里取出template&script
  • 塞进对应的.md的变量位置
  • 将.md文件转为Vue Componet / html

如果按照我们写js的习惯,以下嵌套排列可能更易读

将.md文件转为Vue Componet / html

找到变量位置,塞进对应的.md的指定位置

从.vue里取出template&script

一步一步来吧:

1、将.md文件转为Vue Componet / html

要想在vue中使用.md文件为组件,只需要用loader将md转成Vue Componet即可。

这个过程很简单,以下为loader伪代码

const wrapper = content => `
<template>
 <section v-html="content" v-once />
</template>
<script>
export default {
 created() {
 this.content = content
 }
};
</script>
`
module.exports = function(source) { 
 // markdown 编译用的 markdown-it
 return wrapper(new MarkdownIt().render(source)) 
}

2、找到变量位置,塞进对应的.md的指定位置

1)找到变量位置

使用正则匹配定义的规则,找到被{{:}} 包围的字符串,如上例所示则为‘image.vue?type=template'

2)读取文件

如果是其他.js、.html等普通文件,直接使用fs.readFileSync读取替换即可,因是.vue,我们希望传入type来获取不同的块(template、script等)

const replaceResults = (template, baseDir) => { 
 const regexp = new RegExp("\\{\\{:([^\\}]+)\\}\\}", "g")
 return template.replace(regexp, function(match) {
 // 获取文件变量
 match = match.substr(3, match.length - 5)
 let [loadFile, query=''] = match.split('?')
 // 读取文件内容
 const source = fs.readFileSync(path.join(baseDir, loadFile), "utf-8").replace(/[\r\n]*$/, "") 
 if (path.extname(loadFile) === ".vue") { 
  let { type } = loaderUtils.parseQuery(`?${query}`) 
  return replaceVue(source, type) // 根据type提取.vue里的不同块
 }
 return source // 非.vue直接返回文件内容
 })
};

3、从.vue里取出template&script

const replaceVue = (source, type) => {
 const descriptor = templateCompiler.parseComponent(source)
 const lang = {
 template: 'html',
 script: 'javascript' //,
 // style: 'css'
 }
 return lang[type] && `
 \`\`\`${lang[type]}
 ${descriptor[type].content}
 \`\`\` 
 ` 
}

如若要取一个文件里的多个块,则需多次调用,考虑到我们的组件库场景,默认返回template和script(未使用type参数时),
对上面代码进行优化,一次性从.vue中取出多个块

// replaceVue(source, [type])
const replaceVue = (source, types = ['template', 'script']) => {
 const descriptor = templateCompiler.parseComponent(source)
 const lang = {
 template: 'html',
 script: 'javascript' //,
 // style: 'css'
 }
 return types.map(type => lang[type] && `
 \`\`\`${lang[type]}
 ${descriptor[type].content}
 \`\`\` 
 `).join('')
}

大功告成??! 那么,如何使用呢?

使用(给我小星星?)

安装

npm i vue-markd-loader -D

配置

rules: [{
 test: /\.md$/,
 use: [
  'vue-loader',
  {
  loader: 'vue-markd-loader',
  options: {
   replaceFiles: true , // 默认true, 是否将文件填充进md
   wrapper:true // 默认true,默认输出Vue Component ,false 时输出html片段 
  }
  }
 ]
 }]
// main.js 
import 'highlight.js/styles/github.css' // 可以使用任意喜欢的主题哟
import 'github-markdown-css'

其他

第一次撸webpack loader,如有不正确/不足的地方,欢迎指正。

  • 源代码git地址 (本地下载)
  • npm包地址

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
如何将JS的变量值传递给ASP变量
Dec 10 Javascript
js 一个关于图片onload加载的事
Nov 10 Javascript
JS根据浏览器窗口大小实时动态改变网页文字大小的方法
Feb 25 Javascript
实例详解ECMAScript5中新增的Array方法
Apr 05 Javascript
JavaScript高仿支付宝倒计时页面及代码实现
Oct 21 Javascript
Vue数据驱动模拟实现2
Jan 11 Javascript
JavaScript代码判断输入的字符串是否含有特殊字符和表情代码实例
Aug 17 Javascript
js使用generator函数同步执行ajax任务
Sep 05 Javascript
详解Vue中组件的缓存
Apr 20 Javascript
Vue+ElementUI项目使用webpack输出MPA的方法
Aug 27 Javascript
js实现整体缩放页面适配移动端
Mar 31 Javascript
JavaScript 判断浏览器是否是IE
Feb 19 Javascript
命令行批量截图Node脚本示例代码
Jan 25 #Javascript
Node.js 进程平滑离场剖析小结
Jan 24 #Javascript
Vue.js样式动态绑定实现小结
Jan 24 #Javascript
实例讲解JavaScript预编译流程
Jan 24 #Javascript
实例讲解vue源码架构
Jan 24 #Javascript
详解Node.js amqplib 连接 Rabbit MQ最佳实践
Jan 24 #Javascript
JavaScript私有变量实例详解
Jan 24 #Javascript
You might like
关于shopex同步ucenter的redirect问题,导致script不运行
2013/04/10 PHP
PHP的反射类ReflectionClass、ReflectionMethod使用实例
2014/08/05 PHP
mac环境中使用brew安装php5.5.15
2014/08/18 PHP
thinkphp在模型中自动完成session赋值示例代码
2014/09/09 PHP
Js-$.extend扩展方法使方法参数更灵活
2013/01/15 Javascript
一个JavaScript处理textarea中的字符成每一行实例
2014/09/22 Javascript
js中style.display=&quot;&quot;无效的解决方法
2014/10/30 Javascript
JQuery选择器、过滤器大整理
2015/05/26 Javascript
css如何让浮动元素水平居中
2015/08/07 Javascript
基于javascript代码实现通过点击图片显示原图片
2015/11/29 Javascript
jQuery实现table中的tr上下移动并保持序号不变的实例代码
2016/07/11 Javascript
初探js和简单隐藏效果的实例
2017/11/23 Javascript
Vue.js实现数据响应的方法
2018/08/13 Javascript
layer.confirm取消按钮绑定事件的方法
2018/08/17 Javascript
微信小程序新手教程之启动页的重要性
2019/03/03 Javascript
微信小程序用户拒绝授权的处理方法详解
2019/09/20 Javascript
JavaScript动画实例之粒子文本的实现方法详解
2020/07/28 Javascript
解决python写的windows服务不能启动的问题
2014/04/15 Python
python实现查找excel里某一列重复数据并且剔除后打印的方法
2015/05/26 Python
python复制列表时[:]和[::]之间有什么区别
2018/10/16 Python
python 弹窗提示警告框MessageBox的实例
2019/06/18 Python
Python通过Manager方式实现多个无关联进程共享数据的实现
2019/11/07 Python
Python3监控windows,linux系统的CPU、硬盘、内存使用率和各个端口的开启情况详细代码实例
2020/03/18 Python
django配置app中的静态文件步骤
2020/03/27 Python
使用Keras实现Tensor的相乘和相加代码
2020/06/18 Python
python脚本和网页有何区别
2020/07/02 Python
HTML5梦幻之旅——炫丽的流星雨效果实现过程
2013/08/06 HTML / CSS
MONNIER Frères英国官网:源自巴黎女士奢侈品配饰电商平台
2018/12/06 全球购物
北美主要的汽车零部件零售商:AutoShack.com
2019/02/23 全球购物
美国最大的烧烤架和户外生活用品专业零售商:Barbeques Galore
2021/01/09 全球购物
二年级体育教学反思
2014/01/15 职场文书
新娘父亲婚礼致辞
2014/01/16 职场文书
2014银行领导班子群众路线对照检查材料思想汇报
2014/09/17 职场文书
新生入学欢迎词
2015/01/26 职场文书
幼儿园母亲节活动总结
2015/02/10 职场文书
2015年评职称个人工作总结
2015/10/15 职场文书