angular-cn/aio/content/guide/migration-ngcc.md

2.8 KiB

Migration to ngcc npm postinstall script

What does this schematic do?

This schematic adds an Angular compatibility compiler, or ngcc, invocation to npm/yarn's postinstall script in the package.json of an Angular CLI workspace. This script is invoked after each execution of npm install and modifies node_modules by converting any found Angular libraries to a format that is compatible with Angular version 9.

An example diff might look like the following:

Before:

  "scripts": {
    "ng": "ng",
    "start": "ng serve",
    "build": "ng build",
    "test": "ng test",
    "lint": "ng lint",
    "e2e": "ng e2e"
  },

After:

  "scripts": {
    "ng": "ng",
    "start": "ng serve",
    "build": "ng build",
    "test": "ng test",
    "lint": "ng lint",
    "e2e": "ng e2e",
    "postinstall": "ngcc --properties es2015 browser module main --first-only --create-ivy-entry-points"
  },

If the package.json already contains a postinstall script, then the ngcc invocation will be prepended to the current command:

Before:

  "scripts": {
    ...
    "postinstall": "some-command"
  },

After:

  "scripts": {
    ...
    "postinstall": "ngcc --properties es2015 browser module main --first-only --create-ivy-entry-points && some-command"
  },

Why is this migration necessary?

This migration is a build performance optimization that enables ngcc to parallelize the compilation of npm libraries. An application build performed via CLI's ng build should succeed regardless of this postinstall script being installed, because the CLI has ngcc built-in. However, this built-in ngcc can't parallelize the compilation of multiple libraries, and therefore often takes considerably longer to run.

Can I customize the ngcc options in the postinstall script?

By default the postinstall script invokes ngcc with options to compile only the most commonly needed library formats. For some projects, especially those that depend on the CommonJS distribution of Angular (for example, Angular Universal apps), it might be beneficial to modify the postinstall script to also compile the CommonJS distribution of the library:

  "scripts": {
    ...
    "postinstall": "ngcc --properties es2015 browser module main --first-only --create-ivy-entry-points && ngcc --properties main --create-ivy-entry-points"
  },

For the full set of options run npx ngcc --help or yarn ngcc --help.

Will libraries compiled with ngcc still be compatible with Angular version 8?

Yes, the migration causes ngcc to be invoked with the --create-ivy-entry-points flag, which ensures that the ngcc compilation is non-destructive, so the same node_modules can be used with Angular version 8 and version 9.