问题
I've updated an Angular project from version 7 to 8. Everything runs smoothly, schematics did it's job (maybe) and we are Ok (project is even in production). When we're updating Angular CLI, we always generate a new project to see the real differences and learn from them such as new dependencies, configurations, etc.
When generating a new Angular project with Angular CLI 8.0.4, the new app doesn't have core-js
as dependency:
"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"
}
Analyzing bundle on built project core-js
is not there:
On my older project, updated with Angular CLI, core-js
is there and is present in the final bundle:
"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"
}
Why is this behavior? Is it safe to remove core-js
as dependency? Does update schematics missing this? When installing npm
dependencies on the newest project I get the post-install messages from core-js
, but it is not explicitly present in package description.
回答1:
According to this article.
Note that core-js has been updated to v3, and is now directly handled by the CLI itself, so it’s no longer needed as a dependency of your application.
回答2:
If you look in src/polyfills.ts
in an Angular 7 or earlier project, you'll see a bunch of comments and commented out import statements that allow you to add polyfills for various browsers by uncommenting them - most come from core.js.
In Angular 8, with the advent of Differential Loading, the CLI will build 2 bundles - one with and one without polyfills, based on your requirements in the browserslist
file and your tsconfig file.
The Angular CLI handles differential loading for you as part of the build process for deployment. The ng build command produces the necessary bundles used for differential loading, based on your browser support requirements and compilation target.
The difference with core-js in ng8 is that, since the CLI is handling polyfills, core-js is a dependency of the CLI. So even if you uninstall core-js as part of upgrading to ng8, you'll see it's still in your node_modules folder, but you won't have to manage which version is installed.
After you've upgraded your project and the CLI to angular 8, I would suggest you do this:
- replace the contents of polyfills.ts with the contents of the same file in a newly generated ng8 project
- Uninstall core-js from your project.
Now you can build your project and the CLI takes care of the polyfills.
来源:https://stackoverflow.com/questions/56892243/is-not-core-js-needed-anymore