1. Angular 的依赖注入容器与模块化体系(NgModule/Standalone)的演进,Standalone 何时必选?
Angular 的依赖注入容器与模块化体系是如何从 NgModule 演进到 Standalone 的?Standalone 组件在哪些场景下是必选方案?
- NgModule 的声明、导入、提供者与导出四类职责
- Standalone 组件自包含依赖(imports/providers)的形态
- 引导方式差异(bootstrapApplication vs bootstrapModule)与必选场景
NgModule 是 Angular 14 引入 Standalone 之前的主要模块化单元,同时承担声明组件/指令/管道、导入依赖模块、配置依赖注入提供者与导出公共 API 四类职责,缺点是样板代码多、依赖边界隐式、不利于 tree-shaking。Standalone 组件自 Angular 15 起稳定,组件直接在 @Component 装饰器的 imports 数组中声明自身依赖、providers 中声明注入服务,不再需要 NgModule 包装,依赖边界显式清晰,Angular 19 起成为默认推荐形态。
Standalone 必选的场景包括:新项目默认全部使用(官方推荐路径);开发共享组件库或第三方库(避免强制消费方为单个组件创建 NgModule);微前端与按需加载场景(loadChildren 可以直接指向 Standalone 组件作为懒加载入口);以及希望减少样板、提升编译与摇树优化的项目。NgModule 仅在维护遗留代码、或确实需要其高级能力(如 useExisting 别名集中管理、统一导入导出的既有约定)时保留。
本题考察对 Angular 模块化演进主线的理解:从"集中式模块声明"走向"组件自包含依赖"。回答的关键是既讲清 NgModule 的职责构成,也讲清 Standalone 的边界优势与必选场景,体现对官方演进方向的把握。
// Angular 19 的 Standalone 引导方式
bootstrapApplication(AppComponent, {
providers: [provideRouter(routes), provideHttpClient()]
});