AppModule: 根模块

Angular 模块类描述应用的部件是如何组合在一起的。 每个应用都至少有一个 Angular 模块,也就是模块,用来引导并运行应用。 你可以为它取任何名字。常规名字是AppModule

开发环境讲解了如何使用下面这个最小的AppModule来创建一个新项目。 这个模块随着应用的成长而演变。

src/app/app.module.ts

import { NgModule }      from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { AppComponent }  from './app.component';

@NgModule({
  imports:      [ BrowserModule ],
  declarations: [ AppComponent ],
  bootstrap:    [ AppComponent ]
})
export class AppModule { }

import语句之后,可以看到一个@NgModule装饰器修饰的类。

@NgModule装饰器将AppModule标记为 Angular 模块类(也叫NgModule类)。 @NgModule接受一个元数据对象,告诉 Angular 如何编译和启动应用。

Angular 模块 (NgModules) 指南深入讲解了 Angular 模块。 现在先初步了解这三个属性。

imports 数组

Angular 模块把特性合并成离散单元的一种方式。 Angular 自身的许多特性也是通过 Angular 模块组织的。 HTTP 服务在HttpModule里。路由器在RouterModule中。 最终,你可能也会创建特性模块。

当应用需要模块的特性时,将其添加到imports数组中。

这个应用和大多数其他应用一样,在浏览器中运行。 每个浏览器中运行的应用都需要@angular/platform-browser里的BrowserModule。 所以每个这样的应用都在其AppModuleimports数组中包含BrowserModule。 在需要添加额外模块到此数组时,其他指南和烹饪宝典页面会告诉你。

imports数组中应该只有NgModule。不要放置其它类型的类。

不要将 Angular 模块的imports数组与文件顶部的import语句弄混淆了。它们的功能不同。

JavaScriptimport声明允许你访问在其他文件中导出的符号,这样你可以在当前文件引用它们。 我们会往几乎所有类型的应用中加入import语句。 它们与 Angular 毫无关系,Angular 对它们也一无所知。

模块imports数组是@NgModule元数据中独有的。它告诉 Angular 特定 Angular 模块的信息 — 用@NgModule装饰的类 — 应用需要它们来正常工作。

declarations 数组

通过将其列到AppModule模块的declarations数组中,可以告诉 Angular 哪个组件属于AppModule。 在创建更多组件的过程中,逐步将它们添加到declarations中。

你必须在一个NgModule类声明每一个组件。 否则当你使用这些组件时就会在浏览器的控制台中看到一个明显的错误信息。

你将会学习如何创建其他两种类 — 指令管道 — 它们也必须被添加到declarations数组。

只有*可以声明的组件指令管道 — 属于declarations数组。 不要将其他类型的类添加到declarations中,例如NgModule类, 服务类,模型类。

bootstrap 数组

通过引导AppModule来启动应用。 在启动过程中,其中一步是创建列在bootstrap数组的组件, 并将它们每一个都插入到浏览器的DOM中。

每个被引导的组件都是它自己的组件树的根。 插入一个被引导的组件通常触发一系列组件的创建并形成组件树。

虽然你可以将多个组件树插入到宿主页面,但并不普遍。 大多数应用只有一个组件树,它们引导单一组件。

你可以为这个组件取任何名字,但是大多数程序员将其取名为AppComponent

下面让我们来看看引导过程本身。

main.ts中引导

引导应用的方法很多。 它们取决于你想如何编译应用以及应用将在哪儿运行。

开始时,你将使用即时 (JiT) 编译器动态编译应用。然后在浏览器中运行它。 稍后,你可以了解其他选项。

引导即时编译的浏览器应用的推荐地点是在src目录中一个名为src/main.ts的单独文件中。

src/main.ts

import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule }              from './app/app.module';

platformBrowserDynamic().bootstrapModule(AppModule);

上面的代码为动态 (JiT) 编译创建浏览器平台,并引导上面提到的AppModule

引导过程搭建运行环境,从模块的bootstrap数组中提出AppComponent, 创建该组件的实例,并将其插入到组件selector标识的元素标签中。

AppComponent选择器 — 在这里以及文档大部分例子中 — 是my-app, 所以 Angular 在index.html中查找像这样的<my-app>标签...

<my-app><!-- content managed by Angular --></my-app>

...然后在那儿显示AppComponent

该文件非常稳定。一旦配置好,你可能永远不会再修改它。

关于Angular模块的更多知识

你最初的应用只有一个单一的模块 —— 模块。 当这个应用不断成长时,你就要考虑把它们拆分到多个 "特性" 模块中了。 这些特性模块中的一部分可以稍后加载(即惰性加载),它们只会在用户访问到这些特性时才会加载。

如果你要了解这些知识,请访问Angular 模块 (NgModule)

下一步

显示数据