最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • vite插件,实现将markdown转成vue组件

    正文概述 掘金(隔壁wang)   2021-04-11   1169

    前言

    我们在开发库或者文档系统的时候,希望能够直接将编写的markdown作为组件的内容,目前多数博客提供的解决方案要干两个事

    1. 利用markdown的解析库将md解析成html内容
    2. 在业务中编写一个组件将前一步解析出的html文本作为v-html属性的值

    那么问题来了,这个承载markdown的组件作用仅仅是提供了插入html文本的容器,而你需要在业务里编写,即便提出到组件库,也需要进行导入和使用,可以说是事倍功半。

    所以我们希望能够将编写的md文件直接导入成可使用的组件,比如:

    <template>
      <Start />
    </template>
    <script>
    import { defineComponent } from 'vue';
    import Start from 'docs/start.md';
    export default defineComponent({  
        name: 'App', 
        components: { Start },
    })
    </script>
    

    也就是插件需要把前面所提到的两件事都干完,输出一个vue组件。

    实现

    理清需求

    遇到markdown文件,将内容解析成html,利用vue渲染函数的api编写代码,将html内容插入,最终输出整个代码

    解析markdown文件

    我们采用marked库对markdown文件做解析,所以先安装

    yarn add marked
    

    vite插件

    vite插件的使用和基本api可以直接看中文文档,这里不做赘述,直接看实现。

    拦截markdown文件我们利用的是transform,意思是转换,功能类似webpack的loader,基本结构代码如下:

    // /plugins/vite-plugin-md2vue.js
    
    const marked = require('marked')
    
    export default function (options) {
      return {
        name: 'vitePluginMd2Vue',
        transform(src, id) {
          /**
          * id是导入的文件路径
          * src是导入的文件内容
          */
          if (id.endsWith(".md")) { // 判断结尾字符串判断是否为markdown文件
            return {
              code: ``, // code是转换后最终输出的代码
              map: null // 是否提供source map,这里可以不用考虑
            }
          }
        }
      }
    }
    

    code中我们需要编写组件代码,但是这里不能使用sfc也就是单文件组件的形式去写,因为vite中会专门拦截.vue结尾的文件去做解析,如果我们直接导出sfc形式的代码,就没有走vite中的解析流程导致报错,所以我们直接编写渲染函数,代码如下:

    import {h, defineComponent} from "vue";
    const _sfc_md = defineComponent({
        name: "Markdown",
    });
    
    const _sfc_render =() => {
        return h("div", {
          // 这里赋值解析好的markdown内容,marked是上一段代码中导入的解析库
          // src也是上一段代码中md文件的导入内容,我们直接解析后转成字符串
          innerHTML: ${JSON.stringify(marked(src))}, 
        })
    };
    
    _sfc_md.render = _sfc_render
    export default _sfc_md
    

    最终合成代码如下:

    // /plugins/vite-plugin-md2vue.js
    
    const marked = require('marked')
    
    export default function (options) {
      return {
        name: 'vitePluginMd2Vue',
        transform(src, id) {
          if (id.endsWith(".md")) {
            return {
              code: `import {h, defineComponent} from "vue";
                    const _sfc_md = defineComponent({
                        name: "Markdown",
                    });
    
                    const _sfc_render =() => {
                        return h("div", {
                          innerHTML: ${JSON.stringify(marked(src))}, 
                        })
                    };
    
                    _sfc_md.render = _sfc_render
                    export default _sfc_md`,
              map: null
            }
          }
        }
      }
    }
    

    使用插件

    vite.config.js使用插件,代码如下:

    import { defineConfig } from "vite";
    import vue from "@vitejs/plugin-vue";
    import vitePluginMd2Vue from "./plugins/vite-plugin-md2vue";
    
    // https://vitejs.dev/config/
    export default defineConfig({
      plugins: [vue(), vitePluginMd2Vue()],
      ...
    });
    

    最终实现的代码在vite-plugin-md2vue


    起源地下载网 » vite插件,实现将markdown转成vue组件

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元