Skip to content

Commit cc3167f

Browse files
committed
perf(@angular-devkit/build-angular): reduce build times for apps with a large number of components when utilizing esbuild-based builders
In this commit, we've optimized the build performance for applications containing a large number of components when using the esbuild-based builder. This optimization entails replacing the spread operator with `Object.assign` when appending to the result metadata in the Angular compiler plugin to avoid creating multiple copies of the object. See: https://bugs.chromium.org/p/v8/issues/detail?id=11536 **Previous Performance**: - Initial compilation: 37 seconds - First incremental build: 20 seconds - Second incremental build: 16 seconds **Updated Performance**: - Initial compilation: 24 seconds - First incremental build: 6 seconds - Second incremental build: 2 seconds Closes #27280 (cherry picked from commit 0a49435)
1 parent d1637d7 commit cc3167f

File tree

2 files changed

+7
-4
lines changed

2 files changed

+7
-4
lines changed

packages/angular_devkit/build_angular/src/tools/esbuild/angular/compiler-plugin.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -420,8 +420,11 @@ export function createCompilerPlugin(
420420

421421
// Combine additional metafiles with main metafile
422422
if (result.metafile && metafile) {
423-
result.metafile.inputs = { ...result.metafile.inputs, ...metafile.inputs };
424-
result.metafile.outputs = { ...result.metafile.outputs, ...metafile.outputs };
423+
// Append the existing object, by appending to it we prevent unnecessary new objections creations with spread
424+
// mitigating significant performance overhead for large apps.
425+
// See: https://bugs.chromium.org/p/v8/issues/detail?id=11536
426+
Object.assign(result.metafile.inputs, metafile.inputs);
427+
Object.assign(result.metafile.outputs, metafile.outputs);
425428
}
426429
}
427430

packages/angular_devkit/build_angular/src/tools/esbuild/bundler-context.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,8 +136,8 @@ export class BundlerContext {
136136

137137
// Combine metafiles used for the stats option as well as bundle budgets and console output
138138
if (result.metafile) {
139-
metafile.inputs = { ...metafile.inputs, ...result.metafile.inputs };
140-
metafile.outputs = { ...metafile.outputs, ...result.metafile.outputs };
139+
Object.assign(metafile.inputs, result.metafile.inputs);
140+
Object.assign(metafile.outputs, result.metafile.outputs);
141141
}
142142

143143
result.initialFiles.forEach((value, key) => initialFiles.set(key, value));

0 commit comments

Comments
 (0)