任何人都可以清楚地说明为什么在IVY编译器中不再需要输入组件API吗?换句话说,内部发生了什么变化,因此Angular突然不需要了解要动态创建组件的情况
答案 0 :(得分:46)
在Ivy之前, ViewEngine编译器基于NgModule配置和html模板执行整个程序分析,然后根据此全局传递信息生成模块和组件工厂。
这意味着,如果您有一个模板中未引用的组件,并且尚未将其添加到NgModule的entryComponents
数组中,则该组件将不会被编译,因此无法渲染它是动态的,因为Angular不知道该组件的工厂。
添加后,编译器将生成专用工厂,并将该工厂添加到内部HashMap中,以便可以通过ComponentFactoryResolver
对其进行解析。
Ivy引入了一个全新的 ngtsc编译器,其思维模式是装饰者是编译器。
换句话说,ngtsc的整体体系结构是 TypeScript转换器的集合:用于组件,管道,ngModule等。
这些转换器在适当位置发出诸如AppComponent.ɵfac
,AppComponent.ɵcmp
之类的静态函数,这意味着已转译的代码位于原始组件/管道/ ngModule所在的同一文件中。因此,我们在同一位置拥有工厂(实例化Angular组件/管道/模块所需的所有代码),并且可以通过这些静态属性轻松访问它们。
简单来说,如果TypeScript编译中包含一个带有@Component
修饰符的类的文件,则ngtsc编译器将在同一文件中为该类发出工厂。
您可以猜测是否将组件导入到任何文件中,并且Angular可以通过静态属性轻松地找到其工厂。
另请参阅: