使用 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 上的角度错误