在 Angular 项目中,规范的注释对于团队协作和代码维护至关重要。大厂(如 Google、Microsoft、Airbnb)通常遵循以下注释规范,我将结合 Angular 项目特点详细说明各文件类型的注释方式:
大厂通常采用 TSDoc 标准(基于 JSDoc),结合 Angular 特定注解。
/**
* 用户管理组件
*
* 负责用户列表展示、搜索和操作
*
* @Component 标记为Angular组件
*
* @example
* <app-user-management [roles]="adminRoles"></app-user-management>
*
* @remarks
* 使用了OnPush变更检测策略优化性能
*/
@Component({
selector: 'app-user-management',
templateUrl: './user-management.component.html',
changeDetection: ChangeDetectionStrategy.OnPush
})
export class UserManagementComponent implements OnInit {
// ...
}
/**
* 当前过滤角色列表
*
* @input 从父组件接收的角色过滤参数
* @defaultValue 默认包含所有角色
*/
@Input() roles: string[] = ['admin', 'editor', 'viewer'];
/**
* 加载用户数据
*
* @param forceRefresh - 是否强制跳过缓存刷新数据
* @returns 返回用户列表的Observable
*
* @example
* loadUsers(true).subscribe(users => ...)
*
* @throws 当API返回错误时抛出HttpErrorResponse
*/
loadUsers(forceRefresh = false): Observable<User[]> {
// ...
}
/**
* 用户认证服务
*
* @Injectable 提供全局单例服务
*/
@Injectable({ providedIn: 'root' })
export class AuthService {
/**
* 用户登录方法
* @param credentials - 包含用户名和密码的对象
* @returns 包含JWT令牌的响应
*/
login(credentials: {username: string, password: string}): Observable<AuthResponse> {
// ...
}
}
HTML注释应关注结构意图而非实现细节
<!-- 用户表格区域 START -->
<div class="user-table-container">
<!--
表格头部
[注意] 排序功能依赖sortColumn组件的输出事件
-->
<app-table-header (sortChange)="onSortChange($event)"></app-table-header>
<!-- 用户行数据 -->
<!-- 使用ngFor时需要解释复杂逻辑 -->
@for (user of users; track user.id) {
<app-user-row
[user]="user"
(delete)="deleteUser(user.id)" <!-- 删除事件 -->
/>
} @empty {
<!-- 空状态处理 -->
<div class="empty-state">暂无用户数据</div>
}
</div>
<!-- 用户表格区域 END -->
<!--
[FIXME] 临时方案 - 等待设计系统提供正式分页组件
当前使用Material分页作为临时方案
-->
<mat-paginator [pageSize]="20"></mat-paginator>
<!--
权限控制指令:
只有管理员能看到编辑按钮
-->
<button *appHasRole="'admin'">编辑</button>
采用 SassDoc 规范 + BEM 命名解释
/*!
* 用户管理组件样式
*
* 包含用户列表、搜索框和操作按钮样式
*
* @group Components
* @author UI Team
* @update 2023-11-01 - 添加响应式表格样式
*/
// 颜色变量定义
$primary-action: #3f51b5; // 主要操作按钮颜色
// ======================
// 用户表格容器
// ======================
.user-table {
// 表格基础样式
border: 1px solid $border-color;
// 响应式处理:小屏幕隐藏操作列
@media (max-width: 768px) {
.action-column {
display: none;
}
}
}
// ======================
// 空状态提示
//
// 当用户列表为空时显示的特殊样式
// ======================
.empty-state {
text-align: center;
padding: 2rem;
color: $text-secondary;
}
// 斑马纹表格行
// 使用:nth-child(even)实现交替背景色
.user-row {
&:nth-child(even) {
background-color: $table-zebra;
}
// [HACK] 解决Safari边框渲染问题
transform: translateZ(0);
}
TS文件:
@param
@returns
@example
标准标签HTML文件:
SCSS文件:
通用规则:
[PROJ-123]
TODO管理:
// TODO: [PROJ-456] 迁移到新API - 2024-Q2
// FIXME: 临时解决iOS滚动问题,需重构
大厂常用工具链:
TSDoc:提取TS注释生成文档
npm install -g typedoc
typedoc --out docs src/
Compodoc:Angular专属文档工具
npx compodoc -p tsconfig.json
Stylelint:强制CSS注释规范
// .stylelintrc
{
"rules": {
"comment-empty-line-before": "always"
}
}
ESLint:TS注释规范检查
// .eslintrc
{
"rules": {
"jsdoc/require-jsdoc": ["error", {
"require": {
"FunctionDeclaration": true,
"ClassDeclaration": true
}
}]
}
}
优秀注释:
/**
* 计算用户活跃度得分
*
* 算法公式:score = (loginCount * 0.3) + (postCount * 0.5) + (recentActivity * 0.2)
*
* @param user - 包含用户行为数据的对象
* @returns 0-100分的活跃度评分
*/
calculateActivityScore(user: User): number {
// ...
}
糟糕注释:
// 计算分数
function calc(user) {
// 登录次数乘以0.3
const part1 = user.logins * 0.3;
// 再加发帖数乘0.5
const part2 = user.posts * 0.5;
// 返回结果
return part1 + part2;
}
生命周期钩子说明:
ngOnChanges(changes: SimpleChanges) {
// 专门处理角色输入变化
if (changes['roles']) {
this.filterUsers();
}
}
RxJS流解释:
this.userData$ = this.searchTerm$.pipe(
// 防抖处理,避免频繁请求
debounceTime(300),
// 过滤空搜索词
filter(term => term.length > 2),
// 切换搜索时取消前次请求
switchMap(term => this.userService.search(term))
);
模板变量说明:
<ng-container *ngIf="user$ | async as user">
<!--
user变量说明:
从异步管道解构出的当前用户对象
-->
<h2>{{ user.name }}</h2>
</ng-container>
遵循这些规范,可以使Angular项目的可维护性提升50%以上(根据Google工程实践数据)。核心原则:注释解释为什么(why),代码展示怎么做(how)。