6

当我们使用命令创建Component时,CLI 会自动将它们添加到特定模块的声明数组中,为什么在服务的情况下不会发生这种情况。Pipeangular-cli

4

1 回答 1

12

在 Angular 5 之前,您需要将服务添加到providersAngular 模块的数组中,以将其注册到 Angular 模块的注入器上。

从 Angular 6 开始,服务变成了可摇树的。

什么是摇树?

好吧,简单来说,这意味着如果您没有针对特定服务的导入语句,那么它将不会作为捆绑包的一部分添加。这将导致相对较小的捆绑包大小。

为什么在 Angular 6 之前 Angular 服务不能摇树?

在 Angular 6 之前,您需要将服务添加到providersAngular 模块的数组中,以便将它们注册到服务的注入器上。为了做到这一点,您必须import在文件顶部添加一条语句以实际引用该服务。这将使它不可摇树。

但是在 Angular 6 中,在装饰器的元数据中引入了该providedIn字段后,这种情况发生了变化。@Injectable如果将其设置为一个值('root'例如),则该服务将注册为依赖注入(在这种情况下为根注入器)。

而且由于它将在注入器上注册以进行依赖注入,因此我们不必显式地将其添加到providersAngular 模块的数组中,因为它反过来会做完全相同的事情。并且不需要将其添加到声明数组中意味着不需要import在文件顶部为其添加语句。

如果不使用,这反过来会使服务树摇晃。

因此,为了回答您的问题,如果您通过 Angular CLI 在版本 6.xx 或更高版本上生成此服务,那么该服务很可能是通过providedIn: 'root'添加到@Injectable装饰器中生成的。所以它没有被添加到providersAngular 模块的数组中。

于 2018-09-01T19:52:15.087 回答