Angular 20 vs Resolve_build_size_19 chunk sizes

Total bytes barely moved. Initial first load almost doubled because vendor that the size-fix branch kept lazy is eager again on the Angular 20 QA prerender.

current feature/release-0.0.23/16-17-18-19-20 f08c71681b
current stack Angular 20.3.31, PrimeNG 20.4.0, npm run prerender-all-qa
baseline Resolve_build_size_19 8041cebafa
baseline stack Angular 19.2.25, PrimeNG 19.1.4, qa compile
sizes raw / Brotli 11 transfer, same units Angular prints

Browser totals

JS and CSS chunks only. Prerender does not change these sizes. Feature lazy modules did not regress.

metric          | A19 size-fix         | A20 current           | delta
initial raw     |  6.80 MB            | 12.43 MB            | +5.63 MB
initial transfer|  1.14 MB            |  2.00 MB            | +0.86 MB
lazy raw        | 16.82 MB            | 13.43 MB            | -3.39 MB
lazy transfer   |  2.87 MB            |  2.19 MB            | -0.68 MB
all raw         | 23.63 MB            | 25.86 MB            | +2.23 MB
all transfer    |  4.02 MB            |  4.19 MB            | +0.17 MB
initial files   | 27                  | 21                  | fewer files, more in initial
lazy files      | 117                 | 98                  | moved into initial

Named files

main grew. styles shrank a little. Lazy feature modules stayed put.

name                         | A19                  | A20                  | delta
main                         | 184.43 kB / 44.09 kB| 293.22 kB / 55.80 kB| +108.80 kB raw
styles                       | 1.85 MB / 148.44 kB | 1.81 MB / 143.16 kB | -35 kB raw
polyfills                    | 35.10 kB            | 35.10 kB            | 0
scripts                      | 3.88 kB             | 3.88 kB             | 0
heic-to                      | 2.52 MB             | 2.52 MB             | 0
monetize-module              | 1.38 MB             | 1.38 MB             | ~0
insights-module              | 709.26 kB           | 708.92 kB           | ~0
messages-module              | 307.55 kB           | 306.79 kB           | ~0
whitelabel-cover-page-module | 316.27 kB           | 313.79 kB           | -2.5 kB
amazon-ivs-web-broadcast     | 619.21 kB           | 619.22 kB           | 0

Largest unnamed initial JS

These kitchen-sink vendor chunks hold PrimeNG, Firebase, aws-sdk, video.js, ng-select, and Stripe. They are the bulk of the first-load jump. Server initial follows the same split: 5.92 MB to 11.64 MB.

rank | A19 size-fix | A20 current
1    | 2.51 MB     | 3.92 MB
2    | 1.08 MB     | 3.48 MB
3    | 587.50 kB   | 1.91 MB
sum  | 4.18 MB     | 9.31 MB  +5.13 MB

Why initial grew

  • Lara is eager on Angular 20. AppModule does import * as LaraTheme from '@primeuix/themes/lara' and passes the preset to providePrimeNG. Resolve_build_size_19 only sets darkModeSelector up front and loads Lara later through PrimeNgLoaderService.
  • Phone and emoji are eager again. Current SharedModule still imports NgxIntlTelInputModule and PickerModule. The size-fix branch deferred both. That shows up as initial chunk-SA2WMUN6.js at 675.29 kB (intl-tel-input and libphonenumber), which is not in A19 initial.
  • The big unnamed initial JS chunks grew. Rank 1 to 3 went from 4.18 MB to 9.31 MB.

What did not get worse

Vendor CSS is slightly better here. ng-select, datepicker, and toastr CSS are inject: false on this branch and still sit in the main styles bundle on Resolve_build_size_19.

  • The Angular 20 upgrade did not blow up total bytes. All-chunk transfer only moved from 4.02 MB to 4.19 MB.
  • It undid the initial-versus-lazy split that Resolve_build_size_19 was built to create.
  • Full untruncated Angular 20 chunk list: prerender-all-qa chunk sizes.