一、总原则
- 清晰简洁
- 注释说明“为什么”和“做什么”,避免解释“怎么做”。
- 统一风格
- 团队统一中文或英文。
- 行内注释与代码间空一格。
- 注释首字母大写。
- 分层注释
- 文件头 → 模块/类 → 函数/方法 → 关键逻辑行内 → TODO/FIXME
- 工具辅助
- 推荐 ESLint +
eslint-plugin-jsdoc,强制函数必须有 JSDoc 注释。
二、文件头模板(File Header)
/**
* @file 文件名.js
* @description 文件功能简介
* @author 作者名
* @date YYYY-MM-DD
* @version 版本号
* @license 许可信息(可选)
*/
示例:
/**
* @file userController.js
* @description 用户模块控制器,处理注册、登录及信息管理
* @author ZhangYaLong
* @date 2026-03-29
* @version 1.0.0
*/
三、类/模块注释模板(Class/Module)
/**
* 类名/模块名
* 功能描述
* 注意事项或使用说明
*/
class ClassName {}
示例:
/**
* UserService 类
* 提供用户增删改查及认证功能
* 注意:所有方法均异步执行
*/
class UserService {}
四、函数/方法注释模板(JSDoc 标准)
/**
* 功能描述
* @async (可选,异步函数)
* @param {类型} 参数名 - 参数说明
* @param {类型} 参数名.prop - 对象属性说明
* @returns {类型} 返回值说明
* @throws {Error} 异常说明
* @deprecated (可选,废弃方法)
* @example (可选,使用示例)
*/
示例:
/**
* 根据用户ID获取用户信息
* @async
* @param {number} userId - 用户ID
* @returns {Promise<Object>} 用户信息对象
* @throws {Error} 当用户不存在时抛出异常
* @example
* const user = await getUserById(123);
*/
async function getUserById(userId) {}
五、行内注释规范(Inline Comment)
- 仅在关键逻辑或复杂算法处使用。
- 单行注释使用
//,多行注释使用/* ... */。 - 注释与代码间空一格。
- 避免注释显而易见的代码。
示例:
// 将日期格式化为 YYYY-MM-DD
const formattedDate = date.toISOString().slice(0, 10);
六、TODO / FIXME 注释规范
// TODO: 待实现的功能描述
// FIXME: 待修复的问题描述
示例:
// TODO: 用户登录失败超过5次应锁定账户
// FIXME: 密码加密逻辑性能低,需要优化
七、异步函数 / 回调函数模板
/**
* 异步操作示例
* @async
* @param {Function} callback - 回调函数
* @returns {Promise<void>}
*/
export async function doAsyncTask(callback) {
try {
const result = await someAsyncOperation();
callback(null, result);
} catch (err) {
callback(err);
}
}
八、Controller / Service / Model 模板(AI 可直接套用)
Controller 模板
/**
* @file 模块名Controller.js
* @description 控制器,处理接口请求逻辑
* @author 作者名
* @date YYYY-MM-DD
* @version 1.0.0
*/
import { ModuleService } from '../service/moduleService.js';
export class ModuleController {
constructor() {
this.service = new ModuleService();
}
/**
* 示例接口方法
* @async
* @param {Object} ctx - 请求上下文
* @returns {Promise<void>}
*/
async exampleMethod(ctx) {
try {
const data = await this.service.exampleService();
ctx.body = { success: true, data };
} catch (err) {
ctx.status = 400;
ctx.body = { success: false, message: err.message };
}
}
}
Service 模板
/**
* @file moduleService.js
* @description 服务层,处理业务逻辑
* @author 作者名
* @date YYYY-MM-DD
* @version 1.0.0
*/
export class ModuleService {
/**
* 示例业务方法
* @async
* @returns {Promise<Object>} 返回结果
*/
async exampleService() {
// TODO: 实现业务逻辑
return { message: '示例数据' };
}
}
Model 模板
/**
* @file moduleModel.js
* @description 数据模型层,封装数据库操作
*/
export class ModuleModel {
/**
* 根据 ID 查询数据
* @param {number} id - 数据ID
* @returns {Promise<Object|null>} 数据对象或 null
*/
static async findById(id) {
// TODO: 数据库查询逻辑
return null;
}
/**
* 创建数据
* @param {Object} data - 数据对象
* @returns {Promise<Object>} 创建成功对象
*/
static async create(data) {
// TODO: 数据库写入逻辑
return data;
}
}
九、工具函数模板(Utils)
/**
* @file utils.js
* @description 工具函数集合
*/
/**
* 格式化日期为 YYYY-MM-DD
* @param {Date|string} date - 日期对象或字符串
* @returns {string} 格式化后日期
*/
export function formatDate(date) {
const d = date instanceof Date ? date : new Date(date);
return d.toISOString().slice(0, 10);
}
/**
* 获取当前时间戳(秒)
* @returns {number} 当前时间戳
*/
export function nowTimestamp() {
return Math.floor(Date.now() / 1000);
}
✅ 使用方法
- AI 自动生成代码时:
- 文件头模板 → 自动写入文件名/作者/日期
- 类/函数模板 → 套用 JSDoc 标准
- 行内注释 → AI 生成关键逻辑时自动生成
- TODO/FIXME → 标记 AI 未实现部分
- ESLint +
eslint-plugin-jsdoc可辅助检查规范 - 所有模块可直接复制粘贴使用