Angular v14/v15中providedIn除'root'外还有其他有效选项吗?
Angular
providedIn 属性有效值及相关疑问解答 核心问题:providedIn 除了 'root' 还有其他可用选项吗?
在 Angular v14/v15 弃用 providedIn: 'any' 和 providedIn: NgModule 后,providedIn 仍有以下有效值:
'root':根注入器级别单例,服务会被注入到根注入器,整个应用共享一个实例,支持摇树优化。'platform':平台级别的单例,适用于同一页面存在多个 Angular 应用的场景,所有应用共享同一个服务实例,同样支持摇树优化。- 具体注入令牌/服务类:可以指定另一个服务或自定义注入令牌作为提供范围,比如
providedIn: UserService,此时当前服务会成为目标令牌的依赖,只有当目标令牌被注入时才会被实例化,也支持摇树优化。
额外疑问:providedIn 属性是否会消失?未来默认行为如何?
目前 Angular 官方没有移除 providedIn 属性的计划,因为它仍承担着不同范围服务提供的核心功能(比如平台级别单例、令牌关联提供等)。未来也不会强制所有服务默认使用 providedIn: 'root',不同场景仍需要不同的提供策略,比如跨应用共享的服务就需要指定 'platform'。
相关疑问:懒加载模块中通过 NgModule.providers 提供的服务是否会被懒加载?
这个推测是正确的:如果服务在懒加载模块的 NgModule.providers 中声明,该服务会随懒加载模块一起被延迟加载,只有当模块被路由触发加载时,服务才会被实例化。不过需要注意,这类服务不支持摇树优化——Angular 无法提前判断该懒加载模块是否会被使用,因此不会将未使用的这类服务从打包产物中移除。
内容的提问来源于stack exchange,提问作者Jim Cooper
相关产品推荐
相关产品推荐

