ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

React Styleguidist 组件文档编写完全指南:从 JSDoc 注释到交互式 Playground

React Styleguidist 组件文档编写完全指南:从 JSDoc 注释到交互式 Playground React Styleguidist 组件文档编写完全指南从 JSDoc 注释到交互式 Playground【免费下载链接】react-styleguidistIsolated React component development environment with a living style guide项目地址: https://gitcode.com/gh_mirrors/re/react-styleguidistStyleguidistReact Styleguidist是一个活的 React 组件开发环境与风格指南工具它的核心能力之一就是从源码中自动生成组件文档。本指南以仓库中的 docs/Documenting.md 为主线系统讲解如何通过代码注释JSDoc、propTypes 声明、Readme 文件、doclet 标签与 Markdown 示例来编写高质量的组件文档并辅以仓库源码loader、props-loader、示例组件验证其底层原理。读完本文你将掌握 Styleguidist 文档生成的全部规则能写出带交互式 Playground、方法说明、props 表格与自定义标签的完整组件文档。Styleguidist 文档从哪来三大来源Styleguidist 生成组件文档依赖三类信息源码中的注释块JSDoc 格式——作为组件的整体说明文字propTypes 声明——自动解析并渲染为 props 表格Readme 文件Readme.md或ComponentName.md——作为使用示例与扩展说明其中的代码块会被渲染成交互式 Playground。这三类内容会由 props-loader 统一收集并序列化给前端渲染。在 src/loaders/props-loader.ts 中可以看到完整流程它调用react-docgen的parse解析源码把 props 转为数组并用sortProps排序再通过getExampleFilename(file)找到同目录的示例文件见 src/loaders/utils/getExamples.ts最后把docs对象写入 Webpack 模块导出。这意味着只要你按规范写好注释和示例文件文档会自动生成无需任何额外的手工维护。代码注释与 propTypes文档的基石在组件源码中使用 JSDoc 注释块描述组件整体在每个 prop 上方用/** ... */注释描述该 propStyleguidist 会把这些内容分别渲染为组件描述与 props 表格import React from react import PropTypes from prop-types /** * General component description in JSDoc format. Markdown is *supported*. */ export default class Button extends React.Component { static propTypes { /** Description of prop foo. */ foo: PropTypes.number, /** Description of prop baz. */ baz: PropTypes.oneOfType([PropTypes.number, PropTypes.string]) } static defaultProps { foo: 42 } render() { /* ... */ } }仓库中的真实示例与之一致examples/basic/src/components/Button/Button.js 里每个 prop 都带有单行 JSDoc 注释如/** The color for the button */同时声明了defaultProps与propTypes这些信息最终都会出现在风格指南的 props 表格中。需要了解的关键实现事实解析引擎组件的PropTypes与文档注释由 react-docgen 库解析。它只把源码当作静态文本读取不会真正执行 JavaScript 代码。Flow 与 TypeScriptFlow 和 TypeScript 类型注解同样受支持。可扩展钩子你可以通过配置项改变其行为——propsParser自定义解析函数、resolver自定义解析器详见 Configuration.md 中对应小节还可以用updateDocs函数在文档对象渲染前对其做修改。这些选项在 props-loader.ts 中都有直接的接入点config.propsParser || defaultParser、config.resolver、config.handlers(file)。提示文档正文与注释中均支持 Markdown 语法。使用示例与 Readme 文件交互式 PlaygroundStyleguidist 会在组件所在目录查找Readme.md或ComponentName.md文件并展示其内容。其中语言标签为js、jsx或javascript的代码块会被渲染为带编辑器的交互式 React Playground出于向后兼容没有语言标签的代码块同样按此方式渲染但官方建议新文档始终使用正确的语言标签。组件示例React component example: js Button sizelargePush Me/Button 你还可以为示例的外层包装元素传入自定义 props——通过在代码块头部追加 JSON 配置实现js { props: { className: checks } } ButtonI’m transparent!/Button 在同一个代码块内给多个示例之间添加间距使用padded修饰符jsx padded ButtonPush Me/Button ButtonClick Me/Button ButtonTap Me/Button 关闭编辑器只展示渲染结果使用noeditor修饰符jsx noeditor ButtonPush Me/Button 把示例仅渲染为高亮源码不渲染成组件、不提供编辑器使用static修饰符jsx static import React from react; 其他所有语言的代码块只渲染为高亮源码而不会被当作真实组件渲染html Button sizelargePush Me/Button 以上示例在仓库中有完整可运行的原型examples/basic/src/components/Button/Readme.md 逐一演示了padded、noeditor、static、JSON props 以及 HTML 高亮块的实际写法。修饰符与 JSON 参数是如何被解析的从源码看代码块头部语言标签之后的modifiers部分由 src/loaders/utils/parseExample.ts 解析若修饰符是纯空格分隔的字符串如padded、noeditor、static会被转换为{ padded: true }形式的设置对象否则尝试以 JSON 解析如{ props: { className: checks } }解析失败会返回带有Cannot parse modifiers ...的错误信息并附上文档链接最终设置对象的所有 key 会被统一转为小写lowercaseKeys保证Padded与padded等价。这条调用链说明修饰符本质上就是代码块头的附加设置理解它有助于你调试为什么我的示例行为不对这类问题。提示你可以通过 getExampleFilename 配置项自定义示例文件名。比如需要展示某段不应渲染成 Playground 的 JavaScript 代码可用js static组合例如js static。用exampledoclet 关联外部示例文件除了 Readme 文件你还可以通过exampledoclet 语法把额外的示例文件关联到组件上。下面这个组件除了自带文档外还会加载extra.examples.md中的示例/** * Component is described here. * * example ./extra.examples.md */ export default class Button extends React.Component { // ... }实现上src/loaders/utils/removeDoclets.ts 使用与 react-docgen 一致的 doclet 正则^(\w)(?:$|\s((?:^)*))/gim从注释文本中剥离example等 doclet而 getExamples.ts 负责解析example ./path形式的相对路径并生成require语句加载该示例文件。注意当配置了skipComponentsWithoutExample: true时组件仍然需要一份常规示例文件如Readme.md仅靠example是不够的。公开方法用public让方法进入文档默认情况下组件的方法都被视为私有方法不会出现在文档中。用 JSDoc 的public标签标记即可把方法发布到文档里/** * Insert text at cursor position. * * param {string} text * public */ insertAtCursor(text) { // ... }忽略 props用ignore从文档中移除属性与方法默认私有相反组件的所有 props 默认都是公开的、会被发布。在极少数情况下你希望某个 prop 保留在代码中但不出现在文档里可以在该 prop 的注释上标记ignoreMyComponent.propTypes { /** * A prop that should not be visible in the documentation. * * ignore */ hiddenProp: React.PropTypes.string }自定义组件名称用visibleName改变 UI 中的显示名用visibleNameJSDoc 标签定义组件在 Styleguidist 界面中显示的名称/** * The only true button. * * visibleName The Best Button Ever */ class Button extends React.Component {这样组件在风格指南中会显示为 The Best Button Ever 但不会改变组件在应用代码或示例中的真实名称示例中依然写Button。其他 JSDoc 标签丰富文档的语义信息组件、props 和方法都可以使用以下 JSDoc 标签deprecated——标记已废弃的 APIsee、link——关联参考文档或链接author——标注作者since——标注引入版本version——标注组件版本。为 props 编写文档时还可以额外使用param、arg、argument——描述函数型 prop 的参数。所有标签内容都可以渲染 Markdown。综合示例如下/** * The only true button. * * version 1.0.1 * author [Artem Sapegin](https://github.com/sapegin) * author [Andy Krings-Stern](https://github.com/ankri) */ class Button extends React.Component { static propTypes { /** * Button label. */ children: PropTypes.string.isRequired, /** * The color for the button * * see See [Wikipedia](https://en.wikipedia.org/wiki/Web_colors#HTML_color_names) for a list of color names * see See [MDN](https://developer.mozilla.org/en-US/docs/Web/CSS/color_value) for a list of color names */ color: PropTypes.string, /** * The size of the Button * * since Version 1.0.1 */ size: PropTypes.oneOf([small, normal, large]), /** * The width of the button * * deprecated Do not use! Use size instead! */ width: PropTypes.number, /** * Gets called when the user clicks on the button * * param {SyntheticEvent} event The react SyntheticEvent * param {Object} allProps All props of this Button */ onClick: PropTypes.func } }编写代码示例ES6 JSX 的写法与约定Markdown 中的代码示例使用 ES6 JSX 语法当前组件无需显式导入即可直接使用因为它会被注入到示例作用域中// jsx inside Button/Readme.md or Button.md ButtonPush Me/Button说明Styleguidist 在前端使用 Bublé 转译 ES6 代码它支持 ES6 的大部分特性部分新特性除外。要使用其他组件需要显式import// jsx inside Panel/Readme.md or Panel.md import Button from ../Button ;Panel p Using the Button component in the example of the Panel component: /p ButtonPush Me/Button /Panel也可以导入其他模块例如 mock 数据// jsx inside Markdown import mockData from ./mocks ;Message content{mockData.hello} /或者显式导入全部依赖让示例更容易直接复制进应用代码// jsx inside Markdown import React from react import Button from rsg-example/components/Button import Placeholder from rsg-example/components/Placeholder说明rsg-example模块是通过 moduleAliases 配置项定义的别名。仓库示例 examples/basic/styleguide.config.js 中就有实际定义rsg-example: path.resolve(__dirname, src)。注意import只能通过编辑 Markdown 文件来使用不能在浏览器中编辑示例代码时使用 import。每个示例都相当于一个函数组件因此可以直接使用 React Hooks例如useState// jsx inside Markdown const [isOpen, setIsOpen] React.useState(false) ;div button onClick{() setIsOpen(true)}Open/button Modal isOpen{isOpen} h1Hallo!/h1 button onClick{() setIsOpen(false)}Close/button /Modal /div仓库中的 Button Readme 给出了多个可直接运行的 Hook 示例包括用useState(42)设置初始计数再通过点击更新的用法。如果组件依赖 React Context你需要在示例中提供 context provider或通过自定义Wrapper组件统一注入参见仓库 examples/sections/src/components/ThemeButton 的写法。提示当演示逻辑较复杂时建议把它定义到独立的 JavaScript 文件中再在 Markdown 里import进来这样既保持文档简洁也便于复用和调试。局限性与解决思路在某些情况下Styleguidist 可能无法理解你的组件例如组件是动态生成的、被高阶组件包裹、或拆分为多个文件时静态解析的 react-docgen 可能解析失败。仓库的 docs/Thirdparties.md 提供了系统的解决方案包括同时导出基础组件命名导出 增强组件默认导出让 react-docgen 从基础组件生成文档对第三方库Redux、Relay、styled-components、Emotion、Styletron 等接入Wrapper组件或propsParser的配置方法使用react-docgen-typescript增强 TypeScript 组件的 props 解析。总结Styleguidist 的组件文档体系可以概括为一条规则写注释写 Readme剩下的交给工具。你只需在源码中维护好 JSDoc 注释、propTypes 与Readme.md/ComponentName.md示例文件再用example、public、ignore、visibleName等 doclet 标签微调文档行为就能得到一份包含组件说明、props 表格、公共方法与可交互 Playground 的完整风格指南。深入阅读 props-loader.ts 与 parseExample.ts 的实现还能帮你排查解析失败、修饰符不生效等实际问题让组件文档的产出完全可控。【免费下载链接】react-styleguidistIsolated React component development environment with a living style guide项目地址: https://gitcode.com/gh_mirrors/re/react-styleguidist创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表