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 相关文章推荐
Javascript 学习书 推荐
Jun 13 Javascript
extjs grid设置某列背景颜色和字体颜色的实现方法
Sep 06 Javascript
Jquery的hover方法让鼠标经过li时背景变色
Sep 06 Javascript
JS数组的遍历方式for循环与for...in
Jul 31 Javascript
js实现按一下删除键删除整个单词附demo
Sep 05 Javascript
jQuery EasyUI实现右键菜单变灰不可用效果
Sep 24 Javascript
Javascript基础_标记文字的实现方法
Jun 14 Javascript
从零学习node.js之详解异步控制工具async(八)
Feb 27 Javascript
jquery submit()不能提交表单的解决方法
Apr 24 jQuery
在vue中使用公共过滤器filter的方法
Jun 26 Javascript
原生js实现贪吃蛇游戏
Oct 26 Javascript
vue 实现弹窗关闭后刷新效果
Apr 08 Vue.js
命令行批量截图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
动易数据转成dedecms的php程序
2007/04/07 PHP
JS实现金额转换(将输入的阿拉伯数字)转换成中文的实现代码
2013/09/30 Javascript
JavaScript 浏览器兼容性总结及常用浏览器兼容性分析
2016/03/30 Javascript
使用jquery提交form表单并自定义action的实现代码
2016/05/25 Javascript
JS中mouseover和mouseout多次触发问题如何解决
2016/06/06 Javascript
Angular2内置指令NgFor和NgIf详解
2016/08/03 Javascript
实现隔行换色效果的两种方式【实用】
2016/11/27 Javascript
AngularJS指令与指令之间的交互功能示例
2016/12/14 Javascript
微信小程序封装的HTTP请求示例【附升级版】
2019/05/11 Javascript
vue 路由子组件created和mounted不起作用的解决方法
2019/11/05 Javascript
jquery ajax 请求小技巧实例分析
2019/11/11 jQuery
node koa2 ssr项目搭建的方法步骤
2020/12/11 Javascript
[02:53]DOTA2英雄昆卡基础教程
2013/11/25 DOTA
python 中的列表解析和生成表达式
2011/03/10 Python
Python下rrdtool模块的基本使用方法
2015/11/13 Python
老生常谈python函数参数的区别(必看篇)
2017/05/29 Python
python实现拓扑排序的基本教程
2018/03/11 Python
django框架用户权限中的session缓存到redis中的方法
2019/08/06 Python
python连接PostgreSQL数据库的过程详解
2019/09/18 Python
安装2019Pycharm最新版本的教程详解
2019/10/22 Python
python3 tkinter实现添加图片和文本
2019/11/26 Python
IDLE下Python文件编辑和运行操作
2020/04/25 Python
基于MUI框架使用HTML5实现的二维码扫描功能
2018/03/01 HTML / CSS
巴西男士胡须和头发护理产品商店:Beard
2017/11/13 全球购物
路德维希•贝克(LUDWIG BECK)中文官网:德国大型美妆百货
2020/09/19 全球购物
比较基础的php面试题及答案-编程题
2012/10/14 面试题
C#软件工程师英语面试题
2015/06/07 面试题
英文自我鉴定
2013/12/10 职场文书
应届本科生推荐信范文
2013/12/25 职场文书
办理信用卡工作证明
2014/01/11 职场文书
教师节感恩老师演讲稿
2014/08/28 职场文书
党员自我评议个人对照检查材料
2014/09/16 职场文书
党员学习新党章思想汇报
2014/10/25 职场文书
2015年初中元旦晚会活动总结
2014/11/28 职场文书
cf战队宣传语
2015/07/13 职场文书
MySQL系列之一 MariaDB-server安装
2021/07/02 MySQL