Markdown中嵌入vue语法并渲染

最近阅读了element-ui的源码才知道像这类UI库的官方说明文档都是用markdown写的.

改造webpack配置

const markdownRender = require('markdown-it')();
...
{
    test: /\.md$/,
    use: [
      {
          loader: 'vue-loader'
      },
      {
        loader: 'vue-markdown-loader/lib/markdown-compiler',
        options: { 
              raw: true,
              preventExtract: true,
             use: [
            [
                require('markdown-it-container'),
                'demo',
                {
                    validate: function(params) {
                        return params.trim().match(/^demo\s+(.*)$/);
                    },

                    render: function(tokens, idx) {
                        if (tokens[idx].nesting === 1) {
                            // 1.获取第一行的内容使用markdown渲染html作为组件的描述
                            let demoInfo = tokens[idx].info
                                .trim()
                                .match(/^demo\s+(.*)$/);
                            let description =
                                demoInfo && demoInfo.length > 1
                                    ? demoInfo[1]
                                    : '';
                            let descriptionHTML = description
                                ? markdownRender.render(description)
                                : '';
                            // 2.获取代码块内的html和js代码
                            let content = tokens[idx + 1].content;
                            // 3.使用自定义开发组件【DemoBlock】来包裹内容并且渲染成案例和代码示例
                            return `
            
${content}
${descriptionHTML}
`; } else { return '
\n'; } } } ] } }] }

添加demo-block.vue

用于包含markdown文件




引入并且全局注册

import DemoBlock from './demo-block/demo-block.vue';
Vue.component('demo-block', DemoBlock);

使用highlight.js高亮

import 'highlight.js/styles/color-brewer.css';  

定义router

import Vue from 'vue';
import VueRouter from 'vue-router';

Vue.use(VueRouter);

const router = new VueRouter({
    routes: [
        {
            path: '/button',
            name: 'button',
            title: 'Button 按钮',
            component: r =>
                require.ensure([], () => r(require('ui/docs/button.md')))
        }
    ]
});

export default router;

button.md

## Button 按钮

常用的操作按钮

### 基础用法 

按钮的基础用法

:::demo 通过`type`、`width`属性设置不同类型的按钮

```html

\```  (去除这个斜杠)

:::

### Attributes
| 参数      | 说明    | 类型      | 可选值       | 默认值   |
|--------|--------   |---------- |-------------  |-------- |
| type   | 类型      | string    |   success / warning / danger / |—    |
| name   | name属性  | string    | — | —   |
| id     | id属性    | string    | — | —   |
| width  | 按钮宽度   | string    | — | 100%   |

效果图

image.png

button.mdgithub上的展示效果

image.png

你可能感兴趣的:(Markdown中嵌入vue语法并渲染)