Запуск приложения с корневым модулем¶
28.02.2022
Предварительные условия¶
Базовое понимание следующего:
Модуль NgModule описывает, как части приложения сочетаются друг с другом. Каждое приложение имеет как минимум один модуль Angular, корневой модуль, который должен присутствовать для загрузки приложения при запуске. По соглашению и по умолчанию этот NgModule называется AppModule
.
Когда вы используете команду Angular CLI ng new
для генерации приложения, по умолчанию AppModule
выглядит следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
После операторов импорта находится класс с декоратором @NgModule
decorator.
Декоратор @NgModule
идентифицирует AppModule
как класс NgModule
. Декоратор @NgModule
принимает объект метаданных, который указывает Angular, как скомпилировать и запустить приложение.
Объект метаданных | Подробности |
---|---|
declarations | Одинокий компонент этого приложения. |
imports | Импортируйте BrowserModule , чтобы иметь специфические для браузера сервисы, такие как рендеринг DOM, дезинфекция и определение местоположения. |
providers | Поставщики услуг. |
bootstrap | корневой компонент, который Angular создает и вставляет в хост-страницу index.html . |
Приложение по умолчанию, созданное с помощью Angular CLI, содержит только один компонент, AppComponent
, поэтому он находится в массивах declarations
и bootstrap
.
Массив declarations
¶
Массив declarations
модуля сообщает Angular, какие компоненты принадлежат этому модулю. По мере создания новых компонентов добавляйте их в declarations
.
Каждый компонент должен быть объявлен только в одном классе NgModule
. Если вы используете компонент без его объявления, Angular возвращает сообщение об ошибке.
Массив declarations
принимает только декларируемые компоненты. Декларируемые компоненты — это компоненты, директивы и пайпы. Все декларируемые модули должны находиться в массиве declarations
. Декларируемые объекты должны принадлежать только одному модулю. При попытке объявить один и тот же класс более чем в одном модуле компилятор выдает ошибку.
Эти объявленные классы видны в модуле, но невидимы для компонентов другого модуля, если только они не экспортированы из этого модуля и другой модуль не импортирует этот класс.
Ниже приведен пример того, что входит в массив объявлений:
1 2 3 4 5 |
|
Объявляемая переменная может принадлежать только одному модулю, поэтому объявляйте ее только в одном @NgModule
. Когда она понадобится в другом месте, импортируйте модуль, содержащий нужную вам декларируемую переменную.
Использование директив в @NgModule
¶
Используйте массив declarations
для директив. Чтобы использовать директиву, компонент или пайп в модуле, необходимо выполнить несколько действий:
- Экспортировать ее из файла, в котором она была написана.
- Импортировать ее в соответствующий модуль.
- Объявить его в массиве
@NgModule
declarations
.
Эти три шага выглядят следующим образом. В файле, в котором создается директива, экспортируйте ее. Следующий пример с именем ItemDirective
представляет собой структуру директив по умолчанию, которую CLI генерирует в собственном файле item.directive.ts
:
1 2 3 4 5 6 7 8 9 |
|
Ключевым моментом здесь является то, что вы должны экспортировать его, чтобы иметь возможность импортировать его в другом месте. Затем импортируйте его в NgModule
, в данном примере app.module.ts
, с помощью оператора JavaScript import:
1 |
|
И в том же файле добавьте его в массив @NgModule
declarations
:
1 2 3 4 |
|
Теперь можно использовать ItemDirective
в компоненте. В данном примере используется AppModule
, но аналогичным образом можно поступить и с функциональным модулем. Подробнее о директивах см. в разделах Attribute Directives и Structural Directives. Аналогичная техника используется для пайпов pipes и компонентов.
Помните, что компоненты, директивы и пайпы принадлежат только одному модулю. В приложении их нужно объявлять только один раз, поскольку они используются совместно, импортируя необходимые модули. Это экономит время и помогает сохранить компактность приложения.
Массив imports
¶
Массив imports
модуля отображается исключительно в объекте метаданных @NgModule
. Он сообщает Angular о других модулях NgModules, которые необходимы данному модулю для правильной работы.
1 2 3 4 5 |
|
В этот список входят модули, экспортирующие компоненты, директивы или пайпы, на которые ссылаются шаблоны компонентов в этом модуле. В данном случае речь идет о компоненте AppComponent
, который ссылается на компоненты, директивы или пайпы в модулях BrowserModule
, FormsModule
или HttpClientModule
. Шаблон компонента может ссылаться на другой компонент, директиву или пайп, если ссылающийся класс объявлен в этом модуле или импортирован из другого модуля.
Массив providers
¶
В массиве providers перечисляются сервисы, необходимые приложению. Когда вы перечисляете сервисы в этом массиве, они становятся доступными для всего приложения. При использовании функциональных модулей и "ленивой" загрузки их можно выделить. Более подробную информацию можно найти в разделе Providers.
Массив bootstrap
¶
При запуске приложения происходит загрузка корневого AppModule
, который также называется entryComponent
. Кроме всего прочего, в процессе загрузки создаются компоненты, перечисленные в массиве bootstrap
, и каждый из них вставляется в DOM браузера.
Каждый загружаемый компонент является основой собственного дерева компонентов. Вставка загружаемого компонента обычно вызывает каскад созданий компонентов, которые заполняют это дерево.
Хотя на веб-странице можно разместить более одного дерева компонентов, большинство приложений имеют только одно дерево компонентов и загружают один корневой компонент.
Этот единственный корневой компонент обычно называется AppComponent
и находится в массиве bootstrap
корневого модуля.
В ситуации, когда требуется загрузить компонент на основе ответа API или установить AppComponent
в другой узел DOM, не соответствующий селектору компонента, обратитесь к документации ApplicationRef.bootstrap()
.
Подробнее о модулях Angular¶
Подробнее о модулях NgModules, которые часто встречаются в приложениях, см. в разделе Frequently Used Modules.