vue3 + vite npm 组件库开发(三)

vue3 + vite npm 组件库开发(三)

组件库编写文档可能会用到很多的demo,很多的情况下,手动去引入太繁琐,如下图:

image-20230302172319639

image-20230302172121237

textarea组件下doc有很多的demo,那我就要在index.md文件中全部引入

编写一个脚本去实现自动生成index.md文件

本来想使用python去编写,但是都在相同环境下,就直接使用node了,相对要复杂一点,但也是node语法,逻辑都很简单

逻辑分析

  1. 检索packages目录下的所以组件,如果doc下面不存在index,md,这个组件的文档就需要初始化,存在就不用管它。
  2. 根据doc下面的vue文件去生成对应的组件文档,有多少个vue dome就导入多少个,最后在导入一个显示代码的组件即可
  3. 设置dome 文件的命名规则,可以单个单词,也可以用短横线-去连接,驼峰命名也可

脚本代码

在项目根目录创建一个js文件create-comp-md.js

代码如下:

const fs = require("fs");

// directory path
const dir = "./packages/";

// script 中的代码
let str = "";

// 导入组件的使用代码
let str1 = "";

// list all files in the directory
fs.readdir(dir, (err, files) => {
  if (err) {
    throw err;
  }
  // files object contains all files names
  // log them on console
  // 循环packages下面的文件
  files.forEach((file) => {
    fs.stat(dir + file, function (err, stats) {
      // true || false 判断是不是文件夹,文件夹就是doc目录,也可以直接去读取doc下的文件
      if (stats.isDirectory()) {
        fs.readdir(dir + file + "/doc/", (err, Dfiles) => {
          if (err) {
            throw err;
          }
          // 判断是否存在'index.md'文件,不存在就去生成
          if (!Dfiles.includes("index.md")) {
            Dfiles.forEach((item) => {
              console.log("item", item);
              // 判断是否是vue文件,vue文件才去导入
              let vueFName = item.split(".");
              if (vueFName[1] === "vue") {
                // 处理导入的组件名称
                // 没有-连接符就直接使用文件名,有-需要转成驼峰例如 demo-text->demoText
                let compName = "";
                if (item.indexOf("-") !== -1) {
                  let items = vueFName[0].split("-");
                  console.log(items);
                  compName =
                    items[0] +
                    items[1].slice(0, 1).toUpperCase() +
                    items[1].slice(1).split(".")[0];
                } else {
                  compName = item.split(".")[0];
                }
				// 设置要生成的字符串
                str += `\n  import ${compName} from "./${item}"`;
                str1 += `\n<${compName} />\n<pre-view compName="${file}" vueFName="${
                  vueFName[0]
                }" />\n`;
              }
            });
            // 2段字符串拼接
            str =
              `# ${
                file.slice(0, 1).toUpperCase() + file.slice(1)
              } 组件\n<script setup>` +
              str +
              `\n  import preView from "@/components/preview/preview.vue"` +
              `\n</script>`;

            // 生成md文件并写入
            fs.writeFile(
              dir + file + "/doc/" + `index.md`,
              str + str1,
              function (err) {
                if (err) {
                  throw err;
                }
                console.log("write over");
              }
            );
            console.log(str + str1);
          }
        });
      }
    });
  });
});

测试脚本

packages 下新建

image-20230302175046024

执行脚本 node ./create-comp-md.js doc下会生成index.md文件,查看文件是否生成正确

# Test 组件
<script setup>
  import demoTest from "./demo-test.vue"
  import demo from "./demo.vue"
  import demoStr from "./demoStr.vue"
  import preView from "@/components/preview/preview.vue"
</script>
<demoTest />
<pre-view compName="test" vueFName="demo-test" />

<demo />
<pre-view compName="test" vueFName="demo" />

<demoStr />
<pre-view compName="test" vueFName="demoStr" />

再配置路由显示即可

image-20230302175737913

页面正常渲染

总结

我们只需要去关注.vue demo 文件即可,每次开发完组件执行就行了,然会再去编写文档,就不用去导入组件耗费时间

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值