使用 ivy 兼容库时是不是仍需要运行 ngcc

Posted

技术标签:

【中文标题】使用 ivy 兼容库时是不是仍需要运行 ngcc【英文标题】:Is ngcc still required to run when using ivy compatible libraries使用 ivy 兼容库时是否仍需要运行 ngcc 【发布时间】:2021-06-29 04:51:46 【问题描述】:

我经常读到需要 ngcc 才能将非 ivy 兼容的库编译为 ivy 兼容的库。 所以我用最新的材料库(版本 11)建立了一个新的 Angular 项目(版本 11)。

由于材质库来自 Angular 团队,我想该库已经与 ivy 兼容。为了确认我的假设,我检查了 package.json,它为我提供了以下模块的入口点:

  "main": "./bundles/material.umd.js",
  "fesm2015": "./fesm2015/material.js",
  "esm2015": "./esm2015/index.js",
  "typings": "./index.d.ts",
  "module": "./fesm2015/material.js",
  "es2015": "./fesm2015/material.js"

所以对我来说,角度材料似乎已经编译成所有这些模块格式。

但是在运行 npm start / run build ngcc 后,仍然会将“es2015”编译为“esm2015”模块。

Compiling @angular/core : es2015 as esm2015
Compiling @angular/common : es2015 as esm2015
Compiling @angular/platform-browser : es2015 as esm2015
Compiling @angular/platform-browser-dynamic : es2015 as esm2015
Compiling @angular/cdk/keycodes : es2015 as esm2015
Compiling @angular/cdk/platform : es2015 as esm2015
...

这导致我提出以下问题:

我是否混淆了“模块格式”和“常春藤兼容性”的概念/主题? (例如,角度/材料是否提供所有这些模块格式,但不是以常春藤兼容的方式?) 当 Angular Material 已经包含 esm2015 模块时,为什么要将 es2015 编译为 esm2015? 当它们已经存在时,为什么 Angular cli 将它们编译为 esm2015? 通常鼓励添加运行 ngcc 的安装后挂钩。但是,当所有库都已合规时,我为什么还需要它呢?

【问题讨论】:

【参考方案1】:

我刚刚发现 Angular 目前不鼓励发布 ivy 库。 Source.

所以我想@angular/material 还没有编译为常春藤库。

关于 ESM2015 的编译 - 这可能与 Angular Library format 有关。 ESM2015 is basically ES2015 code with additional import/export statements.

所以是的,仍然需要运行 ngcc,因为目前还没有符合 ivy 的库。但一旦出现这种情况,我们就不再需要它了。

【讨论】:

以上是关于使用 ivy 兼容库时是不是仍需要运行 ngcc的主要内容,如果未能解决你的问题,请参考以下文章

`ngcc --properties es2015 浏览器模块主 --first-only --create-ivy-entry-points 上的角度错误

构建启用了Ivy的monorepo Angular9库是个坏主意

为啥我不应该发布用 Ivy 编译的库?

使用 iOS 4.0 库时的向后兼容性

另一个ID为#######的进程当前正在运行ngcc

Angular:在 VSCode 中运行 ngcc 会导致性能问题