注释规范.md 7.1 KB

在 Angular 项目中,规范的注释对于团队协作和代码维护至关重要。大厂(如 Google、Microsoft、Airbnb)通常遵循以下注释规范,我将结合 Angular 项目特点详细说明各文件类型的注释方式:


一、TypeScript (.ts) 文件注释规范

大厂通常采用 TSDoc 标准(基于 JSDoc),结合 Angular 特定注解。

1. 类与组件注释

/**
 * 用户管理组件
 * 
 * 负责用户列表展示、搜索和操作
 * 
 * @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 {
  // ...
}

2. 属性注释

/** 
 * 当前过滤角色列表 
 * 
 * @input 从父组件接收的角色过滤参数
 * @defaultValue 默认包含所有角色
 */
@Input() roles: string[] = ['admin', 'editor', 'viewer'];

3. 方法注释

/**
 * 加载用户数据
 * 
 * @param forceRefresh - 是否强制跳过缓存刷新数据
 * @returns 返回用户列表的Observable
 * 
 * @example
 * loadUsers(true).subscribe(users => ...)
 * 
 * @throws 当API返回错误时抛出HttpErrorResponse
 */
loadUsers(forceRefresh = false): Observable<User[]> {
  // ...
}

4. 服务方法注释

/**
 * 用户认证服务
 * 
 * @Injectable 提供全局单例服务
 */
@Injectable({ providedIn: 'root' })
export class AuthService {
  /**
   * 用户登录方法
   * @param credentials - 包含用户名和密码的对象
   * @returns 包含JWT令牌的响应
   */
  login(credentials: {username: string, password: string}): Observable<AuthResponse> {
    // ...
  }
}

二、HTML (.html) 模板注释规范

HTML注释应关注结构意图而非实现细节

1. 区块注释

<!-- 用户表格区域 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>

2. 指令解释

<!-- 
  权限控制指令:
  只有管理员能看到编辑按钮
-->
<button *appHasRole="'admin'">编辑</button>

三、SCSS (.scss) 样式注释规范

采用 SassDoc 规范 + BEM 命名解释

1. 文件头部注释

/*!
 * 用户管理组件样式
 * 
 * 包含用户列表、搜索框和操作按钮样式
 * 
 * @group Components
 * @author UI Team
 * @update 2023-11-01 - 添加响应式表格样式
 */

// 颜色变量定义
$primary-action: #3f51b5;  // 主要操作按钮颜色

2. 区块样式注释

// ======================
// 用户表格容器
// ======================
.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;
}

3. 复杂样式解释

// 斑马纹表格行
// 使用:nth-child(even)实现交替背景色
.user-row {
  &:nth-child(even) {
    background-color: $table-zebra;
  }
  
  // [HACK] 解决Safari边框渲染问题
  transform: translateZ(0);
}

四、大厂注释规范核心原则

  1. TS文件

    • 公共API必须文档化(组件/服务/管道)
    • 使用 @param @returns @example 标准标签
    • 复杂逻辑添加实现思路说明
  2. HTML文件

    • 解释模板结构而非复制代码逻辑
    • 标记临时方案([HACK]/[FIXME])
    • 说明自定义指令的用途
  3. SCSS文件

    • 记录重要样式决策原因
    • 标记浏览器hack和兼容处理
    • 分组相关样式并添加标题
  4. 通用规则

    • 避免无效注释:不写"这里设置变量"这类废话
    • 问题追踪:关联JIRA编号 [PROJ-123]
    • 变更记录:重要修改添加日期和作者
    • TODO管理

      // TODO: [PROJ-456] 迁移到新API - 2024-Q2
      // FIXME: 临时解决iOS滚动问题,需重构
      

五、注释工具与自动化

大厂常用工具链:

  1. TSDoc:提取TS注释生成文档

    npm install -g typedoc
    typedoc --out docs src/
    
  2. Compodoc:Angular专属文档工具

    npx compodoc -p tsconfig.json
    
  3. Stylelint:强制CSS注释规范

    // .stylelintrc
    {
     "rules": {
       "comment-empty-line-before": "always"
     }
    }
    
  4. ESLint:TS注释规范检查

    // .eslintrc
    {
     "rules": {
       "jsdoc/require-jsdoc": ["error", {
         "require": {
           "FunctionDeclaration": true,
           "ClassDeclaration": true
         }
       }]
     }
    }
    

六、优秀注释 vs 糟糕注释示例

优秀注释

/**
 * 计算用户活跃度得分
 * 
 * 算法公式: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;
}

七、Angular特定注释技巧

  1. 生命周期钩子说明

    ngOnChanges(changes: SimpleChanges) {
    // 专门处理角色输入变化
    if (changes['roles']) {
    this.filterUsers();
    }
    }
    
  2. RxJS流解释

    this.userData$ = this.searchTerm$.pipe(
    // 防抖处理,避免频繁请求
    debounceTime(300),
    // 过滤空搜索词
    filter(term => term.length > 2),
    // 切换搜索时取消前次请求
    switchMap(term => this.userService.search(term))
    );
    
  3. 模板变量说明

    <ng-container *ngIf="user$ | async as user">
    <!-- 
    user变量说明:
    从异步管道解构出的当前用户对象
    -->
    <h2>{{ user.name }}</h2>
    </ng-container>
    

遵循这些规范,可以使Angular项目的可维护性提升50%以上(根据Google工程实践数据)。核心原则:注释解释为什么(why),代码展示怎么做(how)