ВАЖНО: Команда Angular рекомендует
использовать standalone-компоненты вместо
NgModule для всего нового кода. Используйте это руководство для понимания существующего кода, созданного с помощью
@NgModule.
NgModule — это класс, помеченный декоратором @NgModule. Этот декоратор принимает метаданные, которые сообщают
Angular, как компилировать шаблоны компонентов и настраивать внедрение зависимостей (DI).
import {NgModule} from '@angular/core';
@NgModule({
// Metadata goes here
})
export class CustomMenuModule {}
У NgModule есть две основные обязанности:
- Объявление компонентов, директив и pipe'ов, принадлежащих этому NgModule.
- Добавление провайдеров в инжектор для компонентов, директив и pipe'ов, которые импортируют этот NgModule.
Declarations
Свойство declarations метаданных @NgModule объявляет компоненты, директивы и pipe'ы, принадлежащие этому NgModule.
@NgModule({
/* ... */
// CustomMenu and CustomMenuItem are components.
declarations: [CustomMenu, CustomMenuItem],
})
export class CustomMenuModule {}
В примере выше компоненты CustomMenu и CustomMenuItem принадлежат CustomMenuModule.
Свойство declarations дополнительно принимает массивы компонентов, директив и pipe'ов. Эти массивы, в свою очередь,
также могут содержать другие массивы.
const MENU_COMPONENTS = [CustomMenu, CustomMenuItem];
const WIDGETS = [MENU_COMPONENTS, CustomSlider];
@NgModule({
/* ... */
// This NgModule declares all of CustomMenu, CustomMenuItem,
// CustomSlider, and CustomCheckbox.
declarations: [WIDGETS, CustomCheckbox],
})
export class CustomMenuModule {}
Если Angular обнаружит какие-либо компоненты, директивы или pipe'ы, объявленные более чем в одном NgModule, он сообщит об ошибке.
Любые компоненты, директивы или pipe'ы должны быть явно помечены как standalone: false, чтобы их можно было объявить в
NgModule.
@Component({
// Mark this component as `standalone: false` so that it can be declared in an NgModule.
standalone: false,
/* ... */
})
export class CustomMenu {
/* ... */
}
imports
Компоненты, объявленные в NgModule, могут зависеть от других компонентов, директив и pipe'ов. Добавьте эти зависимости в
свойство imports метаданных @NgModule.
@NgModule({
/* ... */
// CustomMenu and CustomMenuItem depend on the PopupTrigger and SelectorIndicator components.
imports: [PopupTrigger, SelectionIndicator],
declarations: [CustomMenu, CustomMenuItem],
})
export class CustomMenuModule {}
Массив imports принимает другие NgModule, а также standalone-компоненты, директивы и pipe'ы.
exports
NgModule может экспортировать свои объявленные компоненты, директивы и pipe'ы так, чтобы они были доступны другим компонентам и NgModule.
@NgModule({
imports: [PopupTrigger, SelectionIndicator],
declarations: [CustomMenu, CustomMenuItem],
// Make CustomMenu and CustomMenuItem available to
// components and NgModules that import CustomMenuModule.
exports: [CustomMenu, CustomMenuItem],
})
export class CustomMenuModule {}
Однако свойство exports не ограничивается объявлениями. NgModule также может экспортировать любые другие компоненты,
директивы, pipe'ы и NgModule, которые он импортирует.
@NgModule({
imports: [PopupTrigger, SelectionIndicator],
declarations: [CustomMenu, CustomMenuItem],
// Also make PopupTrigger available to any component or NgModule that imports CustomMenuModule.
exports: [CustomMenu, CustomMenuItem, PopupTrigger],
})
export class CustomMenuModule {}
Провайдеры NgModule
СОВЕТ: См. руководство по Внедрению зависимостей (DI) для получения информации о внедрении зависимостей и провайдерах.
NgModule может указывать providers (провайдеров) для внедряемых зависимостей. Эти провайдеры доступны для:
- Любого standalone-компонента, директивы или pipe'а, который импортирует этот NgModule, и
declarationsиprovidersлюбого другого NgModule, который импортирует этот NgModule.
@NgModule({
imports: [PopupTrigger, SelectionIndicator],
declarations: [CustomMenu, CustomMenuItem],
// Provide the OverlayManager service
providers: [OverlayManager],
/* ... */
})
export class CustomMenuModule {}
@NgModule({
imports: [CustomMenuModule],
declarations: [UserProfile],
providers: [UserDataClient],
})
export class UserProfileModule {}
В примере выше:
CustomMenuModuleпредоставляетOverlayManager.- Компоненты
CustomMenuиCustomMenuItemмогут внедритьOverlayManager, так как они объявлены вCustomMenuModule. UserProfileможет внедритьOverlayManager, так как его NgModule импортируетCustomMenuModule.UserDataClientможет внедритьOverlayManager, так как его NgModule импортируетCustomMenuModule.
Паттерн forRoot и forChild
Некоторые NgModule определяют статический метод forRoot, который принимает некоторую конфигурацию и возвращает массив
провайдеров. Имя «forRoot» — это соглашение, указывающее на то, что эти провайдеры предназначены для добавления
исключительно в корень (root) вашего приложения во время начальной загрузки (bootstrap).
Любые провайдеры, включенные таким образом, загружаются немедленно (eagerly loaded), увеличивая размер JavaScript-бандла начальной загрузки страницы.
bootstrapApplication(MyApplicationRoot, {
providers: [CustomMenuModule.forRoot(/* some config */)],
});
Аналогично, некоторые NgModule могут определять статический метод forChild, указывающий, что провайдеры предназначены
для добавления в компоненты внутри иерархии вашего приложения.
@Component({
/* ... */
providers: [CustomMenuModule.forChild(/* some config */)],
})
export class UserProfile {
/* ... */
}
Запуск (Bootstrapping) приложения
ВАЖНО: Команда Angular рекомендует использовать bootstrapApplication вместо
bootstrapModule для всего нового кода. Используйте это руководство для понимания существующих приложений, запускаемых
с помощью @NgModule.
Декоратор @NgModule принимает необязательный массив bootstrap, который может содержать один или несколько
компонентов.
Вы можете использовать метод bootstrapModule из
platformBrowser или platformServer для
запуска приложения Angular. При запуске эта функция находит на странице любые элементы с CSS-селектором, соответствующим
перечисленным компонентам, и рендерит эти компоненты на странице.
import {platformBrowser} from '@angular/platform-browser';
@NgModule({
bootstrap: [MyApplication],
})
export class MyApplicationModule {}
platformBrowser().bootstrapModule(MyApplicationModule);
Компоненты, перечисленные в bootstrap, автоматически включаются в declarations этого NgModule.
Когда вы запускаете приложение из NgModule, собранные providers этого модуля и все providers его imports
загружаются немедленно и доступны для внедрения во всем приложении.