为什么Angular 9必须预先编译自身代码?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么Angular 9必须预先编译自身代码?相关的知识,希望对你有一定的参考价值。

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

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

因此,为什么在我的版本中看到很多Compiling @angular/common : es2015 as esm2015(大部分来自@angular软件包? Angular代码本身不应该与Ivy兼容吗?

注意:此also发生在一个新项目中(几乎没有库)。

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

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

更新2

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

答案

[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中缓存此步骤,但是由于您不了解您的特定设置,因此我无法提出任何超出研究方向的建议。

以上是关于为什么Angular 9必须预先编译自身代码?的主要内容,如果未能解决你的问题,请参考以下文章

表单未预先填充Angular 8

编译 Angular 11(从 Angular 9 升级)应用程序时出错

Angular 9即将发布:改进Ivy编译和渲染管道

angular 9 库发布错误“尝试发布已由 Ivy 编译的包”

为什么省略“#include “有时只会导致编译失败?

为啥复制构造函数不需要检查输入对象是不是指向自身?