Angular6中@Injectable的provideIn与模块providers选型疑问
Angular摇树优化下:
providedIn: TestModule vs 模块providers数组的选择 嘿,这个问题其实挺常见的,尤其是刚接触Angular依赖注入和摇树优化的同学!咱们一步步来拆解两种配置的差异,以及为什么其中一种更适合你的场景:
优先选@Injectable({ providedIn: TestModule })的原因
这是Angular官方推荐的现代写法,核心优势就是完美适配摇树优化(tree-shaking):
- 摇树友好:当你用这种方式声明服务时,编译器能精准判断TestService是否被实际使用。如果TestModule本身没被应用引入,或者模块里没有任何组件/服务依赖TestService,那么TestService的代码会被直接从最终打包产物里移除,不会造成冗余体积。
- 减少重复配置:不需要再手动在
TestModule的providers数组里添加服务,避免了重复维护的麻烦,也降低了漏加/错加的概率。 - 自动适配懒加载:如果
TestModule是懒加载模块,TestService会自动成为该懒加载模块的私有服务,不会注入到根注入器里,避免了不必要的全局服务实例。
为什么不推荐模块providers: [TestService]?
这种是Angular早期的传统写法,在摇树优化场景下有明显劣势:
- 无法被摇树:只要
TestModule被引入到应用中,不管TestService有没有被实际使用,它都会被打包进产物。因为编译器无法区分这个服务是模块必须的,还是冗余配置的,只能默认保留。 - 维护成本更高:每次调整服务的归属模块,都需要手动修改对应模块的
providers数组,容易出现配置不一致的问题。
总结
如果你追求最优的打包体积,想充分利用摇树优化的能力,优先选择@Injectable({ providedIn: TestModule })。只有在一些特殊场景(比如需要使用useClass/useFactory等复杂提供者配置,或者需要兼容Angular 6之前的版本),才考虑使用模块providers数组的方式。
内容的提问来源于stack exchange,提问作者d.zurico
相关产品推荐
相关产品推荐

