Angular 6 引入了可摇树的提供程序
@Inject({provideIn:'...'}
句法。
为了利用 tree-shaking 方面的优势,我是直接通过构造函数还是通过 Injector 注入服务有区别吗?
例子:
服务:
@Inject({provideIn:'...'}
class MyService {}
消费者1:
@Component()
class MyComponent {
constructor(s: MyService) {}
}
消费者2:
@Component()
class MyComponent {
constructor(@Inject(Injector) aInjector: Injector) {
const s: MyService = aInjector.get(MyService);
}
}
在这两种情况下,MyService 都会被注入。我希望只有在第一种情况下,AOT 编译器才能确定该服务是通过静态分析使用的。
如果我使用第二个版本会有什么影响?AOT 会检测到 Injector 的注入,然后基本上跳过提供程序的摇树吗?或者它是否足够聪明地检测到 MyService 是从注入器中获取的?