119 Commits

Author SHA1 Message Date
Doug Parker
982df7e77a fix(@angular-devkit/build-angular): update budgets to check differential builds separately
Fixes #15792.

Previously, budgets would include content for both versions of a differential build. Thus the `initial` budget would count content from the ES5 **and** ES2015 bundles together. This is a very misleading statistic because no user would download both versions. I've updated the budget calculators to take this into account and generate size values for both builds which are then checked independently of each other.

The only calculators I changed are the `InitialCalculator` (for computing `initial` bundle sizes) and `BundleCalculator` (for computing named bundles). Since budgets are handled by Webpack for builds without differential loading, the `initial` bundle will always have those two sizes. The `BundleCalculator` might reference a bundle which does not have differential loading performed (such as a CSS file), so it emits sizes depending on whether or not multiple builds were found for that chunk.

Most of the other calculators don't really need to take differential loading into account. `AnyScriptCalculator` and `AnyCalculator` already apply on a file-by-file basis, so they generate sizes for both build versions already. `AnyComponentStyleCalculator` only applies to CSS which does not have differential builds.

The wierd ones here are `AllCalculator` and `AllScriptCalculator` which reference files with and without differential builds. Conceptually, they should be separated, as a "total" budget specified by an app developer probably wanted it to mean "the total resources a user would have to download", which would only be one differential build at a time. However, I don't see a good way of identifying which assets belong to which differential build. Even if an asset belongs to a chunk with differential builds, we don't know which build takes which assets into account. I decided to leave this for the time being, but it is probably something we should look into separately.

Since budgets take differential loading into account, users might reasonably want to set different budgets for different builds (ie. "initial-es2015 bundle should be capped at 100k, but initial-es5 bundle can go to 150k"). That's more of a feature request, so I also left that out for a future PR.
2019-12-09 15:26:50 -08:00
Doug Parker
6427922415 fix(@angular-devkit/build-angular): remove async files from initial bundle budget.
Refs #15792.

Static files listed in `angular.json` were being accounted in the `initial` bundle budget even when they were deferred asynchronously with `"lazy": true` or `"inject": false`. Webpack belives these files to be `initial`, so this commit corrects that by finding all extra entry points and excluding ones which are explicitly marked by the application developer as asynchronous.

One edge case would be that the main bundle might transitively depend on one of these static files, and thus pull it into the `initial` bundle. However, this is not possible because the files are not present until the end of the build and cannot be depended upon by a Webpack build step. Thus all files listed by the application developer can be safely assumed to truly be loaded asynchronously.
2019-12-09 15:26:50 -08:00
Doug Parker
1792ccaf57 refactor(@angular-devkit/build-angular): move budget computations to be post-build
Refs #15792.

This provides access to all the size information necessary because all build steps have already completed. This commit is roughly a no-op because it simply moves the budget checks (for different builds) to be executed post-build.

The lone exception is the AnyComponentStyle budget. Component stylesheet files are not emitted after the build is completed, so there is no size information to work with. Instead, these budgets are checked during a separate plugin (exected for different builds **and** non-differential builds).
2019-12-09 15:26:50 -08:00
Charles Lyding
713f95d678 fix(@angular-devkit/build-angular): localize service worker base href 2019-12-09 13:39:06 -08:00
Charles Lyding
c37eaeec43 fix(@angular-devkit/build-angular): augment base HREF when localizing
All locale i18n options now support an object form which allows a base HREF to be defined for the locale.  Each locale can now optionally define a custom base HREF that will be combined with the base HREF defined for the build configuration.  By default if the shorthand form for the locale is used or the field is not present in the longhand form, the locale code will be used as the base HREF.  To disable automatic augmentation a base HREF value of an empty string (`""`) can be used.  This will prevent anything from being added to the existing base HREF.

For common scenarios, the shorthand form will result in the preferred and recommended outcome of each built locale variant of the application containing a defined base HREF  containing the locale code.
2019-12-04 08:14:16 -08:00
Charles Lyding
1d79b28c17 fix(@angular-devkit/build-angular): support differential loading for web workers
Fixes #16275
2019-12-02 10:19:38 -08:00
Charles Lyding
09a7d87f00 fix(@angular-devkit/build-angular): ensure HTML lang attribute is set when localizing 2019-12-02 10:17:57 -08:00
Charles Lyding
cfc0aa4780 fix(@angular-devkit/build-angular): properly process es2016+ targets with differential loading
A target of es2015 was previously assumed when using differential loading.  This could result in erroneously downleveling an es2016+ output file instead of generating a new es5 output file.
2019-11-20 13:21:58 -08:00
Charles Lyding
f3a23fc6f1 fix(@angular-devkit/build-angular): ensure build-angular's webpack version is used 2019-11-15 10:41:01 -08:00
Charles
862b28f844 fix(@angular-devkit/build-angular): allow localization with development server (#16053)
* fix(@angular-devkit/build-angular): allow localization with development server

* test: ensure i18n application E2E tests are executed
2019-11-08 07:56:05 -08:00
Alan Agius
e70a2b04bd refactor(@angular-devkit/build-angular): use compiler parsed value of enableIvy
At the moment we are relying on source content to determine if the compilation is under Ivy or VE. However, we do know what compilation we are in from the parsed tsconfig.

With this change we use the `enableIvy` to set the analytics metric
2019-11-01 10:24:20 -07:00
Charles Lyding
a420549548 fix(@angular-devkit/build-angular): augment with serviceworker during localization 2019-10-30 09:36:46 -07:00
Alan Agius
588baa5737 fix(@angular-devkit/build-angular): i18n app shell with Ivy 2019-10-30 09:36:14 -07:00
Alan Agius
0686ceff67 fix(@angular-devkit/build-angular): i18n with Ivy in universal builder 2019-10-25 09:52:56 -07:00
Alan Agius
936a9512ae refactor(@angular-devkit/build-angular): move around i18n methods to make them re-usable 2019-10-25 09:52:56 -07:00
Charles Lyding
276032c962 fix(@angular-devkit/build-angular): use project root as translation file base 2019-10-24 12:04:42 -07:00
Charles Lyding
294ecdd7f3 fix(@angular-devkit/build-angular): remove @angular/localize from application if localizing 2019-10-24 12:04:42 -07:00
Charles Lyding
30536881f9 fix(@angular-devkit/build-angular): set locale identifier when localizing 2019-10-24 12:04:13 -07:00
Charles Lyding
5597f7fedc refactor(@angular-devkit/build-angular): allow control of cache location
`NG_BUILD_CACHE` can specify an absolute path to be used as the cache location.  Caching can also be disabled by setting the variable to 0 or false.
2019-10-23 09:56:49 -07:00
Charles Lyding
358bc12856 feat(@angular-devkit/build-angular): support i18n localization for non-differential builds 2019-10-21 13:03:32 -07:00
Charles Lyding
e9279bbe1a fix(@angular-devkit/build-angular): update sourcemaps during localization 2019-10-21 13:03:32 -07:00
Charles Lyding
895fa620a2 feat(@angular-devkit/build-angular): support deprecated i18n options with new configuration 2019-10-21 13:03:32 -07:00
Charles Lyding
bc831e8ff5 feat(@angular-devkit/build-angular): support parallel i18n localization 2019-10-21 13:03:32 -07:00
Charles Lyding
cda57ae0e5 feat(@angular-devkit/build-angular): optimize i18n localize usage in source locale 2019-10-17 10:45:01 -07:00
Charles Lyding
9fca29a254 refactor(@angular-devkit/build-angular): use copy file utility in action cache 2019-10-17 10:45:01 -07:00
Charles Lyding
2b41cd1e81 feat(@angular-devkit/build-angular): initial support for i18n translation inlining 2019-10-17 10:45:01 -07:00
Alan Agius
38947d8643 refactor(@angular-devkit/build-angular): remove differential loading version 1.0 2019-10-15 11:22:34 -07:00
Alan Agius
b3086ffd54 fix(@angular-devkit/build-angular): only copy assets outside of webpack when differential loading is needed in build builder
Fixes #15825
2019-10-14 13:42:29 -07:00
Filipe Silva
47490527ff feat(@angular-devkit/build-angular): add experimentalRollupPass (#15690)
In applications that make heavy use of lazy routes and ES2015 libraries, this option can improve bundle sizes. It might also break your bundles in ways we don't understand fully, so please test and report any problems you find.

NOTE: the following are known problems with experimentalRollupPass
- vendorChunk, commonChunk, namedChunks: these won't work, because by the time webpack sees the chunks, the context of where they came from is lost.
- webWorkerTsConfig: workers must be imported via a root relative path (e.g.`app/search/search.worker`) instead of a relative path (`/search.worker`) because of the same reason as above.
- loadChildren string syntax: doesn't work because rollup cannot follow the imports.
2019-10-10 12:39:38 -07:00
Alan Agius
c3169ae7d2 New i18n schema (#15760)
* feat(@angular-devkit/core): update schema to support new i18n options

"projects": {
  "my-app": {
    "projectType": "application",
    "schematics": {},
    "root": "",
    "i18n": {
      "sourceLocale": "en-US",
      "locales": {
        "fr": "src/locale/messages.fr.xlf"
      }
    },
    "sourceRoot": "src",
    ...
  }
}

* feat(@angular-devkit/build-angular): add new i18n options to browser and server builders

With this change we add `translateLocales` as new options for i18n in browser and server builders.

We also deprecate the following options;
* i18nLocale
* i18nFormat
* i18nFile

* feat(@angular-devkit/build-angular): deprecate `i18nFormat` and `i18nLocale` options of `extract-i18n` builder

Option `i18nFormat` has been deprecated in favor of `format` and `i18nLocale` option has been deprecated in favor of the `sourceLocale` sub option of the `i18n` project level option.

* feat(@angular/cli): add alias of `i18n-extract` for `x18n` command

* refactor: rename `translateLocales` to `localize`
2019-10-10 12:39:00 -07:00
Charles
2dc885304b refactor(@angular-devkit/build-angular): reorganize bundle processing for browser builder (#15776) 2019-10-09 11:25:23 -07:00
Charles
3a44611483 refactor(@angular-devkit/build-angular): initial copy-on-write asset processing support (#15788)
This is currently only supported when performing a differential loading build (no watch mode).  This will eventually be expanded to cover watch mode and non-differential loading builds.
2019-10-09 11:07:31 -07:00
Charles Lyding
72d1bf3c52 refactor(@angular-devkit/build-angular): support reading i18n project options 2019-10-03 14:40:31 -07:00
Charles Lyding
1cefbc6974 refactor(@angular-devkit/build-angular): process bundle code quality improvements 2019-10-03 14:40:31 -07:00
TinyMan
c5869f57bc feat(@angular-devkit/build-angular): set document locale when using i18nLocale
Fixes #8102
2019-10-02 10:55:15 -07:00
Charles Lyding
190f80cf58 refactor(@angular-devkit/build-angular): optimize bundle process cache detection
This causes the cache checking to stop on the first miss since all required entries must be present for a bundle to be considered cached.
2019-09-27 14:41:08 -07:00
Charles Lyding
dd2a6947ff refactor(@angular-devkit/build-angular): improve performance of parallel bundle processing 2019-09-27 14:41:08 -07:00
Charles Lyding
d3e4dfa0c0 fix(@angular-devkit/build-angular): display accurate sizes for downlevelled files
Fixes #15425
2019-09-26 10:00:35 -07:00
Charles Lyding
8dd67cd3cb fix(@angular-devkit/build-angular): inject correct SRI values in downlevel bundles
Fixes #15468
2019-09-26 10:00:35 -07:00
Charles Lyding
d73a098900 refactor(@angular-devkit/build-angular): account for disabled mangling in downlevel cache 2019-09-26 10:00:35 -07:00
Alan
18fb7faf10 feat(@angular-devkit/build-angular): deprecate lazyModules option
String form of lazy loading and SystemJsNgModuleLoader are deprecated, and this is part of its usage.

See: https://angular.io/api/core/SystemJsNgModuleLoader#systemjsngmoduleloader
2019-09-25 09:47:14 -07:00
Charles Lyding
ffd153a6a2 refactor(@angular-devkit/build-angular): use project metadata in builders
This eliminates the need to manually read a workspace file and removes the use of the experimental workspace API from the package.
2019-09-24 13:18:33 -07:00
Alan Agius
ab5b1909d6 build: update rxjs to 6.5.3 2019-09-24 13:18:09 -07:00
Charles Lyding
8a4bc54ef3 fix(@angular-devkit/build-angular): workaround Node.js copyFile defect on macOS
Fixes #15544
2019-09-19 14:42:04 -07:00
Alan Agius
5e1b3785f6 fix(@angular-devkit/build-angular): fix permission errors for ES5 bundles
copyFilesSync will also copy permissions which may result in permissions errors.

Closes #15490
2019-09-05 00:27:39 +05:30
Charles
4986577f8a fix(@angular-devkit/build-angular): skip downlevel processing of assets (#15433)
* fix(@angular-devkit/build-angular): identify asset emitted files

* fix(@angular-devkit/build-angular): skip downlevel processing of assets

Fixes #15423
2019-08-26 11:50:20 -07:00
Charles Lyding
d1488e66a4 refactor(@angular-devkit/build-angular): cache downlevel bundles 2019-08-20 11:07:55 -07:00
Charles Lyding
1c6f665c4f feat(@angular-devkit/build-angular): implement bundle level downleveling to support differential loading 2019-08-08 08:26:15 -07:00
Alan
bcf250c94d feat(@angular-devkit/build-angular): add bundle budget for component styles
It’s very easy to inadvertently import toplevel css in component styles. Since component css is standalone and self-contained, it will never be shared between components and remains as a single large bundle for each component. This in turn adds a large amount of code that must be processed and increases bundle size.

Related to: TOOL-949
2019-07-24 19:05:00 -07:00
Alan Agius
4f8e349033 fix(@angular-devkit/build-angular): only add module script types to actual module scripts
Fixes #15102
2019-07-24 19:04:31 -07:00