Что такое модуль?

В Angular модуль – это механизм группирования компонентов, директив, фильтров и сервисов, которые связаны между собой, таким образом, что их можно объединить с другими модулями для создания приложения. Angular приложение можно рассматривать как пазл, где каждая часть(или каждый модуль) необходима, чтобы увидеть полную картину.

Другая аналогия модулей – классы. В классе мы можем определить публичные или приватные методы. Публичные методы - это API, с которым могут взаимодействовать другие части кода, в то время как приватные методы - детали реализации, которые скрыты. Таким же образом модуль может экспортировать или скрывать компоненты, директивы, фильтры и сервисы. Экспортируемые элементы предназначены для использования другими модулями, в то время как те, которые не экспортируются(скрыты), просто используются внутри самого модуля и не могут напрямую обращаться к другим модулям приложения.

Чтобы определить модуль, мы должны использовать декоратор NgModule.

import { NgModule } from '@angular/core';

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

В примере мы превратили класс AppModule в Angular модуль с помощью декоратора NgModule. Декоратор NgModule для основного модуля требует как минимум трех свойств: imports, declarations и bootstrap. imports ожидает массив модулей. Здесь мы определяем части нашего пазла(приложения). declarations ожидают массив компонентов, директив и фильтров, которые являются частью модуля. Свойство bootstrap – это то место, где мы определяем корневой компонент нашего модуля. Хотя это свойство также является массивом, в 99% случаев мы будем определять только один компонент.

Вот как будет выглядеть базовый модуль, состоящий из одного компонента. app/app.component.ts:

import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  template: `<h1>My Angular 2 App</h1>`
})
export class AppComponent {}

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 { }

Файл app.component.ts - всего лишь компонент «hello world», ничего интересного там нет. С другой стороны, файл app.module.ts следует структуре, которую мы видели ранее для определения модуля, но в этом случае мы указали модули и компоненты, которые будем использовать.

Во-первых, наш модуль импортирует BrowserModule как зависимость. BrowserModule – это встроенный модуль, который экспортирует основные директивы, фильтры и сервисы. В отличие от предыдущих версий Angular, мы должны явно импортировать эти зависимости, чтобы иметь возможность использовать в шаблонах директивы типа *ngFor или *ngIf.

Учитывая, что корневым(и единственным) компонентом модуля является AppComponent, мы должны указать его в массиве bootstrap. Поскольку в свойстве declarations мы должны определить все компоненты, составляющие приложение, мы также должны указать AppComponent и там.

Прежде чем двигаться дальше, необходимо кое что запомнить. Существуют два типа модулей, корневые(root) модули и функциональные(feature) модули.

Точно так же, как в модуле есть один корневой компонент и много возможных вторичных компонентов, в приложении есть только один корневой модуль и много функциональных модулей. Чтобы загрузить приложение, Angular должен знать, какой из них является корневым. Простой способ определить корневой модуль указать в imports BrowserModule. Eсли вместо этого импортируется CommonModule, тогда это функциональный модуль.

Хорошая практика когда корневой модуль называться AppModule.

Чтобы запустить приложение нам нужно сообщить Angular, какой из модулей корневой для выполнения компиляции в браузере. Эта компиляция в браузере известна также как компиляция «Just in Time» (JIT).

main.ts:

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

platformBrowserDynamic().bootstrapModule(AppModule);

results matching ""

    No results matching ""