为什么Angular 9 必须预编译自己的代码?

Why Angular 9 has to pre-compile itself code?

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

分析日志,每次执行测试或构建时,CLI 都会执行预编译。 这是由于 new Ivy architecture,但根据我的理解,这种编译应该只发生在与 Ivy 不兼容的代码上。

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

注意:这个发生在一个新项目中(只有几个库)。

更新 所有需要构建的命令都会发生这种情况。例如:

更新 2

我正在添加我的构建以进行比较:pre angular 9 and after angular 9 migration(构建仍然失败,但我们可以使用单元测试作为参考,总执行时间从 ~2 分钟到 ~4 分钟)

This article 有助于解释为什么 Angular 9 使用 ngcc 和 Ivy 编译路线图编译依赖项。

简而言之,因为 Ivy 指令集只会在 Angular 10 中稳定下来,Angular 团队建议暂时不要发布编译到 Angular 9 Ivy 的包。 Angular10之后,将鼓励包维护者发布Ivy包;仍将支持 View Engine 包,但不鼓励。

据此,我得出结论,在 Angular 10 发布后的一段时间内,我们将看到 ngcc 编译明显减少,在某些情况下 none,具体取决于特定项目使用的包。在Angular 9中,ngcc编译步骤是一个你很难摆脱的必要妥协。

至于CI速度,the official docs建议可以显式执行ngcc。我认为可以在 CI 中缓存此步骤,但由于不了解您的特定设置,我无法提出超出研究方向的任何建议。

更新 1: Angular 9.1 promises ngcc 构建速度改进。

更新二: Angular 12 deprecates legacy compilation and View Engine rendering pipeline.

更新 3: Angular 13 has removed ViewEngine