让编写组件不因文档发愁

900 阅读4分钟

前两天想要尝试编写一个 React UI组件库进行练习,UI组件库必备的内容,就是文档的编写,而这也是重中之重。于是调研了一下前端社区 React 组件文档的一些解决方案。

react-docgen

image.png

react-docgen 是一个 CLI 和工具箱,可帮助从 React 组件中提取信息并从中生成文档。它使用 ast 类型和@ babel / parser 将源解析为 AST,并提供处理此 AST 的方法以提取所需的信息。输出/返回值是一个 JSON blob / JavaScript 对象。

官方提供的react中代码生成文档,并作为很多文档工具的底层依赖

组件内容

import React, { Component } from 'react';
import PropTypes from 'prop-types';

/**
 * General component description.
 */
class MyComponent extends Component {
  render() {
    // ...
  }
}

MyComponent.propTypes = {
  /**
   * Description of prop "foo".
   */
  foo: PropTypes.number.isRequired,
  /**
   * Description of prop "bar" (a custom validation function).
   */
  bar: function(props, propName, componentName) {
    // ...
  },
  baz: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
};

MyComponent.defaultProps = {
  bar: 21,
};

export default MyComponent;

抽离出的json

{
  "props": {
    "foo": {
      "type": {
        "name": "number"
      },
      "required": true,
      "description": "Description of prop \"foo\"."
    },
    "bar": {
      "type": {
        "name": "custom"
      },
      "required": false,
      "description": "Description of prop \"bar\" (a custom validation function).",
      "defaultValue": {
        "value": "21",
        "computed": false
      }
    },
    "baz": {
      "type": {
        "name": "union",
        "value": [
          {
            "name": "number"
          },
          {
            "name": "string"
          }
        ]
      },
      "required": false,
      "description": ""
    }
  },
  "description": "General component description."
}

效果图 image.png

Storybook

image.png

Storybook是一个开源工具,用于为React、Vue、Angular等独立开发UI组件。它使构建令人惊叹的ui有组织和高效。

优点:

  • 分开展示各个组件不同属性下的状态
  • 该工具适用于react、vue、angualar等
  • 能追踪组件的行为并且具有属性调试功能
  • 可以为组件自动生成文档和属性列表

效果图 image.png

Docz

image.png

Docz使你可以更轻松地为你的代码构建Gtabsy支持的文档网站。它基于MDX(Markdown + JSX),即利用markdown进行组件文档化。

Docz 的特色是零配置、简单、快速,它使用 Markdown 语法的扩展 MDX (在 Markdown 里引入 React 组件并渲染出组件)来书写文档,对于熟悉 Markdown 的开发者是可以直接上手的。 Docz使您能够快速创建实时重载,seo友好,生产就绪的文档网站与MDX和自定义的外观。

效果图 image.png

react-styleguidist

image.png

react-styleguidist是一个基于JSDOC可以帮助react项目快速构建项目文档的一个插件。

React Styleguidist使用react-decgen来解析源文件,react-decgen找到导出的React组件并根据PropTypes或Flow注释生成文档。

Styleguidist使用Markdown作为文档:我们使用CodeMirror将每个JavaScript代码块都会被渲染成一个交互式的playground,然后我们使用Remark提取所有代码块。

效果图 image.png

dumi

image.png

dumi是一款基于 Umi 打造、为组件开发场景而生的文档工具,与 father 一起为开发者提供一站式的组件开发体验,father 负责构建,而 dumi 负责组件开发及组件文档生成。

  • 📦 开箱即用,将注意力集中在组件开发和文档编写上
  • 📋 丰富的 Markdown 扩展,不止于渲染组件 demo
  • 🏷 基于 TypeScript 类型定义,自动生成组件 API
  • 🎨 主题轻松自定义,还可创建自己的 Markdown 组件
  • 📱 支持移动端组件库研发,内置移动端高清渲染方案
  • 📡 一行命令将组件资产数据化,与下游生产力工具串联

效果图 image.png

总结

以上只是部分解决方案,当然组件开发还可以使用如(Vuepress,Docusaurus)之类的文档静态渲染框架,但相比较来讲可能会有些复杂,

个人而言最终选择使用了Dumi,可以最大限度的减少配置,开箱即用UI风格也较为美观,也可以直接在markdown中引入组件,编写文档的组件案例只需要像用户一样,写一个简单demo即可,并内置了codesandbox可以直接打开调试,极大方便了开发人员使用,提升了效率。

如果项目文档需要较好的自定义建议使用Docz,使用mdx书写文档,不足之处也存在,就是需要在markdown中书写 JSX 组件,不是特别方便。

storybook 的方案使用了单独的 API 存在一些学习成本,以及使用时样式比较固定。

React Styleguidist使用react-decgen来解析源文件,组件文档的风格相对而言比较单一。