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

Ari*_*son 32 angular angular-ivy

任何人都可以清楚地解释为什么在 IVY 编译器中,不再需要入口组件 API 了吗?。换句话说,内部发生了什么变化,以便 Angular 突然不需要提醒您要动态创建组件

yur*_*zui 47

视图引擎

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

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

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

常春藤

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

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

这些转换器发出静态函数,例如AppComponent.?facAppComponent.?cmp就地意味着转换后的代码驻留在原始组件/管道/ngModule 所在的同一文件中。所以我们在同一个地方有工厂(实例化 Angular 组件/管道/模块所需的所有代码),并且可以通过这些静态属性轻松访问它们。

简而言之,如果 TypeScript 编译中包含的文件具有带@Component装饰器的类,则 ngtsc 编译器将在同一文件中为此类发出工厂。

你可以猜到,如果你在任何文件中导入该组件,Angular 可以通过静态属性轻松发现它的工厂。

也可以看看:

  • Web 组件/Angular 元素怎么样?如果我想将组件导出为自定义元素,我需要保留它吗?文档仍然说将它们添加到入口组件中 (2认同)