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 装饰器中的每个条目:
声明
这是为了指定组件,pipes 和 directives 应该是模块的一部分。
进口
这是为了导入具有导出成员的其他模块,以在作为 NgModule 一部分的组件模板中使用。 例如,BrowserModule 重新导出 CommonModule,这使得内置的 NgIf 和 NgFor 指令可用。
RouterModule、BrowserModule、FormsModule、HttpModule 和 BrowserAnimationsModule 是常用导入模块的示例。
出口
如果要导出模块的成员,以便它们可以在其他模块的组件模板中使用,这些成员将进入 exports 数组。
例如,在 CommonModule 的情况下,COMMON_DIRECTIVES
和 COMMON_PIPES
被导出,这是在您导入 BrowserModule 时可用于组件模板的内容] 或 CommonModule 到你自己的 NgModules 中。
引导程序
这是定义根组件,通常称为AppComponent。 这意味着 bootstrap 应该只包含一个成员,并且它应该只在主应用程序模块中定义。
提供者
这就是注射剂的去处。 诸如服务、route guards 和 http 拦截器 之类的东西是应该是 providers 数组一部分的可注入的示例。 一旦提供,它们将在应用程序的任何地方可用。 这就是为什么通常在根应用程序模块中提供服务的原因。
入口组件
这适用于在编译期间 Angular 编译器无法找到的组件,因为它们在组件模板中的任何地方都没有被引用。 路由组件在模板中根本不被引用是很常见的,但 Angular 会自动将它们添加到 entryComponents 中,因此无需自己添加它们。
应该进入 entryComponents 的组件并不常见。 一个很好的例子是 Angular Material 对话框,因为它们是动态创建的,否则 Angular 编译器不会知道它们。