Запуск приложения с корневым модулем¶
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 для директив. Чтобы использовать директиву, компонент или пайп в модуле, необходимо выполнить несколько действий:
- Экспортировать ее из файла, в котором она была написана.
- Импортировать ее в соответствующий модуль.
- Объявить его в массиве
@NgModuledeclarations.
Эти три шага выглядят следующим образом. В файле, в котором создается директива, экспортируйте ее. Следующий пример с именем 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.