第二十五章. 活文档工程:Docs as Code (文档即代码)
第二十五章. 活文档工程:Docs as Code (文档即代码)
Prorise第二十五章. 活文档工程:Docs as Code (文档即代码)
在开源界流传着一句话:“代码写得再好,文档烂也是垃圾”。
传统的文档维护方式(Word、Confluence 或随意更改的文本)最大的问题是“文档腐烂”——代码更新了,文档没跟上,导致用户照着文档跑不通,最后愤怒地关闭页面。
本章我们将引入“文档工程”的概念:将文档视为代码仓库的一部分,纳入版本控制,利用 CI/CD 自动化更新,并实现“图表即代码”的可视化管理。
25.1. 门面担当:README 的规范与自动化
25.1.1. 行业规范:合格 README 的必备要素
一个符合工业级规范的 README,必须 包含以下模块:
1. Header(页头)
- 高清 Logo(建议尺寸:512×512px,PNG 格式带透明背景)
- 项目名称(使用一级标题)
- 一句话核心价值主张(Value Proposition)
示例:
1 | # 🚀 FastAPI Boilerplate |
2. Badges(徽章)
徽章是项目的"生命体征监测器",展示项目的健康状态。必备徽章包括:
- 构建状态:显示 CI/CD 是否通过
- 版本号:当前发布版本
- License:开源协议类型
- 代码覆盖率:测试覆盖百分比
- 下载量:npm/PyPI 下载统计
3. Demo(演示)
- 一张 GIF 动图或核心功能截图
- 遵循 No Pic No Truth 原则
- GIF 大小控制在 5MB 以内,推荐使用 ScreenToGif 录制
4. Features(核心特性)
- 3-5 个核心卖点,使用列表形式
- 每条特性用 动词 + 名词 结构
- 适当使用 Emoji 增强可读性(✅ ✨ 🚀 ⚡ 🔒)
5. Quick Start(快速开始)
- 必须让用户在 3 行命令内 跑起来
- 包含前置依赖说明(Node.js 版本、Python 版本等)
- 提供最简单的 Hello World 示例
6. Installation(安装指南)
- 详细的依赖安装步骤
- 常见操作系统的差异说明(Windows/macOS/Linux)
7. Contributing(贡献指南)
- 链接到
CONTRIBUTING.md文件 - 简要说明如何提交 Issue 和 PR
8. License(开源协议)
- 声明项目采用的开源协议
- 链接到
LICENSE文件
25.1.2. 徽章(Badges)制作实战指南
徽章的核心工具是 Shields.io,这是全球最大的徽章生成服务,GitHub 上超过 2000 万个项目 在使用。
常用徽章类型与生成方法
A. 构建状态徽章(GitHub Actions)
- 进入你的 GitHub 仓库的 Actions 页面
- 点击工作流右上角的 “…” 菜单
- 选择 “Create status badge”
- 复制生成的 Markdown 代码
1 |  |
B. 版本号徽章(npm/PyPI)
访问 Shields.io,搜索对应的徽章类型:
1 | <!-- npm 版本 --> |
C. License 徽章
1 |  |
D. 代码覆盖率徽章(Codecov)
- 登录 Codecov.io
- 关联你的 GitHub 仓库
- 在 Settings → Badge 中复制 Markdown 链接
1 |  |
E. 自定义徽章
Shields.io 支持完全自定义的徽章格式:
1 |  |
徽章颜色代码:
brightgreen:亮绿色(成功)red:红色(失败)blue:蓝色(信息)yellow:黄色(警告)orange:橙色- 也支持十六进制颜色:
#FF5733
徽章排版最佳实践
1 | <!-- 推荐:分类排列 --> |
25.1.3. Features(特性)的专业写法
糟糕示例 ❌
1 | - 速度快 |
这种描述毫无说服力,没有提供任何具体信息。
优秀示例 ✅
1 | ## ✨ 核心特性 |
25.1.4. Quick Start(快速开始)的黄金法则
法则 1:3 行命令内跑起来
糟糕示例 ❌
1 | 请先安装 Node.js,然后配置环境变量,接着执行... |
优秀示例 ✅
1 | ## 🚀 快速开始 |
打开浏览器访问 http://localhost:3000
1 |
|
法则 3:提供多种安装方式
1 | ## 📦 安装 |
yarn
1 | yarn add package-name |
pnpm
1 | pnpm add package-name |
CDN(浏览器环境)
1 | <script src="https://unpkg.com/package-name"></script> |
25.1.5. AI 辅助生成 README
现在,请你扮演"审稿人"的角色,而不是"撰稿人"。将繁琐的格式排版工作交给 AI。
操作步骤
Step 1:准备代码上下文
复制你项目核心逻辑文件(如 main.py 或 App.vue)的前 50-100 行代码。
Step 2:使用专业 Prompt
1 | # Role |
25.1.6. 检查清单:发布前的 README 审查
在推送代码前,请确保:
- [ ] 项目名称和描述清晰明确
- [ ] 至少包含 3 个徽章(构建状态、版本、License)
- [ ] 有至少 1 张截图或 GIF 演示
- [ ] Features 部分包含 3-5 个卖点,每条带 Emoji
- [ ] Quick Start 可以在 5 分钟内完成
- [ ] 所有代码示例经过测试,确保可运行
- [ ] 包含 Contributing 和 License 信息
- [ ] 链接全部有效(无 404 错误)
- [ ] 在手机端预览排版正常
25.2. 可视化思维:Mermaid 与“图表即代码”
1. 行业规范:一图胜千言
在复杂的业务逻辑、状态机流转、时序交互中,纯文字描述是苍白的。规范的工程文档必须配图。
传统的做法是:
- 打开 Visio / Draw.io / Figma。
- 画图。
- 导出 PNG。
- 上传到 Git 仓库的
/assets目录。 - 在 Markdown 里引用。
2. 传统痛点:二进制文件的“死局”
这种“贴图流”最大的问题在于维护成本极高:
- 无法 Diff: Git 无法对比图片的变化。你不知道 V2 版的图比 V1 版改了哪里。
- 同步漂移: 代码逻辑改了(比如登录多了一步验证),但维护者懒得重新打开画图软件修改,导致“图文不符”。这是误导开发者的元凶。
3. 解决方案:Mermaid.js
Mermaid 允许你用“写代码”的方式画图。GitHub 原生支持渲染。
- 版本控制: 图表就是文本,Git 可以完美记录每一行线条的改动。
- 就近维护: 就在 Markdown 文件里写,不用切换软件。
4. AI 赋能:逻辑直接转图表
你不需要专门去学 Mermaid 的语法(比如箭头是 --> 还是 ->>)。你只需要把业务逻辑告诉 AI。
Prompt 范式:
1 | # Role |
23.3. 构建商业级文档站:Docusaurus + Vercel
README 再好,也承载不了几百页的 API 文档和教程。你需要一个独立的网站。为什么选 Docusaurus?因为它是 React 生态的王者,支持版本控制(V1.0/V2.0 文档共存)、支持博客、支持搜索,且被 Meta、ByteDance、Shopify 等大厂广泛使用,在我的博客文章中,之前教学过如何搭建vitepress作为文档站,所以这次我们选型为技术站为react的文档站,具体文档站的对比可以见下表:
| 工具名称 | 技术栈 | 核心优势 | 主要劣势 | 适用场景 |
|---|---|---|---|---|
| Docusaurus | React + Node.js | 版本控制强大、搜索/博客内置、大厂背书、React生态兼容 | 需掌握基础React、定制化需写组件 | 开源项目、技术文档、多版本API文档 |
| GitBook | Node.js(底层) | 可视化编辑、团队协作强、支持付费订阅、导出功能全 | 免费版功能受限、自定义程度低、加载速度一般 | 商业文档、团队协作文档、产品教程 |
| VuePress | Vue + Node.js | Vue生态友好、轻量化、配置简单、主题易定制 | 版本控制弱、动态功能依赖插件 | Vue项目文档、小型技术站、个人知识库 |
| MkDocs | Python | 上手门槛极低、插件丰富、构建速度快 | 动态交互弱、复杂UI需自定义 | 纯静态文档、技术手册、开源项目轻量文档 |
| Hugo | Go | 构建速度极快(毫秒级)、高性能、跨平台 | 配置逻辑较复杂、主题生态不如Node系丰富 | 大型静态文档站、高访问量技术文档 |
| Confluence | Java(商业软件) | 企业级权限管理、协作功能强、集成Jira | 系统笨重、收费昂贵、自定义灵活度低 | 企业内部知识库、跨部门协作文档 |
| Hexo | Node.js | 轻量快速、主题生态丰富、部署简单 | 原生文档功能弱、需依赖插件扩展 | 个人博客+简单文档、小型团队静态站点 |
| Notion(文档站模式) | 商业SaaS(无公开技术栈) | 可视化拖拽编辑、跨平台同步、支持多维内容 | 自定义域名需付费、技术文档功能弱 | 非技术团队、轻量知识库、产品说明文档 |
23.3.1. 第一步:脚手架初始化 (Scaffolding)
我们需要在本地创建一个全新的 Docusaurus 项目。
1. 执行创建命令
找一个干净的文件夹,运行以下命令。我们将项目命名为 my-project-docs。
1 | pnpm dlx create-docusaurus@latest my-project-docs classic |
2. 交互式选择
终端会跳出一些选项,请按以下推荐选择:
- Javascript vs TypeScript: 选
TypeScript(现代前端标配,类型安全)。 - Git init: 选
Yes。
3. 启动预览
进入目录并启动本地服务器,看看它长什么样。
1 | cd my-project-docs |
浏览器会自动打开 http://localhost:3000。
🎉 恭喜! 你已经拥有了一个包含“文档”、“博客”、“主页”的完整网站雏形。
23.3.2. 第二步:配置核心元数据 (Config)
现在的网站全是 Docusaurus 的默认信息(恐龙图标)。我们需要把它变成“你的”网站。
请使用 VS Code 打开 my-project-docs 文件夹,找到根目录下的 docusaurus.config.ts (或 .js)。这是整个网站的控制中心。
重点修改以下字段:
1 | const config: Config = { |
实战任务:
- 修改
title和tagline。 - 在
navbar里把 GitHub 链接换成你真实的仓库地址。 - 保存文件,浏览器会自动刷新,你会看到导航栏变
23.3.3. 第三步:推送到 GitHub
在部署之前,我们需要把这个文档项目托管到 GitHub 上。
1. 在 GitHub 上新建仓库
- 打开 GitHub 网页。
- 点击右上角
+->New repository。 - 仓库名填:
my-project-docs(或者project-name-website)。 - 注意: 这是一个独立的仓库,专门放文档代码,不要和你的业务代码混在一起(除非你用 Monorepo,但新手不推荐)。
2. 关联并推送
回到你的终端(VS Code 里的 Terminal):
1 | # 如果刚才初始化没做 git init,先做这个 |
23.3.4. 第四步:使用 Vercel 一键部署
这是最激动人心的一步。我们将使用 Vercel(Next.js 的母公司,也是前端部署的神器)来发布你的网站。它免费、极速、且自动集成 GitHub。
1. 注册/登录 Vercel
打开 vercel.com,使用 Continue with GitHub 登录。这是必须的,因为我们要授权它访问你的仓库。
2. 导入项目
- 在 Vercel 控制台首页,点击 “Add New…” -> “Project”。
- 在左侧的 “Import Git Repository” 列表中,你应该能看到刚才推送的
my-project-docs。 - 点击该仓库旁边的 Import 按钮。
3. 配置构建 (Build)
- Framework Preset: Vercel 非常智能,通常会自动识别出这是
Docusaurus。如果没有,手动选一下。 - 点击大大的 “Deploy” 按钮。
4. 等待烟花 🎆
屏幕会显示构建日志。大约 30 秒后,你会看到满屏的撒花特效,屏幕上会显示一个链接,类似:https://my-project-docs-xi8s.vercel.app
点击访问。你的文档站已经上线了!全球可访问!
进阶提示: 以后你只需要在本地修改 Markdown 文件,
git commit并git push,Vercel 会自动感应到代码变更,自动触发重新部署。这就是 GitOps。
23.3.5. 第五步:闭环——将文档挂载到 GitHub 主页
你的文档站做好了,现在要让所有访问你 GitHub 仓库的人都知道它的存在。
1. 复制 Vercel 的域名
复制刚才 Vercel 生成的那个 https://....vercel.app 链接(如果你有自定义域名更好)。
2. 回到你的“核心代码仓库”
注意,是你的业务代码仓库(不是刚才建的文档仓库)。
3. 编辑 About 信息
- 在仓库首页右侧边栏,找到 About 字样。
- 点击那个小齿轮图标 ⚙️。
- 在 Website 输入框中,粘贴你的文档站链接。
- 勾选 “Use this description, topics, and website…”。
- 点击 Save changes。
效果:
现在,任何人进入你的 GitHub 仓库,第一眼就会在右上角看到一个蓝色的链接图标,指向你专业的 Docusaurus 文档站。这瞬间提升了项目的“正规感”。
25.4. DocOps 实战:给文档装上“自动纠错机”
软件开发中有 DevOps,文档开发中自然也有 DocOps。
你肯定遇到过这种情况:你在文档里写了一个超链接 [点击这里查看详情](./detail-v1),结果三个月后你重构了目录,把 detail-v1 删了或改名了。用户点击这个链接时,直接跳出 404 错误。这会让用户瞬间对项目失去信任。
靠人眼去检查几百个文件是不可能的。我们需要在 GitHub Actions 里配置一个自动巡检机器人。
25.4.1. 认识死链杀手 Lychee
我们要使用的工具叫 Lychee。它是目前开源界最快、最流行的链接检查工具,支持 Markdown、HTML 等多种格式。它的工作原理是扫描你所有的文本,提取出 http://... 或 ./... 链接,然后挨个去 Ping 一下,如果不通,直接让 CI 报错。
25.4.2. 配置 GitHub Actions 工作流
我们需要创建一个新的工作流文件。请在你的文档仓库根目录下,创建目录和文件:.github/workflows/doc-check.yml。
请直接复制以下内容填入该文件:
1 | name: DocOps Quality Check |
25.4.3. 提交并验证
保存文件后,在终端执行提交:
1 | git add . |
现在,打开你的 GitHub 仓库页面,点击上方的 Actions 标签。你应该能看到一个名为 DocOps Quality Check 的任务正在运行。
如果你的文档里现在有坏链接,这个任务会变成红色(Failure),点进去看日志,它会精确地告诉你:“在 docs/intro.md 第 15 行,链接 https://google.com/404 无法访问”。
这就是我们要的安全感。
25.5. 拒绝重复造轮子:API 文档自动化
如果你的开源项目是一个 Web 框架、SDK 或者 API 服务,你一定面临过这个痛点:代码里的接口改了,文档忘了改。
最优雅的解决方案是 Single Source of Truth(单一数据源):代码即文档。我们通过代码注释或 Swagger/OpenAPI 文件,自动生成漂亮的文档页面。
我们将使用 Docusaurus 社区的神级插件:docusaurus-plugin-openapi-docs。
25.5.1. 准备工作:安装依赖
请注意,我们使用 pnpm。在 Docusaurus 项目根目录下运行:
1 | pnpm add docusaurus-plugin-openapi-docs docusaurus-theme-openapi-docs |
这会安装处理 OpenAPI 规范的插件和对应的 UI 主题。
25.5.2. 获取 OpenAPI 规范文件
你需要有一个 openapi.json 或 openapi.yaml 文件。通常你的后端项目(FastAPI, Spring Boot, NestJS)会自动生成这个文件。
为了演示,请在你的文档项目根目录新建一个文件 openapi.yaml,并填入以下最简单的测试内容:
1 | openapi: 3.0.0 |
25.5.3. 修改核心配置文件
这是最关键的一步。我们需要告诉 Docusaurus 去哪里找这个 yaml 文件,以及如何渲染它。
打开 docusaurus.config.ts (或 .js),我们需要修改 presets 和 plugins 两个部分。请仔细对照修改:
第一处修改:Presets 配置
找到 presets 数组中的 classic 部分,修改 docs 下的配置:
1 | // docusaurus.config.ts |
第二处修改:Plugins 配置
在 presets 之后,添加 plugins 和 themes 配置:
1 | // docusaurus.config.ts |
25.5.4. 生成文档并预览
配置完成后,我们需要运行一个命令,让插件读取 YAML 并生成 Markdown 文件。
在终端运行:
1 | pnpm docusaurus gen-api-docs all |
运行完毕后,请看你的左侧文件树,docs/ 目录下会自动多出一个 api/ 文件夹,里面有一个 my-project-api.mdx 文件。
现在启动本地预览:
1 | pnpm start |
访问 http://localhost:3000/docs/api/my-project-api。你会看到一个非常专业的 API 调试页面,甚至有一个 “Execute” 按钮可以直接发送请求。
以后你的后端代码更新了,只需要覆盖 openapi.yaml,再次运行生成命令,文档就自动更新了。
25.6. 走向国际化与多版本 (i18n & Versioning)
当你的项目 Star 数超过 1000,或者开始被企业使用时,你会面临两个“幸福的烦恼”:
- 我发布了 v2.0,API 全改了,但企业用户还在用 v1.0,他们需要看老文档。
- 我有中文用户,也有英文用户,我需要中英双语文档。
25.6.1. 版本快照 (Versioning) 的魔力
Docusaurus 的版本管理机制非常符合直觉:它会把当前的文档“拍一张照片”存起来。
假设你现在处于 v1.0 开发阶段,准备发布 v2.0 了。你需要把 v1.0 的文档封存。
请在终端运行:
1 | pnpm run docusaurus docs: version 1.0.0 |
运行后,你会发现项目根目录多了一个 versioned_docs 文件夹。
docs/文件夹:这里永远存放**最新、正在开发中(Next)**的文档。versioned_docs/version-1.0.0/文件夹:这里存放刚才封存的 v1.0.0 文档。
重新运行 pnpm start。哪怕你什么都不改,你会发现网站导航栏的右上角,自动出现了一个 版本下拉菜单。用户可以自由在 Next 和 1.0.0 之间切换。
25.6.2. 国际化 (i18n) 配置实战
要让网站支持中文,我们需要做三件事:配置、提取、翻译。
第一步:修改配置
打开 docusaurus.config.ts,找到 i18n 字段,修改如下:
1 | i18n: { |
第二步:提取待翻译内容
Docusaurus 会自动把所有的按钮、导航栏文字、页脚提取出来供你翻译。运行:
1 | pnpm run write-translations --locale zh-Hans |
这会在 i18n/zh-Hans/ 目录下生成一系列 JSON 文件。
第三步:开始翻译
你需要处理两部分内容:
UI 界面翻译:
打开i18n/zh-Hans/docusaurus-theme-classic/navbar.json等文件,把里面的 “Tutorial” 改成 “教程”,“Blog” 改成 “博客”。文档内容翻译:
这部分需要你手动复制。将docs/目录下的所有 Markdown 文件,复制到i18n/zh-Hans/docusaurus-plugin-content-docs/current/目录下。然后打开复制过去的 Markdown 文件,把英文内容翻译成中文。
第四步:查看效果
本地预览中文版需要加参数:
1 | pnpm start --locale zh-Hans |
现在的网站就是全中文的了。
第五步:自动化部署的配合
当你把这些改动 Push 到 GitHub 后,Vercel 会自动识别出 i18n 配置。你不需要做任何额外设置,Vercel 会自动发布两个版本的网站:
https://yoursite.com/(英文)https://yoursite.com/zh-Hans/(中文)
第 25 章总结
到此为止,我们已经构建了一套顶级的文档工程体系:
- 门面: 我们有了规范的 README 和动态徽章。
- 内核: 我们有了基于 Mermaid 的图表即代码。
- 载体: 我们用 Docusaurus + Vercel 搭建了独立的商业级文档站。
- 守卫: 我们用 DocOps (Lychee) 保证了链接永远有效。
- 同步: 我们用 OpenAPI 插件实现了 API 文档的自动化。
- 扩展: 我们实现了多版本和多语言支持。
现在,你的项目在“软实力”上已经做好了迎接成千上万用户的准备。
接下来,我们将进入 第二十六章:开源宪法。项目做大了,法律风险也就来了。我们将探讨如何选择开源协议(License),以及如何通过 CLA(贡献者许可协议)来保护你的知识产权。
你准备好进入法律的世界了吗?













