Angular 核心与工程实践

共 17 题
#

1. Angular 的依赖注入容器与模块化体系(NgModule/Standalone)的演进,Standalone 何时必选?

A 必须声明在某个 NgModule 中才能被使用
B 只能在路由配置中声明依赖,无法在组件内声明
C 通过 @Component 的 imports 数组直接引用其他独立组件、指令与管道 ✓ 正确答案
D 依赖只能通过全局 provide 注册,不能写在组件上
#

2. Angular 变更检测(Zone.js vs Signals)的原理,onPush 策略如何正确使用?

A 修改输入对象内部字段后会自动触发视图更新
B 信号是 zoneless 变更检测的基础设施,可减少不必要的变更检测 ✓ 正确答案
C Zone.js 只对 Promise 打补丁,其他异步 API 不受影响
D onPush 组件设置后模板永远不会再更新
#

3. Angular 依赖注入的作用域层级(root/平台/组件)与 provide 函数的现代写法?

A provideIn: 'root' 的服务每次注入都会创建新实例
B provide 系列函数比传统 providers 写法的类型检查更弱
C 组件级提供者创建的实例生命周期跟随组件,组件销毁时一并释放 ✓ 正确答案
D provide 函数只能在模块级使用
#

4. Angular 19+ 的模板新语法,@let 局部变量、@if/@for/@defer 控制流与事件重放(event replay)在企业模板升级中的工程价值?

A 事件重放会在水合前丢弃用户的所有点击
B 会在组件声明时立即加载所有被延迟的组件
C @let 用于在组件类中声明成员变量
D @defer 可按触发条件懒加载组件块,削减首屏包体 ✓ 正确答案
#

5. RxJS 在 Angular 中的核心地位,表单、路由守卫与状态流如何用 Observable 组织?

A AsyncPipe 订阅后必须手动调用 unsubscribe 清理
B 响应式表单的 valueChanges 是只发射一次的同步事件
C BehaviorSubject 不保存当前值,只广播新值
D 路由守卫可以返回 Observable 来完成异步鉴权判断 ✓ 正确答案
#

6. Angular 表单(模板驱动/响应式)的校验与性能要点?

A onPush 组件中无法使用响应式表单
B 模板驱动表单需要手动构建 FormControl 模型
C 异步校验器会同步阻塞表单交互
D 响应式表单的校验器是纯函数,便于组合与单元测试 ✓ 正确答案
#

7. Angular 的懒加载、预加载与渲染模式(SSR/Prerender)如何选型?

A 自定义 PreloadingStrategy 可以按条件决定预加载哪些路由 ✓ 正确答案
B Prerender 适合高频个性化内容较多的应用
C loadChildren 会在应用启动时加载所有路由模块
D SSR 与路由懒加载不能同时使用
#

8. Angular 控制流语法(@if/@for/@defer)与旧 *ngIf/*ngFor 的性能差异?

A *ngFor 不提供 trackBy 时也会自动做 keyed 复用
B 内置 @for 支持 track 表达式,可优化列表更新的 DOM 复用 ✓ 正确答案
C @defer 与按需加载无关,只影响样式
D 内置控制流无法对模板表达式做类型收窄
#

9. Angular SSR 与 Hydration、Event Replay 的工程配置?

A provideClientHydration() 用于开启客户端水合,复用服务端渲染的 DOM ✓ 正确答案
B 服务端渲染出的 HTML 不会发送给浏览器
C Event Replay 会在水合前直接丢弃用户点击
D SSR 场景下服务端请求过的数据客户端必须重新请求一遍
#

10. Angular 的 DI 体系,providers 层级与注入令牌?

A 组件可以从兄弟组件的注入器中直接获取服务实例
B InjectionToken 用于标识非类类型的依赖,避免字符串魔法值冲突 ✓ 正确答案
C useValue 提供者不能用于注入配置对象
D 依赖解析是自上而下进行的
#

11. Angular 18+/20 的新特性(Control Flow、defer、Signals 全链路)对企业项目升级的影响?

A 移除 Zone.js 对依赖异步回调更新视图的旧代码没有影响
B Angular 19 仍强制要求所有组件声明在 NgModule 中
C ng update 提供自动化迁移工具帮助升级新特性 ✓ 正确答案
D Signals 与 RxJS 互不兼容,不能一起使用
#

12. Angular 表单(响应式)的 ValueChanges 与异步校验的性能陷阱?

A valueChanges 只在表单提交时发射一次
B 异步校验订阅链中使用 switchMap 可以避免过期结果覆盖新结果 ✓ 正确答案
C 订阅 valueChanges 不需要在组件销毁时清理
D debounceTime 会提高 valueChanges 的发射频率
#

13. Angular 的信号(Signals),响应式新机制?

A computed() 每次被读取都会重新计算
B 信号写入会触发整棵组件树的全量变更检测
C 信号只能在组件类内部使用,无法跨组件共享
D effect() 自动跟踪其读取的信号,依赖变化时重新执行 ✓ 正确答案
#

14. Angular 的变更检测,Zone.js 与 zoneless?

A 信号是 Angular zoneless 变更检测的关键基础设施 ✓ 正确答案
B zoneless 模式仍然依赖 Zone.js 打补丁来触发检测
C Zone.js 能够精确知道哪个组件需要更新
D AsyncPipe 与 zoneless 变更检测没有关系
#

15. Angular 的模块与独立组件,NgModule vs standalone?

A NgModule 比 standalone 更利于 tree-shaking 优化
B standalone 组件必须声明在某个 NgModule 中才能被路由懒加载
C standalone 组件通过 imports 数组直接声明自身依赖,无需 NgModule 包装 ✓ 正确答案
D standalone 与 NgModule 无法在同一个应用中混用
#

16. Angular 的 RxJS,响应式状态与异步处理?

A BehaviorSubject 只会发射初始值,之后不再广播
B HttpClient 的 get 方法返回的是 Promise
C async 管道会自动管理 Observable 的订阅与退订 ✓ 正确答案
D toSignal 是 Vue 框架提供的 API
#

17. Angular 的全局错误处理,自定义 ErrorHandler、Zone 错误与 signals 时代错误边界的设计?

A ErrorHandler 会自动渲染用户可见的错误提示界面
B 自定义 ErrorHandler 常用于全局日志采集与监控上报 ✓ 正确答案
C @defer 没有 error 状态可处理懒加载失败
D signals 时代 effect 内抛出的错误会被框架自动忽略