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函数的重载
Sep 22 Javascript
跨浏览器开发经验总结(四) 怎么写入剪贴板
May 13 Javascript
PHP中CURL的几个经典应用实例
Jan 23 Javascript
jQuery实现查找最近父节点的方法
Jun 23 Javascript
jQuery中的select操作详解
Nov 29 Javascript
浅析BootStrap中Modal(模态框)使用心得
Dec 24 Javascript
js制作可以延时消失的菜单
Jan 13 Javascript
JavaScript运动框架 多值运动(四)
May 18 Javascript
基于jquery实现五星好评
Nov 18 jQuery
微信小程序之分享页面如何返回首页的示例
Mar 28 Javascript
微信小程序自定义多列选择器使用详解
Jun 21 Javascript
JavaScript实现网页跨年倒计时
Dec 02 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
一个很方便的 XML 类!!原创的噢
2006/10/09 PHP
PHP入门学习的几个不错的实例代码
2008/07/13 PHP
phpmyadmin打开很慢的解决方法
2014/04/21 PHP
yii操作session实例简介
2014/07/31 PHP
基于PHP给大家讲解防刷票的一些技巧
2015/11/18 PHP
Symfony学习十分钟入门经典教程
2016/02/03 PHP
php cookie工作原理与实例详解
2016/07/18 PHP
CakePHP框架Model函数定义方法示例
2017/08/04 PHP
javascript与CSS复习(二)
2010/06/29 Javascript
JavaScript中window.showModalDialog()用法详解
2014/12/18 Javascript
Javascript闭包(Closure)详解
2015/05/05 Javascript
详解JavaScript时间格式化
2015/12/23 Javascript
JavaScript生成带有缩进的表格代码
2016/06/15 Javascript
JS实现简单的右下角弹出提示窗口完整实例
2016/06/21 Javascript
Angular2 (RC4) 路由与导航详解
2016/09/21 Javascript
微信小程序学习之数据处理详解
2017/07/05 Javascript
详解ES6之用let声明变量以及let loop机制
2017/07/15 Javascript
jQuery实现可编辑表格并生成json结果(实例代码)
2017/07/19 jQuery
vue-cli 自定义指令directive 添加验证滑块示例
2017/10/19 Javascript
利用nginx + node在阿里云部署https的步骤详解
2017/12/19 Javascript
详解小程序开发经验:多页面数据同步
2019/05/18 Javascript
关于vue属性使用和不使用冒号的区别说明
2020/10/22 Javascript
python通过正则查找微博@(at)用户的方法
2015/03/13 Python
用Python设计一个经典小游戏
2017/05/15 Python
Python2与Python3的区别实例总结
2019/04/17 Python
Python库skimage绘制二值图像代码实例
2020/04/10 Python
AmazeUI 输入框组的示例代码
2020/08/14 HTML / CSS
猫途鹰英国网站:TripAdvisor英国(旅游社区和旅游评论)
2016/08/30 全球购物
动物学专业毕业生求职信
2013/10/11 职场文书
人力资源主管岗位职责
2014/01/29 职场文书
个人公司授权委托书范本
2014/10/12 职场文书
小学教师求职信范文
2015/03/20 职场文书
因身体原因离职的辞职信范文
2015/05/12 职场文书
2015年教师见习期工作总结
2015/05/20 职场文书
Win11 Build 21996.1 Dev版怎么样? win11系统截图欣赏
2021/11/21 数码科技
CSS三大特性继承性、层叠性和优先级详解
2022/01/18 HTML / CSS