Приложение Angular состоит из отдельных модулей. Как правило, приложения состоят из нескольких модулей. И каждое приложение Angular как минимум имеет один корневой модуль (root module), который, согласно условностям, называется **AppModule**. Например, в первой главе использовался следующий корневой модуль:\\
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';
import { AppComponent } from './app.component';
@NgModule({
imports: [ BrowserModule, FormsModule ],
declarations: [ AppComponent ],
bootstrap: [ AppComponent ]
})
export class AppModule { }
Для работы модуля ему необходимы ряд библиотек, поэтому в начале файла идет их подключение. Имя каждой библиотеки Angular начинается с префикса @angular.\\
\\
Библиотеки устанавливаются через пакетный менеджер npm и импортируются с помощью директивы //import//. Например, импорт функциональности декоратора NgModule из библиотеки //@angular/core//:\\
import { NgModule } from '@angular/core';
То есть здесь мы должны импортировать все модули и классы, которые использует данный модуль. В частности, для AppModule необходимы:\\
* **NgModule**: функциональность декоратора NgModule, без которой мы не сможем создать модуль
* **BrowserModule**: модуль, необходимый для работы с браузером
* **FormsModule**: модуль, необходимый для работы с формами html и, в частности, с элементами input. (Так как класс компонента работает с подобными элементами, то мы обязаны также импортировать этот модуль)
* **AppComponent**: функциональность корневого компонента приложения
Непосредственно сам модуль представлен классом AppModule, который на первый взгляд ничего не делает и не содержит никакого функционала:
export class AppModule { }
Однако в Angular модуль это не просто класс. Каждый модуль должен определяться с декоратором **@NgModule**.\\
\\
NgModule представляет функцию-декоратора, которая принимает объект, свойства которого описывают метаданные модуля. Наиболее важные свойства:
* **declarations**: классы представлений (view classes), которые принадлежат модулю. Angular имеет три типа классов представлений: компоненты (components), директивы (directives), каналы (pipes)
* **exports**: набор классов представлений, которые должны использоваться в шаблонах компонентов из других модулей
* **imports**: другие модули, классы которых необходимы для шаблонов компонентов из текущего модуля
* **providers**: классы, создающие сервисы, используемые модулем
* **bootstrap**: корневой компонент, который вызывается по умолчанию при загрузке приложения
В случае выше единственным классом представлений является компонент AppComponent. Поэтому он указывается для свойств declarations и bootstrap. И поскольку его действие зависит от модулей BrowserModule и FormsModule, то данные модули указываются для свойства imports.\\
\\
Но при необходимости мы могли бы использовать и другие свойства:
@NgModule({
imports: [ BrowserModule, FormsModule ],
declarations: [ AppComponent ],
bootstrap: [ AppComponent ],
exports: [ ],
providers: [ ]
})