[译2021]Angular 库分发即将改进
太长了;在 v12 中,我们将弃用称为 View Engine 的旧版编译和渲染管道。此更改不需要开发人员采取任何操作。依赖于 View Engine 的库将通过我们的兼容性编译器ngcc继续按预期工作。如果您是库作者或有兴趣了解技术细节,请继续阅读以下部分。
Angular 的新渲染和编译管道 Ivy 是开发人员过去一年的默认体验。为了确保与旧管道的互操作性,我们维护对开发体验有影响的兼容性层。在这篇文章中,您将了解我们从旧版编译器转向更快编译和简单性的计划。
Ivy 多年来一直致力于让 Angular 变得更简单、更快、更容易维护。我们一直在微调静态检查和动态构造之间的平衡,以确保 Angular 继续提供类型检查、高效的构建时优化和快速更改检测。
从版本 9 开始,我们为全新的 Angular 应用程序启用了 Ivy,并提供了平滑、自动的更新路径。为了确保应用程序与使用以前的渲染和编译管道(View Engine)的库的向后兼容性,我们开发了一个名为ngcc的兼容性编译器。您可能已经注意到ngcc在创建新项目或安装依赖项后运行。

ngcc是我们编译 View Engine 库的方法,以便 Ivy 应用程序可以使用它们。
我们花了很多时间来确保ngcc速度很快,并且我们仅在必要时调用它,但这是安装依赖项和运行项目之间的额外步骤。此外,拥有依赖于 View Engine 的库意味着我们无法删除这个遗留实现,它有自己的维护成本,并且会减慢我们 Angular 的发展速度。
为了从 View Engine 过渡,我们制定了Ivy 库分发计划,并将其作为 RFC 与社区共享。我们收集了很多精彩的反馈,并作为 Angular v11.2 的一部分发布了预览实现。
远离 View Engine
目前,开发人员可以将 Ivy 或 View Engine 用于他们的应用程序和库。要将整个生态系统迁移到 Ivy,我们需要为库和应用程序开发人员提供平滑的更新路径。
查看遥测中--enableIvy标志的使用情况,我们发现绝大多数应用程序当前都在使用 Ivy,这使我们能够删除--enableIvy标志并弃用 View Engine。得益于我们的兼容性编译器,ivy 应用程序可以依赖 View Engine 库。

同时,目前所有库都是View Engine格式。得益于兼容性编译器,开发人员可以在 Ivy 应用程序和库中使用所有这些库,但反之则不然 — View Engine 库不能依赖于 Ivy。
经过与库作者和应用程序开发人员的多次对话,在 v12 中,我们将启动一项计划,完全迁移到 Ivy 并解锁 View Engine 的删除:
- 弃用 View Engine 并禁用使用它创建新应用程序的功能
- 默认为新库项目启用 Ivy 库分发
为了确保依赖于 Angular 框架和组件的库的顺利过渡,我们将继续以 View Engine 格式分发它们。在 v13 中,当大多数第三方库已经在使用 Ivy 时,我们也计划过渡 Angular 和组件。
这对你有何影响?
这些更改仅适用于新的应用程序和库。通常不需要对现有项目采取任何操作。
如果您是应用程序开发人员,这不会对您的日常开发过程产生任何影响。如果您当前依赖 View Engine,请确保将您的应用程序移至Ivy 。
如果您正在构建库并且所有用户都在 Ivy 上,则此更改不需要您执行任何操作,除非您想尝试新的 Ivy 库分发格式。如果 View Engine 应用程序或库依赖于您的库,我们建议继续以 View Engine 格式分发它。在 v12 中,请确保在所有依赖库和应用程序都迁移到 Ivy 之前,不要选择加入 Ivy 库发行版。
随着新的 Ivy 库发行版的推出,库和应用程序开发人员将开始看到更少的ngcc编译,因此拥有更好的开发体验。
如何选择退出?
如果您是库开发人员并且尚未准备好迁移到 Ivy,请在 v12 中将tsconfig.lib.prod.json更新为:
/* To learn more about this file see: https://angular.io/config/tsconfig. */
{
"extends": "./tsconfig.lib.json",
"compilerOptions": {
"declarationMap": false
},
"angularCompilerOptions": {
"enableIvy": false
}
}
你能提供什么帮助?
如果您是库开发人员,您可以测试新的库分发机制并向我们提供反馈!您可以使用此配置为现有的 View Engine 库启用 Ivy 库分发。将tsconfig.lib.prod.json更新为:
/* To learn more about this file see: https://angular.io/config/tsconfig. */
{
"extends": "./tsconfig.lib.json",
"compilerOptions": {
"declarationMap": false
},
"angularCompilerOptions": {
"enableIvy": true,
"compilationMode": "partial"
}
}
如果您遇到任何问题,请在 GitHub 上报告。
如果存在依赖 View Engine 的依赖库或应用程序,请确保您与它们的作者合作将它们迁移到 Ivy,然后再为您的软件包启用 Ivy 库分发。
原文链接:https://blog.angular.dev/upcoming-improvements-to-angular-library-distribution-76c02f782aa4