前两天想要尝试编写一个 React UI组件库进行练习,UI组件库必备的内容,就是文档的编写,而这也是重中之重。于是调研了一下前端社区 React 组件文档的一些解决方案。
react-docgen
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."
}
效果图
Storybook
Storybook是一个开源工具,用于为React、Vue、Angular等独立开发UI组件。它使构建令人惊叹的ui有组织和高效。
优点:
- 分开展示各个组件不同属性下的状态
- 该工具适用于react、vue、angualar等
- 能追踪组件的行为并且具有属性调试功能
- 可以为组件自动生成文档和属性列表
效果图
Docz
Docz使你可以更轻松地为你的代码构建Gtabsy支持的文档网站。它基于MDX(Markdown + JSX),即利用markdown进行组件文档化。
Docz 的特色是零配置、简单、快速,它使用 Markdown 语法的扩展 MDX (在 Markdown 里引入 React 组件并渲染出组件)来书写文档,对于熟悉 Markdown 的开发者是可以直接上手的。 Docz使您能够快速创建实时重载,seo友好,生产就绪的文档网站与MDX和自定义的外观。
效果图
react-styleguidist
react-styleguidist是一个基于JSDOC可以帮助react项目快速构建项目文档的一个插件。
React Styleguidist使用react-decgen来解析源文件,react-decgen找到导出的React组件并根据PropTypes或Flow注释生成文档。
Styleguidist使用Markdown作为文档:我们使用CodeMirror将每个JavaScript代码块都会被渲染成一个交互式的playground,然后我们使用Remark提取所有代码块。
效果图
dumi
dumi是一款基于 Umi 打造、为组件开发场景而生的文档工具,与 father 一起为开发者提供一站式的组件开发体验,father 负责构建,而 dumi 负责组件开发及组件文档生成。
- 📦 开箱即用,将注意力集中在组件开发和文档编写上
- 📋 丰富的 Markdown 扩展,不止于渲染组件 demo
- 🏷 基于 TypeScript 类型定义,自动生成组件 API
- 🎨 主题轻松自定义,还可创建自己的 Markdown 组件
- 📱 支持移动端组件库研发,内置移动端高清渲染方案
- 📡 一行命令将组件资产数据化,与下游生产力工具串联
效果图
总结
以上只是部分解决方案,当然组件开发还可以使用如(Vuepress,Docusaurus)之类的文档静态渲染框架,但相比较来讲可能会有些复杂,
个人而言最终选择使用了Dumi,可以最大限度的减少配置,开箱即用UI风格也较为美观,也可以直接在markdown中引入组件,编写文档的组件案例只需要像用户一样,写一个简单demo即可,并内置了codesandbox可以直接打开调试,极大方便了开发人员使用,提升了效率。
如果项目文档需要较好的自定义建议使用Docz,使用mdx书写文档,不足之处也存在,就是需要在markdown中书写 JSX 组件,不是特别方便。
storybook 的方案使用了单独的 API 存在一些学习成本,以及使用时样式比较固定。
React Styleguidist使用react-decgen来解析源文件,组件文档的风格相对而言比较单一。