为什么Angular 9需要预编译自身代码?

14

我刚刚将我的项目升级到Angular 9,第一件让我注意到的是在CI中构建时间显著增加(从2分钟增加到4分钟)。

分析日志,每次执行测试或构建时,CLI都会执行预编译。 这是由于新的Ivy架构,但据我了解,此编译应仅对不兼容Ivy的代码进行。

那么为什么我在我的构建中看到了大量Compiling @angular/common : es2015 as esm2015(主要来自@angular包)?Angular代码本身不应与Ivy兼容吗?

注意:即使是新项目(只包含少量库),也会出现这种情况。

更新 所有需要构建的命令都会出现此问题。例如:

  • ng test --code-coverage=true --watch=false --browsers=ChromeHeadle
  • ng b -c=staging --aot

更新2

为了比较,我添加了之前 Angular 9之前 和之后Angular 9迁移的构建(构建仍然失败,但我们可以使用单元测试作为参考,总执行时间从大约2分钟增加到了大约4分钟)。


你使用什么命令/参数来运行/构建你的项目? - Kyler Johnson
Angular被编译为es2015。由于您的构建正在使用esm2015,因此必须重新编译。 - Roddy of the Frozen Peas
1
@RoddyoftheFrozenPeas,即使是通过 CLI 初始化的新项目也会有这种行为。是否有可能更改构建目标以避免重新编译? - André Roggeri Campos
我的意思是,我认为你使用esm2015是有原因的,但如果你改用es2015在你的项目中,它应该会使用预编译的二进制文件。 - Roddy of the Frozen Peas
1个回答

14

本文详细解释了为什么Angular 9会使用ngcc编译依赖项以及Ivy编译路线图。

简而言之,因为Ivy指令集仅在Angular 10中稳定,Angular团队建议不要发布编译为Angular 9 Ivy的软件包。在Angular 10之后,软件包维护者将被鼓励发布Ivy软件包;View Engine软件包仍将得到支持,但不会受到鼓励。

由此,我得出结论,在Angular 10发布后的一段时间内,我们将看到显著减少的ngcc编译,有些情况下甚至没有,这取决于特定项目使用的软件包。在Angular 9中,ngcc编译步骤是必要的妥协,很难摆脱。

至于CI速度,官方文档建议可以显式执行ngcc。我认为可能可以在CI中缓存此步骤,但由于不知道您的具体设置,我无法建议超出研究方向的任何内容。

更新1: Angular 9.1 承诺 ngcc构建速度有所提高。

更新2: Angular 12弃用传统编译和View Engine渲染管道。

更新3: Angular 13已删除ViewEngine


1
我明白了,所以Angular只是遵循自己的建议,不提供Ivy编译的软件包,对吧? - André Roggeri Campos
@AndréRoggeriCampos,根据我参考的资源,我相信它就是这样做的。 - Klaster_1 Нет войне

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接