为什么在Angular 9 / ivy编译器中不再需要entryComponents?

时间:2020-05-01 11:45:19

标签: angular angular-ivy

任何人都可以清楚地说明为什么在IVY编译器中不再需要输入组件API吗?换句话说,内部发生了什么变化,因此Angular突然不需要了解要动态创建组件的情况

1 个答案:

答案 0 :(得分:46)

ViewEngine

在Ivy之前, ViewEngine编译器基于NgModule配置和html模板执行整个程序分析,然后根据此全局传递信息生成模块和组件工厂。

这意味着,如果您有一个模板中未引用的组件,并且尚未将其添加到NgModule的entryComponents数组中,则该组件将不会被编译,因此无法渲染它是动态的,因为Angular不知道该组件的工厂。

添加后,编译器将生成专用工厂,并将该工厂添加到内部HashMap中,以便可以通过ComponentFactoryResolver对其进行解析。

常春藤

Ivy引入了一个全新的 ngtsc编译器,其思维模式是装饰者是编译器

换句话说,ngtsc的整体体系结构是 TypeScript转换器的集合:用于组件,管道,ngModule等。

这些转换器在适当位置发出诸如AppComponent.ɵfacAppComponent.ɵcmp之类的静态函数,这意味着已转译的代码位于原始组件/管道/ ngModule所在的同一文件中。因此,我们在同一位置拥有工厂(实例化Angular组件/管道/模块所需的所有代码),并且可以通过这些静态属性轻松访问它们。

简单来说,如果TypeScript编译中包含一个带有@Component修饰符的类的文件,则ngtsc编译器将在同一文件中为该类发出工厂。

您可以猜测是否将组件导入到任何文件中,并且Angular可以通过静态属性轻松地找到其工厂。

另请参阅: