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 相关文章推荐
HTML页面如何象ASP一样接受参数
Feb 07 Javascript
JS注册/移除事件处理程序(ExtJS应用程序设计实战)
May 07 Javascript
JavaScript严格模式详解
Nov 18 Javascript
Vue.js报错Failed to resolve filter问题的解决方法
May 25 Javascript
javascript insertAfter()定义与用法示例
Jul 25 Javascript
Bootstrap基本组件学习笔记之列表组(11)
Dec 07 Javascript
JS实现随机颜色的3种方法与颜色格式的转化
Jan 05 Javascript
详解vue axios中文文档
Sep 12 Javascript
js Dom实现换肤效果
Oct 21 Javascript
JS实现字符串中去除指定子字符串方法分析
May 17 Javascript
详解在vue-cli中使用graphql即vue-apollo的用法
Sep 08 Javascript
JS控制只能输入数字并且最多允许小数点两位
Nov 24 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
PHP中strtr与str_replace函数运行性能简单测试示例
2019/06/22 PHP
PHP Beanstalkd消息队列的安装与使用方法实例详解
2020/02/21 PHP
Zero Clipboard js+swf实现的复制功能使用方法
2010/03/07 Javascript
收集的一些Array及String原型对象的扩展实现代码
2010/12/05 Javascript
JQuery获取文本框中字符长度的代码
2011/09/29 Javascript
jquery动画1.加载指示器
2012/08/24 Javascript
jquery实现图片等比例缩放以及max-width在ie中不兼容解决
2013/03/21 Javascript
ie与ff下的event事件使用介绍
2013/11/25 Javascript
jquery form 加载数据示例
2014/04/21 Javascript
Jquery ajax请求导出Excel表格的实现代码
2016/06/08 Javascript
Javascript实现页面滚动时导航智能定位
2017/05/06 Javascript
通过一次报错详细谈谈Point事件
2018/05/17 Javascript
微信小程序绘制图片发送朋友圈
2019/07/25 Javascript
vue+render+jsx实现可编辑动态多级表头table的实例代码
2020/04/01 Javascript
JavaScript实现图片伪异步上传过程解析
2020/04/10 Javascript
详解Vue.js 可拖放文本框组件的使用
2021/03/03 Vue.js
[36:29]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 LGD vs TNC
2018/04/02 DOTA
python利用hook技术破解https的实例代码
2013/03/25 Python
python查找指定具有相同内容文件的方法
2015/06/28 Python
Python 如何访问外围作用域中的变量
2016/09/11 Python
基于Python的接口测试框架实例
2016/11/04 Python
利用aardio给python编写图形界面
2017/08/21 Python
从请求到响应过程中django都做了哪些处理
2018/08/01 Python
python基于property()函数定义属性
2020/01/22 Python
Python中flatten( ),matrix.A用法说明
2020/07/05 Python
使用HTML5的Canvas绘制曲线的简单方法
2015/09/08 HTML / CSS
html5给汉字加拼音加进度条的实现代码
2020/04/07 HTML / CSS
阿迪达斯印尼官方网站:adidas印尼
2020/02/10 全球购物
农村葬礼主持词
2014/03/31 职场文书
学校爱心捐款倡议书
2014/05/13 职场文书
大学生求职信
2014/06/17 职场文书
优秀三好学生事迹材料
2014/08/31 职场文书
试用期自我评价怎么写
2015/03/10 职场文书
2016公司年会通知范文
2015/04/25 职场文书
植树节新闻稿
2015/07/17 职场文书
导游词之河北野三坡
2019/12/11 职场文书