Недавно я просмотрел официальную информацию о выпуске Angular 9 и выяснил, что команда Angular решила отказаться от массива entryComponents, который был важной частью NgModule для создания динамических компонентов, таких как модальные, рекламные баннеры и т. Д. можете проверить это здесь.

В версиях до Angular 9, если мы пытались динамически создать любой компонент, не являющийся стороной entryComponents, мы получали следующую ошибку.

Фабрика компонентов для ModalComponent не найдена. Вы добавляли его в @ NgModule.entryComponents?

Чтобы понять это, нам нужно понять, почему Angular нужен массив entryComponents отдельно перед Angular 9, чтобы создавать эти компоненты динамически. Причины следующие.

  1. Если внимательно прочитать ошибку, она жалуется на отсутствие фабрики. Компоненты, у которых был свой селектор в шаблонах, Angular использовал для создания NgFactories.
  2. Поскольку динамические компоненты были созданы с помощью ComponentFactoryResolver без какого-либо селектора в шаблоне, Angular не использовался для создания для них фабрик.
  3. entryComponents - это массив компонентов, который использовался для информирования Angular о таких компонентах, чтобы он мог предоставить их NgFactory во время выполнения.

Итак, теперь мы понимаем, зачем Angular требовался массив entryComponents до версии 8. Но что произошло с версии 9, из-за чего нет необходимости использовать массив entryComponents?

Ответ - Айви Рендерер. С Ivy Renderer Angular больше не использует NgFactory. Вместо этого он хранит всю информацию, необходимую для рендеринга компонента, в статических свойствах cmp и fac. Итак, в основном ссылки на компонент достаточно, вместо того, чтобы полагаться на его селектор в шаблоне.

Итак, теперь у вас могут быть все компоненты внутри массива объявлений, а позже вы можете выбрать, какой из них использовать с помощью селектора, а какой создавать динамически.

Но подождите, означает ли это, что Angular 9 не требует entryComponents. На самом деле это полностью зависит от того, используете ли вы Ivy Renderer или нет. Если вы недавно обновили свое приложение до Angular 9, но все еще есть некоторые вещи, которые несовместимы с Ivy, и вы все еще запускаете свой проект без Ivy. Вам по-прежнему нужно использовать массив entryComponents, пока вы не решите включить Ivy для своего проекта.

Но если вы перешли на Angular 9, Ivy станет одной из ключевых функций, которая значительно повысит производительность за счет уменьшения размера сборки. Таким образом, лучший подход - обновить его до Ivy и избавиться от entryComponents, поскольку он будет удален в будущих выпусках.