书接上文。项目经过一系列的配置,开发脚手架已经搭建完毕。接下来开始封装自定义组件、并基于 markdown
文件生成文档和演示案例。
后续文章代码会根据篇幅,不影响理解的情况下进行部分删减,详细代码可在 Github Repo
查看。
接下来封装一个loading组件。
创建 packages/loading/src/main.vue
文件(篇幅问题,样式代码详见Github)。
创建 packages/loading/index.js
文件。使用 install
方法来全局注册该组件,安装组件通过全局方法 Vue.use()
即可。官网-Vue插件
创建 src/index.js
文件,该文件的作用:
在 examples/main.js
文件中引用组件库
在 examples/App.vue
中添加组件引用
页面效果如下
0x02.编写组件说明文档接下来基于 markdown
编写组件文档,能让示例代码像组件一样在页面中渲染。
markdown
文件的解析基于markdown-it
及其社区插件。
markdown-it
主要的解析器/渲染器。官方文档
markdown-it-anchor
生成标题锚点。官方文档
markdown-it-container
创建块级自定义容器的解析插件。官方文档
markdown-it-chain
支持链式调用 markdown-it 。官方文档
npm i -D markdown-it markdown-it-anchor markdown-it-container markdown-it-chain
其他核心插件
npm i -D transliteration // 汉字转拼音
自定义loader
项目将使用element的自定义loader,在源码目录 build\md-loader
创建文件,目录结构如下。
├─md-loader | ├─config.js | ├─containers.js | ├─fence.js | ├─index.js | └─util.js
index.js
文件是loader的入口文件,通过提取template 与 script 的内容,把 Markdown 转化成 Vue 组件。
config.js
文件使用 markdown-it-chain
配置markdown-it
选项、插件和容器信息,初始化markdown-it
实例。
containers.js
文件使用 markdown-it-container
来转换自定义容器,将自定义容器 :::demo
转换成 demo-block
组件。
fence.js
文件中重写了代码块(fence)默认渲染规则。
util.js
文件提供 stripScript
stripStyle
stripTemplate
genInlineComponentText
等方法用于页面内容提取和生成组件。
创建build/config.js
文件设置 webpack
公共配置信息。
更新 build\webpack.config.js
文件,添加自定义 md-loder
,实现 markdown
文件的解析。
编写组件说明文档examples\docs\loading.md
安装 vue-router
插件。
npm i -D vue-router
新增 examples/router.js
文件配置路由信息。
import Vue from 'vue'; import VueRouter from 'vue-router'; Vue.use(VueRouter); const routes = [ { path: '/', name: 'index', //使用vue的异步组件技术 , 可以实现按需加载 . component: (resolve) => require(['./components/HelloWorld.vue'], resolve), }, ]; routes.push({ path: '/test', name: 'test', component: (resolve) => require(['./docs/loading.md'], resolve), }); routes.push({ path: '/jsx', name: 'jsx', component: (resolve) => require(['./components/JSX.vue'], resolve), }); export default new VueRouter({ mode: 'hash', base: process.env.NODE_ENV !== 'production' ? '/' : '/me-ui', routes, });
调整 examples
目录下文档结构如下,详见源码。
├─examples | ├─App.vue | ├─main.js | ├─router.js | ├─docs | | └loading.md | ├─components | | ├─HelloWorld.vue | | └JSX.vue | ├─assets | | └logo.png
examples\main.js
引入路由,examples\App.vue
更新路由导航信息。
// main.js ... ... import router from './router'; ... new Vue({ router, render: (h) => h(App), }).$mount('#app'); // App.vue <template> <div id="app"> <div id="nav"> <router-link to="/">Home</router-link> | <router-link to="/jsx">JSX</router-link> | <router-link to="/test">loading组件</router-link> </div> <router-view /> </div> </template>
页面效果如下
上面的说明文档功能十分简陋,接下来编写 demo-block
组件,支持示例组件渲染、高亮代码等功能。
安装语法高亮插件 highlight.js
。
npm i -D highlight.js // 代码高亮
创建 examples\components\demo-block.vue
组件
examples\main.js
引入 highlight
插件、 demo-block
组件,配置语法高亮主题样式。增加 afterEach
全局后置钩子,高亮页面代码块。
组件说明文档 examples\docs\loading.md
更新成约定的文档格式。
运行程序,页面示例代码块渲染组件,可以展开收起源代码,语法高亮显示,效果如下:
0x03.示例代码Github Repo
0x04.参考Element 文档中的 Markdown 解析
element的demo-block
highlight 97种主题样式列表