用途:该技能提供 Bitwarden clients 单体仓库的客户端代码约定,供在 Angular 与 TypeScript 环境下创建组件、服务或修改代码时参考。
仓库结构:apps/web、apps/browser、apps/desktop、apps/cli 为客户端应用;libs/common 为所有客户端(含 CLI)共享代码,不得依赖 Angular;libs/angular 仅用于可视化客户端;libs/components 为 Angular 组件库。因 CLI 是一等客户端,libs/common 不能使用 Angular 的依赖注入、装饰器或生命周期钩子,跨客户端服务以抽象类作接口,具体实现(Default*、Web*、Browser*、Desktop*、Cli*)放在各自应用中。
架构原则:组件保持轻薄,只含视图逻辑,业务逻辑放入服务;优先组合而非继承,避免跨客户端继承组件;除非明确要求,不要现代化既有代码,修改现有文件时沿用该文件已有模式。
状态管理:组件本地状态与纯 Angular 服务用 Signals;跨客户端服务(libs/common)用 RxJS。避免手动订阅,优先使用 async 管道;必须订阅时通过 takeUntilDestroyed()。不使用 TypeScript enum,改用 Object.freeze() 与 as const 的冻结常量对象加类型别名。
新代码关键规则:新组件必须使用 ChangeDetectionStrategy.OnPush 且 standalone: true;Angular 原语优先用 inject(),与 CLI 共享的代码用构造函数注入;新模板使用 @if、@for、@switch 控制流语法;使用组件装饰器的 host 属性而非 @HostBinding/@HostListener;仅用响应式表单;文件命名采用 kebab-case 加 .component.ts、.service.ts、.pipe.ts、.directive.ts 等后缀;所有 Tailwind 类需加 tw- 前缀;测试用 Jest 与 jest-mock-extended,使用 describe/it;从 @bitwarden/common 导入不得引入 Angular 专属代码。
限制:资料未提供安装命令、收费信息或具体平台支持范围。