大家好,我是文档梅。
做前端工程化,大家平时花很多精力在代码规范、CI/CD 和自动化测试上,但往往容易忽略一个协作痛点——API 文档与业务代码脱节。
很多团队要么不写文档,要么在 Wiki 上维护一套随时可能过时的接口说明。最理想的状态是:代码即文档。只要 TypeScript 类型和注释写好了,文档站就应该自动生成、自动排版、自动部署。
今天这篇文章,我就以清晰分步的方式,带大家从零搭建一套 TypeDoc + Vite (VitePress) + GitHub Actions 的自动化 API 文档体系。
一、 整体架构思路
我们要实现的链路非常清晰:
- 源头:开发者在 TypeScript 源码中编写标准的 TSDoc 注释。
- 解析:
TypeDoc读取 TS 源码,结合typedoc-plugin-markdown插件将类型定义与注释解析为 Markdown 文件。 - 渲染:基于 Vite 的静态站点生成器
VitePress读取这批 Markdown 文件,构建出响应迅速、外观现代的文档站。 - 自动化:代码合并入主分支后,CI/CD 自动触发构建并部署至静态服务托管(如 GitHub Pages)。
二、 实战步骤
1. 规范源码中的 TSDoc 注释
API 文档的质量,直接取决于源码里的注释规范。我们使用标准的 TSDoc 语法。
以一个通用的前端请求缓存工具为例:
// src/cache.ts
export interface CacheOptions {
/** 缓存过期时间(毫秒) */
ttl: number;
/** 是否启用本地持久化存储 */
persistent?: boolean;
}
/**
* 通用前端内存缓存类
*
* @example
* ```ts
* const cache = new MemoryCache<string>({ ttl: 5000 });
* cache.set('token', 'abc-123');
* const val = cache.get('token');
* ```
*/
export class MemoryCache<T> {
private store = new Map<string, { value: T; expire: number }>();
private options: CacheOptions;
constructor(options: CacheOptions) {
this.options = options;
}
/**
* 写入缓存数据
*
* @param key - 缓存唯一标识符
* @param value - 需要存储的值
* @returns 写入是否成功
*/
public set(key: string, value: T): boolean {
const expire = Date.now() + this.options.ttl;
this.store.set(key, { value, expire });
return true;
}
/**
* 获取缓存数据
*
* @param key - 缓存唯一标识符
* @returns 返回对应数据,若已过期则返回 undefined
*/
public get(key: string): T | undefined {
const data = this.store.get(key);
if (!data) return undefined;
if (Date.now() > data.expire) {
this.store.delete(key);
return undefined;
}
return data.value;
}
}
2. 安装并配置 TypeDoc
在项目中安装必要的依赖包:
pnpm add -D typedoc typedoc-plugin-markdown vitepress
在项目根目录下创建 typedoc.json 配置文件:
{
"$schema": "https://typedoc.org/schema.json",
"entryPoints": ["src/index.ts"],
"out": "docs/api",
"plugin": ["typedoc-plugin-markdown"],
"readme": "none",
"excludePrivate": true,
"excludeProtected": true,
"githubPages": false
}
关键配置说明:
entryPoints: 库的导出入口文件。out: Markdown 文档生成的输出目录(这里指定直接输出到 VitePress 的docs/api下)。plugin: 引入 Markdown 转换插件,让输出能够被 VitePress 直接识别。
3. 配置 VitePress 文档站
初始化 VitePress 目录结构:
.
├── docs/
│ ├── .vitepress/
│ │ └── config.mts
│ ├── api/ # TypeDoc 自动生成的 Markdown 产物
│ └── index.md # 首页
├── src/
│ └── index.ts
├── package.json
└── typedoc.json
编辑 docs/.vitepress/config.mts:
import { defineConfig } from 'vitepress';
export default defineConfig({
title: 'My Project Docs',
description: '前端工具库 API 文档',
themeConfig: {
nav: [
{ text: '指南', link: '/guide/' },
{ text: 'API 参考', link: '/api/' }
],
sidebar: {
'/api/': [
{
text: 'API 目录',
// 可以在这里引入 TypeDoc 生成的模块列表
items: [
{ text: 'MemoryCache', link: '/api/classes/MemoryCache' },
{ text: 'CacheOptions', link: '/api/interfaces/CacheOptions' }
]
}
]
},
socialLinks: [
{ icon: 'github', link: 'https://github.com/your-org/your-repo' }
]
}
});
4. 串联运行脚本
在 package.json 中配置脚本,形成一键生成与打包命令:
{
"scripts": {
"docs:gen": "typedoc",
"docs:dev": "npm run docs:gen && vitepress dev docs",
"docs:build": "npm run docs:gen && vitepress build docs",
"docs:preview": "vitepress preview docs"
}
}
运行 pnpm docs:dev,VitePress 就会启动本地服务。当源码或注释发生改变时,重新生成即可实时看到最新的 API 文档页面。
5. 接入 CI/CD 实现自动化部署
创建 GitHub Actions 工作流文件 .github/workflows/deploy-docs.yml,在每次代码推送到 main 分支时自动部署到 GitHub Pages:
name: Deploy Documentation
on:
push:
branches: [main]
permissions:
contents: read
pages: write
id-token: write
concurrency:
group: 'pages'
cancel-in-progress: true
jobs:
deploy:
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 20
- name: Install pnpm
uses: pnpm/action-setup@v3
with:
version: 9
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Build Docs
run: pnpm docs:build
- name: Setup Pages
uses: actions/configure-pages@v4
- name: Upload artifact
uses: actions/upload-pages-artifact@v3
with:
path: docs/.vitepress/dist
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
三、 文档工程化的 3 个实操建议
- 善用
@example标签:API 参数说明是底线,但真实调用的示例代码(Example Code)才是最能帮使用者省时间的。 - 严格收敛 Export:TypeDoc 默认会扫描 EntryPoint 导出的所有内容。如果内部使用的辅助类型不想暴露在文档中,不要在入口文件中
export出来。 - 把文档生成加入 PR 校验:在持续集成中加入
typedoc --treatWarningsAsErrors,注释如果出现断链或语法错误,直接阻断构建,倒逼团队保持注释的规范性。
四、 总结
把文档工作融入工程化,核心在于消除维护文档的心智负担。通过 TypeDoc 提取 TypeScript 静态类型,再由基于 Vite 的静态站点生成器渲染,既保证了文档 100% 反映最新代码,又兼顾了极佳的浏览体验。
大家如果在落地过程中遇到路径配置或类型解析的问题,欢迎在评论区随时交流!
License: CC BY-NC 4.0
Updated 3 hours ago
Was this article helpful? Give it a like.
0 comments


