用途:这是 Bitwarden 客户端仓库的代码约定说明,面向使用 Angular 与 TypeScript 编写 Web、浏览器及桌面客户端代码的场景,尤其是新建组件、服务或修改现有客户端应用时。
主要能力与关键约定:
- libs/common 不能依赖 Angular 的依赖注入、装饰器或生命周期钩子(CLI 是同等重要的客户端),因此跨客户端服务以抽象类充当接口,具体实现(Default*、Web*、Browser*、Desktop*、Cli*)置于各自应用。
- 组件保持“瘦”,只放视图逻辑,业务逻辑放进服务;避免跨客户端继承组件,改用共享子组件组合。
- 新组件必须使用 ChangeDetectionStrategy.OnPush 且 standalone: true,NgModule 仅用于聚合相关独立组件。
- Angular 原语用 inject() 做依赖注入;与 CLI 共享的代码使用构造函数注入。
- 新模板使用控制流语法 @if、@for、@switch,而非结构型指令;用 host 属性代替 @HostBinding / @HostListener;只用响应式表单。
- 组件局部状态和仅 Angular 服务用 Signals;跨客户端服务(libs/common)用 RxJS。避免手动订阅,优先 | async,必要时用 takeUntilDestroyed()。
- 不使用 TypeScript 枚举,改用 Object.freeze() 加 as const 的冻结常量对象并配类型别名。
- 文件命名采用 kebab-case,如 .component.ts、.service.ts、.pipe.ts、.directive.ts,模型用 .request.ts、.response.ts、.view.ts、.data.ts。
- 所有 Tailwind 类必须带 tw- 前缀。测试使用 Jest,配合 jest-mock-extended,用 describe/it 而非 test()。
使用方式:修改已有文件时遵循该文件既有的模式,不主动做现代化迁移(如 *ngIf 改 @if、@Input/@Output 改信号、构造函数注入改 inject()、默认变更检测改 OnPush、NgModule 改独立组件);如被要求迁移,按 standalone → 控制流 → input/output 信号 → 视图查询 → 信号 → computed → OnPush(最后)的顺序进行。
限制:以上为仓库内部约定,具体执行受 lint 规则约束;资料未提供版本、安装命令或收费信息。