Por que entryComponents não é mais necessário no compilador Angular 9 / ivy?

17

Alguém pode dar uma explicação clara de por que, no compilador IVY, a API dos componentes de entrada não é mais necessária ?. Em outras palavras, o que foi alterado internamente para que o Angular de repente não precise de um aviso, você criará componente dinamicamente

Ariel Henryson
fonte

Respostas:

37

ViewEngine

Antes do Ivy, o compilador ViewEngine executava toda a análise do programa com base nas configurações do NgModule e no modelo html e depois produziu fábricas de módulos e componentes com base nessas informações transitivas globais.

Isso significa que, se você tiver um componente que não está referenciando no modelo e não o adicionou à entryComponentsmatriz do NgModule, esse componente não será compilado e você não poderá renderizá-lo dinamicamente porque o Angular não sabe onde obter fábrica para este componente.

Depois de adicionado, o compilador produzirá uma fábrica dedicada e também a adicionará ao HashMap interno para que possa ser resolvido ComponentFactoryResolver.

Hera

Ivy introduziu um compilador ngtsc completamente novo, cujo modelo mental é que o decorador é o compilador .

Em outras palavras, a arquitetura geral do ngtsc é um conjunto de transformadores TypeScript : para componente, canal, ngModule etc.

Esses transformadores emitem funções estáticas como AppComponent.ɵfac, AppComponent.ɵcmpno local, o que significa que o código transpilado reside no mesmo arquivo em que o componente / pipe / ngModule original está localizado. Portanto, temos fábricas (todo o código necessário para instanciar componentes / tubulações / módulos angulares) no mesmo local e elas podem ser facilmente acessadas por essas propriedades estáticas.

Em palavras simples, se houver um arquivo incluído na compilação TypeScript que tenha classe com um @Componentdecorador, o compilador ngtsc emitirá fábrica para essa classe no mesmo arquivo.

Como você pode imaginar, se você importar esse componente em qualquer arquivo, o Angular poderá descobrir facilmente sua fábrica através da propriedade estática.

Veja também:

yurzui
fonte
1
E os componentes da web / elementos angulares? Devo mantê-lo se quiser exportar meus componentes como elementos personalizados? Os documentos ainda dizem para adicioná-los nos componentes de entrada
user2010955
@ user2010955 Não. Acho que você não precisa registrar elementos com entryComponents em NgModules.
yurzui