【问题标题】:Is not core-js needed anymore?不再需要 core-js 了吗?
【发布时间】:2019-11-15 10:47:27
【问题描述】:

我已经将一个 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 上分析包不存在: 在我的 older 项目中,使用 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 作为依赖项删除是否安全?更新原理图是否缺少这个?在最新项目上安装npm 依赖项时,我从core-js 收到安装后消息,但它没有明确出现在包描述中。

【问题讨论】:

  • 上图中突出显示的core-jscore.js 是否相同?

标签: angular angular-cli angular8


【解决方案1】:

根据this文章。

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

【讨论】:

  • @h0b0,这绝对是有帮助的,很高兴知道,谢谢!
  • 对于旧版本的 common.js,您仍然需要手动添加 es7 polyfill,因为这些不是由 CI 添加的。但是在 Angular 10.0.4 中,您不再需要这样做,因为 common.js 不再按语言版本分隔 polyfill。
【解决方案2】:

如果您在 Angular 7 或更早的项目中查看 src/polyfills.ts,您会看到一堆 cmets 并注释掉了 import 语句,这些语句允许您通过取消注释来为各种浏览器添加 polyfill - 大多数来自 core.js .

在 Angular 8 中,随着 Differential Loading 的出现,CLI 将根据您在 browserslist 文件和 tsconfig 文件中的要求构建 2 个包 - 一个带有 polyfill,一个不带有 polyfill。

Angular CLI 会在构建部署过程中为您处理差异加载。 ng build 命令根据您的浏览器支持要求和编译目标生成用于差异加载的必要包。

ng8 中与 core-js 的不同之处在于,由于 CLI 正在处理 polyfill,因此 core-js 是 CLI 的依赖项。因此,即使您在升级到 ng8 的过程中卸载 core-js,您也会看到它仍在您的 node_modules 文件夹中,但您不必管理安装的版本。

在您将项目和 CLI 升级到 Angular 8 后,我建议您这样做:

  1. 将 polyfills.ts 的内容替换为新生成的 ng8 项目中同一文件的内容
  2. 从您的项目中卸载 core-js。

现在您可以构建您的项目,CLI 会处理 polyfill。

【讨论】:

  • 是的,如果它只工作...ERROR Error: Uncaught (in promise): TypeError: Object doesn't support property or method 'includes'
  • @Endrju polyfills 仍然被添加,但是,正如我在回答中提到的,您需要确保您的 browserslist 文件设置为包含您想要支持的浏览器,以便它们被填充
  • 是的,我已经仔细检查过了,但在 IE11 中仍然出现错误。 pastebin.com/NiztQV2n
  • @Endrju 也许您可以发布一个问题,以便我们更全面地了解该问题
  • 这是关键:“用新生成的 ng8 项目中的同一文件的内容替换 polyfills.ts 的内容”效果很好——我从 Angular 10 项目中复制了 polyfills.ts 文件并它就像一个魅力
猜你喜欢
  • 2016-02-14
  • 2016-10-30
  • 2018-07-24
  • 1970-01-01
  • 2016-12-01
  • 2021-04-15
  • 1970-01-01
  • 2015-10-19
  • 1970-01-01
相关资源
最近更新 更多