JSDoc 简介 #

什么是 JSDoc? #

JSDoc 是一个用于 JavaScript 的 API 文档生成器。它通过解析 JavaScript 源代码中的特殊注释格式,自动生成结构化的 HTML 文档。JSDoc 是 JavaScript 社区中最流行、使用最广泛的文档生成工具之一。

核心定位 #

text
┌─────────────────────────────────────────────────────────────┐
│                         JSDoc                                │
├─────────────────────────────────────────────────────────────┤
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐         │
│  │  注释解析    │  │  类型推断    │  │  HTML生成   │         │
│  └─────────────┘  └─────────────┘  └─────────────┘         │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐         │
│  │  模板系统    │  │  插件扩展    │  │  类型检查    │         │
│  └─────────────┘  └─────────────┘  └─────────────┘         │
└─────────────────────────────────────────────────────────────┘

JSDoc 的历史 #

发展历程 #

text
2008年 ─── JSDoc 1.0 诞生
    │
    │      Michael Mathews 创建
    │      基于 JavaDoc 风格
    │      基础文档生成
    │
2011年 ─── JSDoc 3.0 发布
    │
    │      完全重写
    │      插件系统
    │      模板引擎
    │
2013年 ─── 生态扩展
    │
    │      TypeScript 支持
    │      更多插件
    │      社区模板
    │
2015年 ─── ES6 支持
    │
    │      箭头函数
    │      类语法
    │      模块系统
    │
2018年 ─── 现代化改进
    │
    │      ES2015+ 完整支持
    │      更好的类型推断
    │      性能优化
    │
2020年 ─── 持续演进
    │
    │      TypeScript 集成增强
    │      VS Code 智能提示
    │      现代模板
    │
至今   ─── 行业标准
    │
    │      JavaScript 文档首选
    │      IDE 原生支持
    │      类型安全增强

里程碑版本 #

版本 时间 重要特性
1.0 2008 基础文档生成,JavaDoc 风格
2.0 2010 改进的解析器,更多标签
3.0 2011 完全重写,插件系统
3.3 2014 ES6 初步支持
3.5 2017 完整 ES6 支持,类语法
3.6 2019 TypeScript 兼容性改进
4.0 2021 现代化重构,ESM 支持

为什么选择 JSDoc? #

文档编写的痛点 #

在没有 JSDoc 之前,JavaScript 文档面临以下问题:

javascript
// 传统方式:文档与代码分离
// README.md 或单独的文档文件

// 函数说明
// 参数: a - 第一个数字, b - 第二个数字
// 返回: 两个数字的和
function add(a, b) {
  return a + b;
}

// 问题:
// 1. 文档与代码不同步
// 2. 没有类型信息
// 3. 格式不统一
// 4. 难以维护

JSDoc 的解决方案 #

javascript
// JSDoc 方式:注释即文档

/**
 * 计算两个数字的和
 * @param {number} a - 第一个数字
 * @param {number} b - 第二个数字
 * @returns {number} 两个数字的和
 * @example
 * add(1, 2) // 返回 3
 */
function add(a, b) {
  return a + b;
}

// 优势:
// 1. 文档与代码在一起
// 2. 有类型信息
// 3. 格式统一
// 4. 自动生成 HTML

JSDoc 的核心特点 #

1. 注释即文档 #

文档直接写在代码中,保持同步:

javascript
/**
 * 用户类
 * @class
 */
class User {
  /**
   * 创建用户实例
   * @param {string} name - 用户名
   * @param {string} email - 邮箱地址
   */
  constructor(name, email) {
    this.name = name;
    this.email = email;
  }

  /**
   * 获取用户信息
   * @returns {Object} 用户信息对象
   */
  getInfo() {
    return { name: this.name, email: this.email };
  }
}

2. 类型注解 #

支持丰富的类型定义:

javascript
/**
 * 处理用户数据
 * @param {Object} user - 用户对象
 * @param {string} user.name - 用户名
 * @param {number} user.age - 年龄
 * @param {string[]} user.tags - 标签数组
 * @returns {Promise<User>} 用户 Promise
 */
function processUser(user) {
  return Promise.resolve(new User(user.name));
}

3. 自动生成 HTML #

一键生成专业文档网站:

bash
jsdoc -c jsdoc.json

# 输出:
# out/
# ├── index.html
# ├── module-user.html
# ├── class-User.html
# └── styles/
#     └── jsdoc-default.css

4. IDE 智能提示 #

主流 IDE 原生支持:

javascript
// VS Code 中输入时会显示:
// ┌─────────────────────────────────────┐
// │ add(a: number, b: number): number   │
// │ 计算两个数字的和                      │
// │ @param a - 第一个数字                │
// │ @param b - 第二个数字                │
// │ @returns 两个数字的和                 │
// └─────────────────────────────────────┘

5. 插件系统 #

丰富的插件生态:

javascript
// jsdoc.json
{
  "plugins": [
    "plugins/markdown",           // Markdown 支持
    "node_modules/jsdoc-plugin-typescript", // TypeScript 支持
    "node_modules/better-docs"    // 更好的模板
  ]
}

6. 模板定制 #

支持自定义文档外观:

javascript
// jsdoc.json
{
  "opts": {
    "template": "node_modules/docdash"
  }
}

JSDoc 与其他文档工具对比 #

JSDoc vs TypeScript #

特性 JSDoc TypeScript
类型检查 ⚠️ 有限 ✅ 完整
编译 ❌ 无 ✅ 有
学习成本
迁移成本
IDE 支持 ✅ 好 ✅ 完美
适用场景 渐进式类型 新项目

JSDoc vs TSDoc #

特性 JSDoc TSDoc
目标语言 JavaScript TypeScript
类型语法 JSDoc 类型 TypeScript 类型
工具支持 广泛 TypeScript 项目
学习曲线 平缓 需要了解 TS
兼容性 TypeScript 专用

JSDoc vs ESDoc #

特性 JSDoc ESDoc
ES6+ 支持 ✅ 好 ✅ 优秀
自动推断 ⚠️ 有限 ✅ 强大
社区规模
维护状态 活跃 停止维护
插件生态 丰富 较少

JSDoc 的应用场景 #

1. 库和框架开发 #

为公共 API 生成文档:

javascript
/**
 * 创建 HTTP 请求客户端
 * @module HttpClient
 * @example
 * import { createClient } from 'http-client';
 * const client = createClient({ baseURL: '/api' });
 */

/**
 * 创建客户端实例
 * @param {Object} config - 配置选项
 * @param {string} config.baseURL - 基础 URL
 * @param {number} [config.timeout=5000] - 超时时间
 * @returns {HttpClient} 客户端实例
 */
export function createClient(config) {
  return new HttpClient(config);
}

2. 团队协作 #

统一团队文档规范:

javascript
/**
 * @typedef {Object} ApiResponse
 * @property {number} code - 状态码
 * @property {string} message - 响应消息
 * @property {*} data - 响应数据
 */

/**
 * 发送 API 请求
 * @template T
 * @param {string} url - 请求地址
 * @param {Object} [options] - 请求选项
 * @returns {Promise<ApiResponse & { data: T }>}
 */
async function request(url, options) {
  // ...
}

3. 代码提示增强 #

提升开发体验:

javascript
/**
 * 用户服务
 * @namespace UserService
 */
const UserService = {
  /**
   * 获取用户列表
   * @param {Object} [query] - 查询参数
   * @param {number} [query.page=1] - 页码
   * @param {number} [query.limit=10] - 每页数量
   * @returns {Promise<{ list: User[], total: number }>}
   */
  async getList(query) {
    // ...
  }
};

4. 渐进式类型迁移 #

从 JavaScript 渐进迁移到 TypeScript:

javascript
// 第一步:添加 JSDoc 注释
/**
 * @typedef {import('./types').User} User
 */

/**
 * @param {User} user
 * @returns {boolean}
 */
function validateUser(user) {
  return !!user.name && !!user.email;
}

// 第二步:迁移到 .ts 文件时,类型信息已就绪

JSDoc 的核心概念 #

注释格式 #

javascript
/**
 * 这是一个 JSDoc 注释块
 * 以 /** 开始,以 * / 结束
 * 每行以 * 开头
 * @tag {type} name - description
 */

标签(Tags) #

javascript
/**
 * @param {string} name - 参数标签
 * @returns {boolean} - 返回值标签
 * @throws {Error} - 异常标签
 * @example - 示例标签
 * @deprecated - 废弃标签
 */

类型表达式 #

javascript
/**
 * @type {string}                    // 基本类型
 * @type {string[]}                  // 数组类型
 * @type {Object<string, number>}    // 对象类型
 * @type {function(string): number}  // 函数类型
 * @type {User | Admin}              // 联合类型
 * @type {?string}                   // 可空类型
 */

JSDoc 的工作原理 #

处理流程 #

text
┌─────────────────────────────────────────────────────────────┐
│                     JSDoc 处理流程                           │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│  ┌──────────┐    ┌──────────┐    ┌──────────┐              │
│  │ 源代码    │ -> │  解析器   │ -> │  AST     │              │
│  │ (.js)    │    │ (Parser) │    │          │              │
│  └──────────┘    └──────────┘    └──────────┘              │
│                                        │                     │
│                                        ▼                     │
│  ┌──────────┐    ┌──────────┐    ┌──────────┐              │
│  │ HTML文档  │ <- │  模板     │ <- │ 文档数据  │              │
│  │ (out/)   │    │(Template)│    │ (Doclet) │              │
│  └──────────┘    └──────────┘    └──────────┘              │
│                                                              │
└─────────────────────────────────────────────────────────────┘

Doclet 结构 #

每个注释块会被解析为 Doclet 对象:

javascript
{
  kind: 'function',
  name: 'add',
  description: '计算两个数字的和',
  params: [
    { name: 'a', type: 'number', description: '第一个数字' },
    { name: 'b', type: 'number', description: '第二个数字' }
  ],
  returns: {
    type: 'number',
    description: '两个数字的和'
  },
  meta: {
    filename: 'math.js',
    lineno: 10,
    path: '/src/utils'
  }
}

JSDoc 的包结构 #

核心包 #

text
jsdoc/
├── core/           # 核心解析器
├── parser/         # 语法解析
├── doclet/         # 文档对象
├── template/       # 模板系统
├── plugin/         # 插件系统
└── cli/            # 命令行工具

常用插件 #

text
plugins/
├── markdown        # Markdown 支持
├── summare         # 摘要生成
├── sourcetag       # 源码标签
└── testdoc         # 测试文档

学习路径 #

text
入门阶段
├── 安装与配置
├── 基本注释语法
├── 常用标签
└── 生成文档

进阶阶段
├── 类型定义
├── 模块文档
├── 类和继承
└── 配置文件

高级阶段
├── 自定义模板
├── 插件开发
├── TypeScript 集成
└── 工作流集成

实战阶段
├── 库文档实战
├── 团队规范
├── CI/CD 集成
└── 最佳实践

下一步 #

现在你已经了解了 JSDoc 的基本概念,接下来学习 基础语法 开始实际使用 JSDoc!

最后更新:2026-03-29