【问题标题】:Why doesn't Angular CLI add services in providers array automatically?为什么 Angular CLI 不会自动在提供者数组中添加服务?
【发布时间】:2026-01-10 01:45:02
【问题描述】:

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

【问题讨论】:

    标签: angular dependency-injection angular-cli angular-di


    【解决方案1】:

    在 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 数组中。

    【讨论】:

    • 我还要添加一件事:使用最新的 Angular。提供者(服务)使用 @injectable({providedIn: 'root'}) 装饰器在根级别自动注册。如果您想在组件级别注册服务,则必须删除“{providedIn: 'root'}”。
    • @SurenSaluka,CLI 永远不会将服务添加到 declarations 数组中。 declarations 数组仅适用于 Components、Directives 和 Pipes 等可声明对象。
    • @SurenSaluka,正如我所说,Angular 服务在declarations 数组中没有位置。 declarations 数组仅适用于 declarables,例如 Components、Pipes 和 Directives。您可以阅读有关declarations 数组here on the Angular Docs 的更多信息。 ?
    • @SurenSaluka,回答您关于需要向providers 数组添加服务的问题,只要服务将providedIn 标志设置为'root' 和要将其注册为 Injectable 的模块的名称。这是自 Angular 6 以来发生的变化,当时通过在我们传递给 @Injectable 装饰器的元数据对象上引入 providedIn 字段使服务可摇树摇晃。
    • @SurenSaluka,长话短说,您要么必须在服务的 @Injectable 装饰器上设置 providedIn 字段,要么必须将服务添加到 @987654355 @ Angular 模块的数组。检查this Sample StackBlitz 以更好地理解这一点。希望这可以帮助。 ?
    最近更新 更多