不再需要使用core-js了吗?

51

我已将一个Angular项目从7版本更新到8版本。一切运行顺畅,框架可能已经完成了它的工作,我们也很好(项目甚至已经部署到生产环境中)。当我们更新Angular CLI时,我们总是生成一个新项目以查看实际的差异并从中学习,例如新依赖项、配置等。

使用Angular CLI 8.0.4生成新的Angular项目时,新应用程序没有core-js作为依赖项:

"dependencies": {
    "@angular/animations": "~8.0.1",
    "@angular/common": "~8.0.1",
    "@angular/compiler": "~8.0.1",
    "@angular/core": "~8.0.1",
    "@angular/forms": "~8.0.1",
    "@angular/platform-browser": "~8.0.1",
    "@angular/platform-browser-dynamic": "~8.0.1",
    "@angular/router": "~8.0.1",
    "rxjs": "~6.4.0",
    "tslib": "^1.9.0",
    "zone.js": "~0.9.1"
  }
分析构建项目时,core-js的捆绑包不存在:Bundle without core-js 在我的旧项目中,使用 Angular CLI 更新后,core-js是存在的,并且在最终捆绑包中出现。
"dependencies": {
    "@angular/animations": "~8.0.3",
    "@angular/cdk": "~8.0.1",
    "@angular/common": "~8.0.3",
    "@angular/compiler": "~8.0.3",
    "@angular/core": "~8.0.3",
    "@angular/forms": "~8.0.3",
    "@angular/platform-browser": "~8.0.3",
    "@angular/platform-browser-dynamic": "~8.0.3",
    "@angular/router": "~8.0.3",
    "@auth0/angular-jwt": "2.1.1",
    "@hackages/ngxerrors": "~8.0.0",
    "@ng-bootstrap/ng-bootstrap": "5.0.0-rc.1",
    "@ngx-loading-bar/core": "~4.2.0",
    "@ngx-loading-bar/http-client": "~4.2.0",
    "@nicky-lenaers/ngx-scroll-to": "~2.0.0",
    "@swimlane/ngx-charts": "~12.0.1",
    "bootstrap": "~4.3.1",
    "core-js": "~2.6.9",
    "d3-scale": "~3.0.0",
    "d3-shape": "~1.3.5",
    "date-fns": "2.0.0-beta.2",
    "ngx-perfect-scrollbar": "~8.0.0",
    "ngx-toastr": "~10.0.4",
    "rxjs": "~6.5.2",
    "tslib": "~1.10.0",
    "xlsx": "~0.14.3",
    "zone.js": "~0.9.1"
  }

core-js在最终捆绑包中存在

为什么会出现这种情况?是否可以安全地删除core-js依赖项?更新原理图是否缺失了这个?当在最新项目上安装npm依赖时,我会收到来自core-js的后安装消息,但它在包描述中并不存在。


1
上面的图片中,core-jscore.js 是同一个吗? - Naveed Ahmed
2个回答

59

根据这篇文章指出:

需要注意的是,core-js已经更新到v3,并由CLI本身直接处理,因此不再需要作为应用程序的依赖。


1
@h0b0,这绝对是有帮助的,也很高兴知道,谢谢! - Artem Zur
在旧版本的common.js中,由于CI没有添加es7 polyfills,因此仍需要手动添加。但是在Angular 10.0.4中,您不再需要这样做,因为common.js不再按语言版本分离polyfills。 - h0b0

32
如果您查看 Angular 7 或更早版本项目中的 src/polyfills.ts,您会看到一堆注释和已注释的导入语句,这些可以通过取消注释来添加不同浏览器的 polyfill,大部分源于 core.js。
在 Angular 8 中,随着 差异化加载 的出现,CLI 将构建两个捆绑包 - 一个带有 polyfill,一个不带,基于您在 browserslist 文件和 tsconfig 文件中的要求。

Angular CLI 会处理差异化加载,作为部署过程的一部分。ng build 命令会生成所需的捆绑包用于差异化加载,基于您的浏览器支持要求和编译目标。

在 ng8 中与 core-js 的区别在于,由于 CLI 处理 polyfill,core-js 是 CLI 的依赖项。因此,即使您升级到 ng8 时卸载了 core-js,您仍会看到它在您的 node_modules 文件夹中,但您无需管理安装的哪个版本。
升级项目和 CLI 至 Angular 8 后,建议您执行以下操作:
  1. 使用新生成的 ng8 或更高版本项目中相同文件的内容替换 polyfills.ts 的内容
  2. 从项目中卸载 core-js。
现在,您可以构建您的项目,CLI 负责处理 polyfill。

是的,如果它能正常工作就好了...“错误:未捕获(在承诺中):类型错误:对象不支持属性或方法'includes'” - Endrju
@Endrju,虽然 polyfills 仍然会被添加,但正如我在回答中提到的那样,您需要确保您的 browserslist 文件已设置为包括您想要支持的浏览器,以便它们得到 polyfill。 - inorganik
是的,我已经仔细检查过了,在IE11中仍然出现错误。https://pastebin.com/NiztQV2n - Endrju
@Endrju也许你可以发布一个问题,这样我们就能更全面地了解问题的情况。 - inorganik
1
这是关键: '使用新生成的ng8项目中相同文件的内容替换polyfills.ts文件的内容',完美地发挥了作用——我从一个Angular 10项目中复制了polyfills.ts文件,它就像魔法一样运作。 - Sofía

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接