ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

React Native Elements 文档自动生成工作流:从组件源码到 Docusaurus 站点的全链路解析

React Native Elements 文档自动生成工作流:从组件源码到 Docusaurus 站点的全链路解析 React Native Elements 文档自动生成工作流从组件源码到 Docusaurus 站点的全链路解析【免费下载链接】react-native-elementsCross-Platform React Native UI Toolkit项目地址: https://gitcode.com/gh_mirrors/re/react-native-elements导读本文以 React Native Elements 仓库Cross-Platform React Native UI Toolkit的文档自动生成工作流为主线完整讲解其“从组件 TypeScript 源码解析 props → 生成 JSON → 渲染为 Markdown/MDX → 推送到 Docusaurus 网站”的两阶段流水线设计。读完本文你将掌握如何通过react-docgen-typescript与json2md机制自动产出组件文档、如何为现有组件或全新组件无缝接入该流程、如何编写组件 demo含 Snack Player以及如何本地验证文档生成结果从而在贡献组件代码时无需再手动维护任何 Markdown 文档。为什么需要文档自动生成在自动生成工作流出现之前React Native Elements 网站的组件文档完全依赖人工维护贡献者需要进入 website/docs 目录手动编辑 Markdown 文件每新增一个 prop、每调整一次组件描述都要同步修改文档。这不仅枯燥而且极易出现文档与代码脱节的问题。为此仓库引入了一套自动化脚本位于 scripts/docgen由脚本解析组件源码并自动产出文档。其目标是让开发者与贡献者把精力聚焦在组件逻辑上而不是 Markdown 写作上。正如仓库根目录 package.json 中定义的那样docs-build一键串联“解析组件 构建站点”两个阶段。核心工作流两阶段流水线整个自动生成过程分为两个阶段对应两个关键依赖库阶段一react-docgen-typescript解析源码产出 JSON脚本以要生成文档的组件文件为输入调用react-docgen-typescript进行解析输出一份 JSON。这份 JSON 完整描述了组件的 props 细节包括typeprop 的类型nameprop 的名称descriptionprop 的描述来自源码中的注释defaultValueprop 的默认值组件本身的description来自组件顶部的注释阶段二json2md将 JSON 转为 Markdown 字符串由于文档网站基于 Docusaurus页面必须使用 Markdown 格式因此需要一个中间环节把阶段一产出的 JSON 转换成合适的 Markdown 字符串。脚本使用json2md完成转换并将结果写入website/docs对应目录最终呈现在网站上。从当前仓库的实际实现看第二阶段已演进为更精细的 MDX 模板渲染流程见下文“源码级实现”一节其设计思想与文档描述完全一致。源码级实现docgen 脚本的解剖尽管文档写作于 2021 年当前仓库中的实现已迁移到scripts/docgen目录Yarn workspace 包rneui/doc-gen但其核心架构正是文档所描述的两阶段流水线的落地版本。理解这些源码有助于贡献者把握整个流程的细节。入口与调用链入口脚本 scripts/docgen/src/index.ts 的调用链如下使用fast-glob按source通配符扫描组件文件默认*/src/**/*.tsx指向packages下的base与themed两个包通过findIgnoredComponents收集.docgenignore中排除的文件并统一追加**/*.usage.tsxdemo 文件不参与 props 解析调用docgenParser.parse(filePaths)得到组件文档 JSON通过separateParent整理“继承父组件 props”的关系逐个实例化Component类并调用generate()最终写出.mdx文件。包级构建命令定义在 scripts/docgen/package.json# 仅运行文档解析与生成 yarn workspace rneui/doc-gen build # 或使用根目录快捷命令 yarn docs-build-api更完整的构建入口是根目录 package.json 中的# 先解析生成文档再构建 Docusaurus 站点 yarn docs-builddocgen还支持两种灵活的调用方式见 scripts/docgen/README.md# 方式一按源码 glob 通配符指定 yarn docs-build-api --sourcebase/src/Avatar/** yarn docs-build-api -sbase/src/Avatar/** # 方式二按组件名 包名指定 yarn docs-build-api --componentButton --pkgbase yarn docs-build-api -cButton -pbaseparserprops 清洗与类型归一化scripts/docgen/src/parser/docgenParser.ts 通过withCustomConfig加载 docgen 自身的tsconfig.json并注册了一个propFilter对原始解析结果做一系列规范化处理剔除公共主题 propstheme、updateTheme、replaceTheme是所有组件共有的不进入文档支持隐藏标记prop 注释带hidden或hide标签时从文档中剔除支持default覆盖当注释含default标签时用它替换解析出的默认值类型可读化StylePropViewStyle/StylePropTextStyle转换为View Style/Text Style() void、() any统一转换为FunctionPartialXxxProps简化为XxxProps(Object)Component/ViewComponent转换为React ComponentBadge 的onPress归一为Function默认值美化() {}、() null显示为Functiontheme?.colors?.primary显示为Color [Primary]。正是这些规则保证了最终生成的 props 表格对读者友好、不会因复杂 TS 类型破坏 MDX 排版。Component 类模板渲染与产物输出scripts/docgen/src/components.ts 中的Component类负责把解析结果渲染成最终文档id由displayName小写化并将.替换为_得到例如ListItem.Accordion→listitem_accordionthemeKey去掉点号的组件名作为主题配置键写入文档依次探测是否存在component_usage下的用法文件、playground下的 playground 文件以及website/static/img/anatomy下的解剖图决定 MDX 模板中是否渲染Usage、Playground、Anatomy区块props 表按名称升序排列并过滤掉来自node_modules或兄弟包中非必要的继承 props最终用 scripts/docgen/src/templates/mdx-template.hbsHandlebars 模板渲染再经 Prettier 以mdxparser 格式化后写入website/docs/components/{displayName}.mdx。模板结构生成的 MDX 长什么样模板 mdx-template.hbs 定义了每篇组件文档的统一骨架front matterid与title组件描述来自info()或组件注释Installation区块NPM / Yarn 双 Tab 安装命令包名来自rneui/{installation}tagImport与Theme Key信息块如import { Button } from rneui/themed;、主题键ButtonUsage区块来自.usage.tsx中的 demo支持tsx live实时运行代码块Anatomy区块存在解剖图时渲染Props表格Name / Type / Default / Description 四列附“Includes all Xxx props”提示Playground区块存在 playground 文件时引入在线编辑器以 website/docs/components/Button.mdx 为例它正是由模板生成的产物头部保留了import { Button } from rneui/themed;与 Theme KeyButtonUsage区块中出现了来自Button.usage.tsx的 “Variants / Size / Colors / Disabled / Linear Gradient / Custom ViewComponent” 等tsx live示例。自动化的最后一公里pre-push 钩子为了让文档“无人值守”地保持最新工作流与 Git 钩子集成当你把改动 push 到自己的分支时updateDocumentation.js脚本运行该脚本调用yarn docs-build执行文档自动生成并同时lint 新生成的 Markdown 文件如果生成的 Markdown 相对上一次有变化脚本会自动创建一个提交信息为Update Documentation的 commit并在你的提交之后 push 到分支上。注意如果跳过 pre-push 钩子例如使用--no-verify会导致文档更新失败维护者可能会因此关闭你的 PR。更新现有组件改代码即可文档自动跟随更新现有组件非常简单。无论是新增、删除还是修改 props都无需手动触碰文档只需更新组件的注释/描述以及必要的 React 组件逻辑push 代码时工作流会自动检测 Markdown 是否有变化并通过 pre-push 钩子把文档更新一并推送。从源码角度印证props 的描述来自源码注释例如 packages/base/src/Button/Button.usage.tsx 中的info(...)会覆盖组件页的描述而 props 的description直接取自各组件如 packages/base/src/Button/Button.tsx接口注释。改注释 → 重新跑yarn docs-build→ 文档同步更新。新增组件只需要关心 TypeScript 逻辑新增组件的流程同样简单。工作流的设计目标是你只需要编写 JavaScript/TypeScript 逻辑完全不用操心 Markdown。docgen 解析器的输入是自动的无需额外配置。但有两条硬性要求需要遵守必须为组件和 props 编写恰当的注释与描述尽量保持代码简单、类型简单以便自动生成正常工作组件文件名与文件夹名必须大写开头Capital letter。脚本使用正则解析文件路径大小写是硬性约束。如果遇到复杂类型/复杂 defaultValue请前往website/scripts/docgen/docgenParser.ts处理这些特例在当前仓库中对应 scripts/docgen/src/parser/docgenParser.ts。不过作者建议尽量避免这类情况——优先改进 React 组件逻辑让类型自然变简单自动生成就能正常工作。此外仓库通过.docgenignore文件控制哪些文件不参与解析packages/base/.docgenignore 排除了**/index.tsx、内部components/目录、__tests__、helpers、config、SearchBar部分文件以及ListItem.Title/ListItem.Subtitle等而 packages/themed/.docgenignore 内容为**即 themed 包全部交由base的解析结果复用因为 themed 是 base 的包装层。新增组件时如需排除某些辅助文件可在对应包的.docgenignore中追加 glob 规则。如何为组件添加新的 Demo含 Snack Player组件的 demo 现在通过进入website/docs/main下的usage目录添加当前仓库对应 website/docs/component_usage。仓库引入了Snack Player让读者能直接在文档页获得组件运行效果、了解组件如何工作。在usage目录下每个 UI 组件都有独立的子文件夹你可以为组件添加相关的 Usage 说明与描述。注意要添加 Snack demo请把 demo 放进 snack 目录下。可以添加任意多个 Snack demo越多越有助于开发者理解组件。实际上当前仓库的 demo 机制已经升级为“源码内联 demo”在组件同目录下创建{ComponentName}.usage.tsx例如 Button.usage.tsx、Avatar.usage.tsx使用从rneui/doc-gen导出的声明式 API 编写info(...描述)为组件页提供简介可多行拼接meta({...})附加元数据usage(title, desc, () JSX, usageMetadata?)声明一个 demo 小节JSX 会被 scripts/docgen/src/parser/usageParser.ts 通过 Babel 插件从源码中精确截取渲染为tsx live代码块Stack一个声明了 props 的布局容器见 scripts/docgen/lib/index.ts用于并排排列 demo。usageParser利用 Babel 的transformSync扫描ExpressionStatement中的info/meta/usage调用提取标题、描述、JSX 源码区间与元数据如live、lang从而无需运行组件即可生成带源码的实时示例。测试文档生成本地验证与 CI 集成要测试文档自动生成相关的改动只需按顺序运行以下命令cd website yarn test同时这套流程已被纳入主测试流程因此无论是 CI 工作流还是项目根目录运行yarn test对应根目录 package.json 中yarn workspaces foreach -Ap run test它都会自动执行。已知限制与未来方向Class 组件与filesToExclude截至文档撰写时部分组件仍是class 组件Input、SearchBar、Rating来自react-native-ratings。由于现有的结构react-docgen-typescript无法为它们生成理想的文档结果因此它们被列入filesToExclude数组位于当时的website/scripts/docgen/getComponentFiles.ts在当前仓库中这一职责由 packages/base/.docgenignore 与findIgnoredComponentsscripts/docgen/src/utils/common.ts承担base包中仍保留着src/SearchBar/SearchBar-**等排除规则。如果你将这些组件改造为Function/Hooks 风格请把它们从排除列表filesToExclude或对应的.docgenignore中移除即可让它们享受自动生成的收益。作者在文档末尾明确表达了期待希望有贡献者推进这些组件的函数式改造。总结贡献者视角的完整工作流综合全文React Native Elements 的文档自动生成工作流可以浓缩为一条清晰的链路组件 TS 源码含注释→ react-docgen-typescript 解析 → JSON → 类型/默认值归一化propFilter→ Handlebars MDX 模板渲染 → Prettier 格式化 → website/docs/components/*.mdx → Docusaurus 站点对贡献者而言日常只需要记住三件事写注释组件与每个 prop 都写清楚描述保持类型简单写 demo在组件目录添加{ComponentName}.usage.tsx用info/usage/Stack声明示例正常 pushpre-push 钩子会自动执行yarn docs-build、lint 生成的 Markdown并自动提交Update Documentation。其余的一切props 表格、安装命令、Import 提示、Playground 集成都由这套流水线自动完成——这正是 React Native Elements 能够长期保持文档与代码同步、降低社区贡献门槛的关键基础设施。延伸阅读工作流入口与命令package.jsondocgen 包说明与参数用法scripts/docgen/README.md解析器与类型归一化scripts/docgen/src/parser/docgenParser.tsdemo 源码解析Babel 插件scripts/docgen/src/parser/usageParser.tsMDX 生成模板scripts/docgen/src/templates/mdx-template.hbs排除规则示例packages/base/.docgenignore生成的文档产物示例website/docs/components/Button.mdx【免费下载链接】react-native-elementsCross-Platform React Native UI Toolkit项目地址: https://gitcode.com/gh_mirrors/re/react-native-elements创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表