【发布时间】:2026-01-10 01:45:02
【问题描述】:
当我们使用angular-cli 命令创建Component、Pipe 时,CLI 会自动将它们添加到特定模块的声明数组中,为什么在服务的情况下不会发生这种情况。
【问题讨论】:
标签: angular dependency-injection angular-cli angular-di
当我们使用angular-cli 命令创建Component、Pipe 时,CLI 会自动将它们添加到特定模块的声明数组中,为什么在服务的情况下不会发生这种情况。
【问题讨论】:
标签: angular dependency-injection angular-cli angular-di
在 Angular 5 之前,您需要将服务添加到 Angular 模块的 providers 数组中,以将其注册到 Angular 模块的注入器。
从 Angular 6 开始,服务变成了可摇树的。
什么是摇树?
嗯,简单来说,这意味着如果您没有针对特定服务的导入语句,那么它将不会作为捆绑包的一部分添加。这将导致相对较小的包大小。
为什么在 Angular 6 之前 Angular 服务不能摇树?
在 Angular 6 之前,您需要将服务添加到 Angular 模块的
providers数组中,以便将它们注册到服务的注入器中。为此,您必须在文件顶部添加import语句才能实际引用该服务。这将使它不可摇树。但是在
@Injectable装饰器的元数据中引入providedIn字段后,这在 Angular 6 中发生了变化。如果将其设置为一个值(例如'root'),则该服务将注册为依赖注入(在本例中为根注入器)。并且由于它会在注入器上注册以进行依赖注入,因此我们不必显式地将其添加到 Angular 模块的
providers数组中,因为它反过来会做完全相同的事情。并且不需要将其添加到声明数组中意味着,不需要在文件顶部为其添加import语句。这反过来会使服务在不使用时可摇晃。
所以要回答您的问题,如果您通过 Angular CLI 在版本 6.x.x 或更高版本上生成此服务,则该服务很可能是通过将 providedIn: 'root' 添加到 @Injectable 装饰器来生成的。所以它没有被添加到 Angular 模块的 providers 数组中。
【讨论】:
declarations 数组中。 declarations 数组仅适用于 Components、Directives 和 Pipes 等可声明对象。
declarations 数组中没有位置。 declarations 数组仅适用于 declarables,例如 Components、Pipes 和 Directives。您可以阅读有关declarations 数组here on the Angular Docs 的更多信息。 ?
providers 数组添加服务的问题,只要服务将providedIn 标志设置为'root' 和要将其注册为 Injectable 的模块的名称。这是自 Angular 6 以来发生的变化,当时通过在我们传递给 @Injectable 装饰器的元数据对象上引入 providedIn 字段使服务可摇树摇晃。
@Injectable 装饰器上设置 providedIn 字段,要么必须将服务添加到 @987654355 @ Angular 模块的数组。检查this Sample StackBlitz 以更好地理解这一点。希望这可以帮助。 ?