自动生成组件 API 文档指南
本指南介绍如何使用 react-docgen-typescript 自动从 TypeScript React 组件中提取 API 文档。
概述
我们已经设置了一个自动化系统来:
- ✅ 扫描所有
ui-core组件 - ✅ 提取 props、类型、默认值和描述
- ✅ 生成 Vue 组件用于文档展示
- ✅ 生成 JSON 文件用于其他用途
快速开始
1. 生成 API 文档
运行以下命令来生成所有组件的 API 文档:
bash
pnpm --filter @xcloud/docs generate:api这将:
- 扫描
packages/ui-core/src/components中的所有.tsx文件 - 为每个组件生成一个 Vue 组件 (如
ButtonRootApi.vue) - 生成一个包含所有组件 API 的 JSON 文件
2. 在文档中使用
在你的 markdown 文件中导入并使用生成的 API 组件:
vue
<script setup>
import ButtonDemo from '../../demos/button-basic.tsx'
import ButtonDemoSource from '../../demos/button-basic.tsx?raw'
import CodePreview from '../../.vitepress/theme/components/CodePreview.vue'
import ButtonRootApi from '../../.vitepress/theme/api/ButtonRootApi.vue'
</script>
<!-- 组件预览 -->
<CodePreview :component="ButtonDemo" :source="ButtonDemoSource" />
<!-- API 文档表格 -->
<ButtonRootApi />输出内容
1. Vue 组件 (.vitepress/theme/api/*.vue)
每个组件都会生成一个对应的 Vue 文件,包含:
- 自动格式化的 API 表格
- 主题适配的样式
- 可以直接在 markdown 中使用
示例: ButtonRootApi.vue 会显示 ButtonRoot 组件的所有 props。
2. JSON 文件 (.vitepress/theme/api/components-api.json)
包含所有组件的完整 API 数据,可用于:
- 搜索功能
- API 索引页面
- 其他自动化工具
JSON 结构:
json
{
"ButtonRoot": {
"name": "ButtonRoot",
"description": "按钮组件",
"props": {
"variant": {
"type": "'primary' | 'secondary'",
"required": false,
"defaultValue": "'primary'",
"description": "按钮样式变体"
}
}
}
}为组件添加文档注释
为了生成更好的 API 文档,请在组件代码中添加 JSDoc 注释:
typescript
interface ButtonProps {
/**
* 按钮样式变体
* @default 'primary'
*/
variant?: 'primary' | 'secondary' | 'neutral'
/**
* 按钮大小
*/
size?: 'small' | 'medium' | 'large'
/**
* 是否禁用按钮
*/
disabled?: boolean
/**
* 点击事件处理器
*/
onClick?: () => void
}
/**
* 按钮组件 - 用于用户交互
*
* @example
* ```tsx
* <Button variant="primary" size="medium">
* 点击我
* </Button>
* ```
*/
export function ButtonRoot({ variant = 'primary', ...props }: ButtonProps) {
// ...
}生成的文档将包含这些描述!
配置选项
脚本位于 packages/docs/scripts/generate-api-components.mjs。
你可以修改以下配置:
javascript
// 组件源码目录
const COMPONENTS_DIR = path.resolve(__dirname, '../../ui-core/src/components')
// 输出目录
const OUTPUT_DIR = path.resolve(__dirname, '../.vitepress/theme/api')
// 解析器选项
const parserOptions = {
shouldExtractLiteralValuesFromEnum: true, // 提取枚举值
shouldRemoveUndefinedFromOptional: true, // 移除可选 prop 的 undefined
propFilter: (prop) => {
// 过滤不需要的 props
}
}高级用法
1. 只生成特定组件
修改脚本来只处理特定文件:
javascript
const files = fs.readdirSync(COMPONENTS_DIR)
.filter(file => file === 'button.tsx') // 只处理 button.tsx
.map(file => path.join(COMPONENTS_DIR, file))2. 自定义表格样式
修改生成的 Vue 组件模板中的样式:
javascript
function generateApiComponent(componentDoc) {
// ...自定义模板...
}3. 添加更多信息
可以提取更多信息,如:
- 方法 (methods)
- 事件 (events)
- 插槽 (slots)
工作流程
mermaid
graph LR
A[TypeScript 组件] -->|react-docgen-typescript| B[解析 Props]
B --> C[生成 Vue 组件]
B --> D[生成 JSON]
C --> E[Markdown 文档]
D --> F[搜索/索引]集成到 CI/CD
在构建前自动生成
修改 packages/docs/package.json:
json
{
"scripts": {
"prebuild": "pnpm generate:api",
"build": "vitepress build"
}
}Git Hook
在提交前自动生成:
bash
# .husky/pre-commit
pnpm --filter @xcloud/docs generate:api
git add packages/docs/.vitepress/theme/api/示例
完整的组件文档模板
markdown
# Button 按钮
交互式按钮组件。
## 导入
\`\`\`tsx
import { Button } from '@xcloud/ui-core'
\`\`\`
## 示例
<script setup>
import ButtonDemo from '../../demos/button-basic.tsx'
import ButtonDemoSource from '../../demos/button-basic.tsx?raw'
import CodePreview from '../../.vitepress/theme/components/CodePreview.vue'
import ButtonRootApi from '../../.vitepress/theme/api/ButtonRootApi.vue'
</script>
<CodePreview :component="ButtonDemo" :source="ButtonDemoSource" />
## 基础用法
\`\`\`tsx
<Button.Root variant="primary">
点击我
</Button.Root>
\`\`\`
## API
<ButtonRootApi />
## 功能特性
- ✅ 多种样式变体
- ✅ 响应式设计
- ✅ 无障碍访问常见问题
Q: 为什么某些组件没有生成 props?
A: 可能是因为:
- 组件没有定义 TypeScript 接口
- Props 被
propFilter过滤掉了 - 组件使用了动态 props
解决方法: 为组件添加明确的 TypeScript 类型定义。
Q: 如何显示继承的 props?
A: 修改 propFilter 函数:
javascript
propFilter: (prop) => {
return true // 显示所有 props,包括继承的
}Q: 能否生成 Markdown 表格而不是 Vue 组件?
A: 可以!修改 generateApiComponent 函数直接返回 Markdown 字符串,并保存为 .md 文件。
Q: 支持其他组件库格式吗?
A: 支持!react-docgen-typescript 可以解析任何 TypeScript React 组件。
其他工具推荐
如果你需要更多功能,可以考虑:
- Storybook - 完整的组件开发环境
- Docusaurus - 功能丰富的文档系统
- react-docgen - 适用于 JavaScript 组件
- typedoc - 适用于 TypeScript 库
总结
使用自动 API 文档生成:
优势:
- ✅ 减少手动维护
- ✅ 保持文档与代码同步
- ✅ 提取 TypeScript 类型信息
- ✅ 自动生成标准化格式
流程:
- 编写带 JSDoc 的组件
- 运行
pnpm generate:api - 在文档中导入生成的 API 组件
- 提交到版本控制
结果:
- 📦 169 个组件的 API 文档自动生成
- 🎨 统一的表格样式
- 🔍 可搜索的 JSON 数据
- 📝 易于维护的文档
开始使用吧!🚀