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学习笔记2 函数
Jan 11 Javascript
JavaScript Math.ceil() 函数使用介绍
Dec 11 Javascript
HTML中setCapture、releaseCapture 使用方法浅析
Sep 25 Javascript
使用Ajax与服务器(JSON)通信实例
Nov 04 Javascript
用JavaScript实现让浏览器停止载入页面的方法
Jan 19 Javascript
jQuery实现大图轮播
Feb 13 Javascript
微信小程序 开发之全局配置
May 05 Javascript
JS实现移动端按首字母检索城市列表附源码下载
Jul 05 Javascript
微信小程序云开发实现云数据库读写权限
May 17 Javascript
vue输入节流,避免实时请求接口的实例代码
Oct 30 Javascript
Javascript查看大图功能代码实现
May 07 Javascript
Vue项目开发常见问题和解决方案总结
Sep 11 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用数组返回无限分类的列表数据的代码
2010/08/08 PHP
php中curl和file_get_content的区别
2014/05/10 PHP
Yii学习总结之安装配置
2015/02/22 PHP
详解WordPress中创建和添加过滤器的相关PHP函数
2015/12/29 PHP
php 判断过去离现在几年的函数(实例代码)
2016/11/15 PHP
让你的PHP,APACHE,NGINX支持大文件上传
2021/03/09 PHP
javascript实现的listview效果
2007/04/28 Javascript
js判断数据类型如判断是否为数组是否为字符串等等
2014/01/15 Javascript
angularJS 中$scope方法使用指南
2015/02/09 Javascript
JavaScript中的some()方法使用详解
2015/06/09 Javascript
Javascript在IE和Firefox浏览器常见兼容性问题总结
2016/08/03 Javascript
jquery pagination分页插件使用详解(后台struts2)
2017/01/22 Javascript
js实现数组去重方法及效率?Ρ? target=
2017/02/14 Javascript
js按条件生成随机json:randomjson实现方法
2017/04/07 Javascript
一个有意思的鼠标点击文字特效jquery代码
2017/09/23 jQuery
JavaScript使用递归和循环实现阶乘的实例代码
2018/08/28 Javascript
element form 校验数组每一项实例代码
2019/10/10 Javascript
jQuery实现图片切换效果
2020/10/19 jQuery
Vue中使用wangeditor富文本编辑的问题
2021/02/07 Vue.js
[01:16:12]完美世界DOTA2联赛PWL S2 FTD vs Inki 第一场 11.21
2020/11/23 DOTA
让python json encode datetime类型
2010/12/28 Python
python海龟绘图实例教程
2014/07/24 Python
python排序方法实例分析
2015/04/30 Python
Python ldap实现登录实例代码
2016/09/30 Python
Python爬虫DNS解析缓存方法实例分析
2017/06/02 Python
django API 中接口的互相调用实例
2020/04/01 Python
Django生成数据库及添加用户报错解决方案
2020/10/09 Python
HTML5 Canvas之测试浏览器是否支持Canvas的方法
2015/01/01 HTML / CSS
波兰家具和室内装饰品购物网站:Vivre
2018/04/10 全球购物
宝拉珍选官方旗舰店:2%水杨酸精华液,收缩毛孔粗大和祛痘
2018/07/01 全球购物
国际商务专业学生个人的自我评价
2013/09/28 职场文书
党员党性分析材料
2014/02/17 职场文书
抄袭同学作业检讨书1000字
2014/11/20 职场文书
2015年社区流动人口工作总结
2015/05/12 职场文书
详解MySQL多版本并发控制机制(MVCC)源码
2021/06/23 MySQL
Android开发手册Chip监听及ChipGroup监听
2022/06/10 Java/Android