【问题标题】:Why Angular 9 has to pre-compile itself code?为什么 Angular 9 必须预编译自己的代码?
【发布时间】:2020-05-26 08:52:47
【问题描述】:

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

分析日志,每次执行测试或构建时,CLI 都会执行预编译。 这是由于new Ivy architecture,但据我了解,这种编译应该只发生在与 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

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

【问题讨论】:

  • 您使用什么命令/参数来运行/构建您的项目?
  • Angular 编译为 es2015。由于您的构建使用的是 esm2015,因此必须重新编译。
  • @RoddyoftheFrozenPeas 但即使是使用 CLI 初始化的新项目也会有这种行为。是否可以更改构建目标以避免重新编译?
  • 我的意思是,我推测您使用 esm2015 是有原因的,但如果您在项目中改为使用 es2015,它应该使用预编译的二进制文件。

标签: angular typescript ecmascript-6 angular-cli angular9


【解决方案1】:

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

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

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

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

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

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

更新 3: Angular 13 has removed ViewEngine

【讨论】:

  • 我明白了,所以 Angular 只是按照自己的建议不提供 Ivy 编译的包吗?
  • @AndréRoggeriCampos 根据我引用的资源,我相信它就是这样做的。
猜你喜欢
  • 2022-01-16
  • 1970-01-01
  • 2022-06-15
  • 2014-03-07
  • 1970-01-01
  • 2014-10-03
  • 1970-01-01
  • 1970-01-01
  • 2011-04-21
相关资源
最近更新 更多