angular - 为什么 Angular 9 必须预编译自己的代码?
问题描述
我刚刚将我的项目升级到 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
我正在添加我的构建进行比较:pre angular 9和 after angular 9 迁移(构建仍然失败,但我们可以使用单元测试作为参考,从 ~2 分钟到 ~4 分钟的总执行时间)
解决方案
本文有助于解释为什么 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 构建速度。
推荐阅读
- excel - Excel自动排序然后汇总批量数据?
- java - 无法使用本地环境中的环境变量连接对话流
- python-3.x - 我在运行这个程序时遇到问题,它一直显示“ValueError:数学域错误”
- python - Python:如何修复 matplotlib 绘图错误?
- c++ - 特征动态大小矩阵的 C++ 数组
- sql - 如何从不同的表中获取具有相同名称的列,然后如何将它们全部解密
- python - 是否可以在 python 中装饰 __setatr__ 方法?
- python - 有没有办法在不启动浏览器的情况下提交 HTML 表单?
- string - QDebug字符串数组显示
- javascript - 如何偏移 d3 变焦的初始起始位置?