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

Why entryComponents is not necessary anymore in Angular 9/ivy compiler?

谁能解释清楚为什么在IVY编译器中,入口组件API不再需要了?。换句话说,内部发生了什么变化,因此Angular突然不需要提醒您要动态创建组件

视图引擎

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

这意味着如果你有一个你没有在模板中引用的组件,并且你没有将它添加到 NgModule 的 entryComponents 数组中,那么这个组件将不会被编译,你可以' t 动态渲染它,因为 Angular 不知道从哪里获得这个组件的工厂。

添加后,编译器会生成专用工厂,并将该工厂添加到内部HashMap中,以便通过ComponentFactoryResolver.

解析

常春藤

Ivy 引入了一个全新的ngtsc 编译器,其心智模型是装饰器就是编译器

换句话说,ngtsc 的整体架构是一组 TypeScript 转换器:用于组件、管道、ngModule 等。

这些转换器发出像 AppComponent.ɵfacAppComponent.ɵcmp 这样的静态函数,这意味着转译后的代码驻留在原始 component/pipe/ngModule 所在的同一文件中。所以我们在同一个地方有工厂(实例化 Angular components/pipes/modules 所需的所有代码),并且可以通过这些静态属性轻松访问它们。

简单来说,如果 TypeScript 编译中包含一个包含 class 和 @Component 装饰器的文件,那么 ngtsc 编译器将在同一个文件中为此 class 发出工厂.

如您所料,如果您在任何文件中导入该组件,Angular 可以通过静态 属性.

轻松发现其工厂

另请参阅: