zoukankan      html  css  js  c++  java
  • 使用dumi生成react组件库文档并发布到github pages

    周末两天玩了下号称西湖区东半球最牛逼的react文档站点生成工具dumi,顺带结合github pages生成了react-uni-comps文档站, 一套弄下来,感觉真香,现在还只是浅尝,高级的特性还没玩完,文档还需继续打磨完整,不知道是不是东半球最牛逼,西湖全区应该无与伦比了 ,下面是当前文档站移动端和pc端预览截图(整套弄下来花了半天时间!)

    桌面端效果(手机界面模拟/桌面端效果/自动根据ts生成的API表格文档)

    page-mobile.png

    page-pc.png

    sig.png

    手机效果(支持light/dark主题)

    mobile-light.png

    mobile-dark.png

    文档站点制作步骤如下:

    1. 安装 dumi 和移动端主题 dumi-theme-mobile
     yarn add -D dumi dumi-theme-mobile
    
    1. 添加配置文件.umirc.ts,下面是我的配置
    import { defineConfig } from 'dumi';
    
    const repo = 'react-uni-comps';
    
    const logo =
      'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9Ii0xMS41IC0xMC4yMzE3NCAyMyAyMC40NjM0OCI+CiAgPHRpdGxlPlJlYWN0IExvZ288L3RpdGxlPgogIDxjaXJjbGUgY3g9IjAiIGN5PSIwIiByPSIyLjA1IiBmaWxsPSIjNjFkYWZiIi8+CiAgPGcgc3Ryb2tlPSIjNjFkYWZiIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiPgogICAgPGVsbGlwc2Ugcng9IjExIiByeT0iNC4yIi8+CiAgICA8ZWxsaXBzZSByeD0iMTEiIHJ5PSI0LjIiIHRyYW5zZm9ybT0icm90YXRlKDYwKSIvPgogICAgPGVsbGlwc2Ugcng9IjExIiByeT0iNC4yIiB0cmFuc2Zvcm09InJvdGF0ZSgxMjApIi8+CiAgPC9nPgo8L3N2Zz4K';
    
    export default defineConfig({
      title: repo,
      favicon: logo,
      logo: logo,
      outputPath: 'docs',
      mode: 'doc',
      resolve: {
        // 配置 dumi 嗅探的文档目录
        includes: ['mdx'],
      },
      hash: true,
      // 使用 webpack 5进行构建。
      webpack5: {},
      // 通过 [webpack-chain](https://github.com/mozilla-neutrino/webpack-chain) 的 API 修改 webpack 配置。
      chainWebpack(memo, { env, webpack, createCSSRule }) {
        memo.cache = {
          type: 'filesystem',
          name: 'dumi',
          buildDependencies: {
            config: [__filename],
          },
          store: 'pack',
        };
        memo.plugins.delete('friendly-error');
        memo.plugins.delete('copy');
      },
      // github page
      base: `/${repo}/`,
      publicPath: `/${repo}/`,
      // 自定义样式
      styles: [
        `
        #root .__dumi-default-menu-header p {
          display:none;
        }
        #root .__dumi-default-menu-header h1 {
          font-size: 24px;
          margin: 16px auto;
        }
        `,
      ],
      themeConfig: {
        carrier: '中国移动',
        hd: {
          // 禁用高清方案
          rules: [],
          // 更多 rule 配置访问 https://github.com/umijs/dumi/blob/master/packages/theme-mobile/src/typings/config.d.ts#L7
        },
      },
    });
    
    
    1. 编写组件文档,以/mdx/Button.md举例子, 我把文档放在了mdx目录,因为github pages需要使用docs目录
    ---
    title: 按钮
    order: 0
    mobile: true
    group:
      title: 基础组件
      order: 0
      path: base
    ---
    
    <code src="../demo/Button.jsx"></code>
    <API src="../src/Button.tsx"></API>
    
    
    1. 因为组件比较多,我这里markdown文档通过ejs动态生成,当组件api/demo更新时,可以自动更新文档,无需手工维护
     // 数据配置
     module.exports = [
      {
        title: '基础组件',
        path: 'base',
        comps: [
          {
            name: 'Button',
            title: '按钮',
          },
          {
            name: 'Icon',
            title: '图标',
          },
        ],
        ........
      },
    ];
    // 文档生成
    
    /* eslint-disable @typescript-eslint/no-var-requires */
    const ejs = require('ejs');
    const data = require('./doc-data');
    const path = require('path');
    const fs = require('fs');
    
    const tpl = `---
    title: <%= title %>
    order: <%= order %>
    mobile: <%= mobile %>
    group:
      title: <%= groupTitle %>
      order: <%= groupOrder %>
      path: <%= groupPath %>
    ---
    
    <code src="../demo/<%= name %>.jsx"></code>
    <API src="../src/<%= name %>.tsx"></API>
    `;
    
    data.map((group, idx) => {
      group.comps.map((item, subIdx) => {
        item.order = subIdx;
        item.groupOrder = idx;
        item.groupPath = group.path;
        item.groupTitle = group.title;
        item.mobile = typeof item.mobile === 'boolean' ? item.mobile : true;
    
        const fileName = path.resolve(__dirname, `./mdx/${item.name}.md`);
    
        if (fs.existsSync(fileName)) {
          fs.unlinkSync(fileName);
        }
    
        fs.writeFileSync(path.resolve(__dirname, `./mdx/${item.name}.md`), ejs.render(tpl, item));
      });
    });
    
    
    1. 开发构建
    开发命令: dumi dev 
    开发命令: dumi build 
    
    1. 配置github pages

    点击项目settings->左边的Pages一栏, 设置Source, 我这里选择master分支, /docs目录托管构建的文档站,点击save保存, 然后打开上面他告之的github pages链接即可预览

    github.png

  • 相关阅读:
    【JVM基础】JVM垃圾回收机制算法
    【java基础】- java双亲委派机制
    Java基础(一)
    JVM
    冷知识: 不会出现OutOfMemoryError的内存区域
    疯狂Java:突破程序员基本功的16课-李刚编著 学习笔记(未完待续)
    nor flash之写保护
    spinor/spinand flash之高频通信延迟采样
    nor flash之频率限制
    使用littlefs-fuse在PC端调试littlefs文件系统
  • 原文地址:https://www.cnblogs.com/leonwang/p/15646295.html
Copyright © 2011-2022 走看看