Angular模块剖析

来自菜鸟教程
跳转至:导航、​搜索

在 Angular 中,我们使用称为 NgModules 的模块来充当将应用程序或应用程序中的功能粘合在一起的单元。 所有 Angular 应用程序都有一个根模块,即应用程序模块,它负责将整个应用程序统一在一起。 将应用程序的各个功能分解到自己的模块中也是一种最佳实践。 这种做法可以实现诸如 延迟加载预加载 某些功能。

这篇文章涵盖了 Angular 2+ 中的 NgModules


不要将 Angular 模块与 ES6 模块 混淆。 它们是两个不同的东西。


这是一个准系统 NgModule 的样子:

// ...ES6 module imports

@NgModule({
  declarations: [ ... ],
  imports: [ ... ],
  providers: [ ... ],
  bootstrap: [ ... ],
  entryComponents: [ ... ],
  exports: [ ... ]
})
export class MyModule { }

这是一个实际成员的示例:

app.module.ts

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { MaterialModule } from '@angular/material';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';

import { AppComponent } from './app.component';
import { VideoPlayerComponent } from './video-player/video-player.component';
import { ConfirmationDialogComponent } from './confirmation-dialog/confirmation-dialog.component';
import { VideoService } from './services/video.service';

打破它

让我们简单解释一下 @NgModule 装饰器中的每个条目:

声明

这是为了指定组件,pipesdirectives 应该是模块的一部分。

进口

这是为了导入具有导出成员的其他模块,以在作为 NgModule 一部分的组件模板中使用。 例如,BrowserModule 重新导出 CommonModule,这使得内置的 NgIfNgFor 指令可用。

RouterModuleBrowserModuleFormsModuleHttpModuleBrowserAnimationsModule 是常用导入模块的示例。

出口

如果要导出模块的成员,以便它们可以在其他模块的组件模板中使用,这些成员将进入 exports 数组。

例如,在 CommonModule 的情况下,COMMON_DIRECTIVESCOMMON_PIPES 被导出,这是在您导入 BrowserModule 时可用于组件模板的内容] 或 CommonModule 到你自己的 NgModules 中。

引导程序

这是定义根组件,通常称为AppComponent。 这意味着 bootstrap 应该只包含一个成员,并且它应该只在主应用程序模块中定义。

提供者

这就是注射剂的去处。 诸如服务、route guardshttp 拦截器 之类的东西是应该是 providers 数组一部分的可注入的示例。 一旦提供,它们将在应用程序的任何地方可用。 这就是为什么通常在根应用程序模块中提供服务的原因。

入口组件

这适用于在编译期间 Angular 编译器无法找到的组件,因为它们在组件模板中的任何地方都没有被引用。 路由组件在模板中根本不被引用是很常见的,但 Angular 会自动将它们添加到 entryComponents 中,因此无需自己添加它们。

应该进入 entryComponents 的组件并不常见。 一个很好的例子是 Angular Material 对话框,因为它们是动态创建的,否则 Angular 编译器不会知道它们。