NgModules¶
30.09.2026
Для всего нового кода команда Angular рекомендует автономные компоненты вместо NgModule. Это руководство нужно, чтобы понимать уже написанный код на @NgModule.
NgModule — класс, помеченный декоратором @NgModule. Декоратор принимает метаданные: по ним Angular компилирует шаблоны компонентов и настраивает инъекцию зависимостей.
1 2 3 4 5 6 | |
У NgModule две главные задачи:
- объявляет компоненты, директивы и пайпы, которые принадлежат NgModule;
- добавляет провайдеры в инжектор для компонентов, директив и пайпов, которые импортируют этот NgModule.
Объявления¶
Свойство declarations метаданных @NgModule перечисляет компоненты, директивы и пайпы этого NgModule.
1 2 3 4 5 6 | |
В примере выше компоненты CustomMenu и CustomMenuItem принадлежат CustomMenuModule.
Кроме того, declarations принимает массивы компонентов, директив и пайпов. Внутри таких массивов могут быть другие массивы.
1 2 3 4 5 6 7 8 9 10 | |
Если компонент, директива или пайп объявлены больше чем в одном NgModule, Angular сообщает об ошибке.
Чтобы объявить компонент, директиву или пайп в NgModule, их нужно явно пометить standalone: false.
1 2 3 4 5 6 7 8 | |
Импорты¶
Компонент, объявленный в NgModule, может зависеть от других компонентов, директив и пайпов. Такие зависимости добавляют в свойство imports метаданных @NgModule.
1 2 3 4 5 6 7 | |
В массив imports входят другие NgModule, а также автономные компоненты, директивы и пайпы.
Экспорты¶
NgModule может экспортировать объявленные компоненты, директивы и пайпы. Тогда они доступны другим компонентам и NgModule.
1 2 3 4 5 6 7 8 9 | |
Свойство exports не ограничено собственными объявлениями. NgModule может экспортировать и те компоненты, директивы, пайпы и NgModule, которые сам импортирует.
1 2 3 4 5 6 7 8 | |
Провайдеры NgModule¶
Про инъекцию зависимостей и провайдеры — в руководстве по инъекции зависимостей.
NgModule задаёт providers для внедряемых зависимостей. Эти провайдеры доступны:
- любому автономному компоненту, директиве и пайпу, которые импортируют этот NgModule;
- объявлениям
declarationsи провайдерамprovidersлюбого другого NgModule, который импортирует этот.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
В примере выше:
CustomMenuModuleпредоставляет сервисOverlayManager;- компоненты
CustomMenuиCustomMenuItemмогут внедритьOverlayManager, потому что объявлены вCustomMenuModule; UserProfileможет внедритьOverlayManager, потому что его NgModule импортируетCustomMenuModule;UserDataClientможет внедритьOverlayManager, потому что его NgModule импортируетCustomMenuModule.
Паттерн forRoot и forChild¶
У некоторых NgModule есть статический метод forRoot. Он принимает конфигурацию и возвращает массив провайдеров. Имя forRoot — соглашение: эти провайдеры добавляют только в корень приложения, во время запуска.
Такие провайдеры загружаются сразу и увеличивают размер JavaScript первой загрузки страницы.
1 2 3 | |
Статический метод forChild у части NgModule означает другое: провайдеры предназначены компонентам внутри иерархии приложения.
1 2 3 4 5 6 7 | |
Запуск приложения¶
Для нового кода команда Angular рекомендует bootstrapApplication вместо bootstrapModule. Здесь — как устроены приложения, которые по-прежнему запускают через @NgModule.
Декоратор @NgModule принимает необязательный массив bootstrap с одним или несколькими компонентами.
Приложение Angular запускают методом bootstrapModule у platformBrowser или platformServer. При вызове функция находит на странице элементы, чей CSS-селектор совпадает с указанными компонентами, и отрисовывает эти компоненты.
1 2 3 4 5 6 7 8 | |
Компоненты из bootstrap автоматически входят в объявления NgModule.
Когда приложение запускают из NgModule, собранные providers этого модуля и все providers из его imports загружаются сразу и доступны для инъекции во всём приложении.
Источник: https://angular.dev/guide/ngmodules/overview