Skip to content

Commit dd80e0f

Browse files
type(fix)
Addressing Alans concerns and removing the function and keeping the bundles separate
1 parent eab4b3a commit dd80e0f

File tree

5 files changed

+69
-67
lines changed

5 files changed

+69
-67
lines changed

packages/angular/build/src/builders/application/chunk-optimizer.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,21 @@ export async function optimizeChunks(
285285
}
286286
original.metafile = newMetafile;
287287

288+
// Update the isolated browser metafile to reflect the optimized output.
289+
// Server outputs are excluded since chunk optimization only affects browser bundles.
290+
const serverOutputPaths = new Set(Object.keys(original.serverMetafile?.outputs ?? {}));
291+
const browserOutputs: Metafile['outputs'] = {};
292+
const browserInputs: Metafile['inputs'] = {};
293+
for (const [path, output] of Object.entries(newMetafile.outputs)) {
294+
if (!serverOutputPaths.has(path)) {
295+
browserOutputs[path] = output;
296+
for (const inputPath of Object.keys(output.inputs)) {
297+
browserInputs[inputPath] = newMetafile.inputs[inputPath];
298+
}
299+
}
300+
}
301+
original.browserMetafile = { inputs: browserInputs, outputs: browserOutputs };
302+
288303
// Remove used chunks and associated sourcemaps from the original result
289304
original.outputFiles = original.outputFiles.filter(
290305
(file) =>

packages/angular/build/src/builders/application/execute-build.ts

Lines changed: 34 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,21 @@
77
*/
88

99
import { BuilderContext } from '@angular-devkit/architect';
10+
import type { Metafile } from 'esbuild';
1011
import { createAngularCompilation } from '../../tools/angular/compilation';
1112
import { SourceFileCache } from '../../tools/esbuild/angular/source-file-cache';
1213
import { generateBudgetStats } from '../../tools/esbuild/budget-stats';
1314
import {
1415
BuildOutputFileType,
1516
BundleContextResult,
1617
BundlerContext,
18+
InitialFileRecord,
1719
} from '../../tools/esbuild/bundler-context';
1820
import { ExecutionResult, RebuildState } from '../../tools/esbuild/bundler-execution-result';
1921
import { checkCommonJSModules } from '../../tools/esbuild/commonjs-checker';
2022
import { extractLicenses } from '../../tools/esbuild/license-extractor';
2123
import { profileAsync } from '../../tools/esbuild/profiling';
2224
import {
23-
buildMetafileForType,
2425
calculateEstimatedTransferSizes,
2526
logBuildStats,
2627
transformSupportedBrowsersToTargets,
@@ -38,6 +39,32 @@ import { inlineI18n, loadActiveTranslations } from './i18n';
3839
import { NormalizedApplicationBuildOptions } from './options';
3940
import { createComponentStyleBundler, setupBundlerContexts } from './setup-bundling';
4041

42+
function filterMetafileByInitialFiles(
43+
metafile: Metafile,
44+
initialFiles: Map<string, InitialFileRecord>,
45+
): Metafile {
46+
const filteredOutputs: Metafile['outputs'] = {};
47+
const referencedInputs = new Set<string>();
48+
49+
for (const [path, output] of Object.entries(metafile.outputs)) {
50+
if (initialFiles.has(path)) {
51+
filteredOutputs[path] = output;
52+
for (const inputPath of Object.keys(output.inputs)) {
53+
referencedInputs.add(inputPath);
54+
}
55+
}
56+
}
57+
58+
const filteredInputs: Metafile['inputs'] = {};
59+
for (const [inputPath, input] of Object.entries(metafile.inputs)) {
60+
if (referencedInputs.has(inputPath)) {
61+
filteredInputs[inputPath] = input;
62+
}
63+
}
64+
65+
return { inputs: filteredInputs, outputs: filteredOutputs };
66+
}
67+
4168
// eslint-disable-next-line max-lines-per-function
4269
export async function executeBuild(
4370
options: NormalizedApplicationBuildOptions,
@@ -210,7 +237,7 @@ export async function executeBuild(
210237
executionResult.setExternalMetadata(implicitBrowser, implicitServer, [...explicitExternal]);
211238
}
212239

213-
const { metafile, initialFiles, outputFiles } = bundlingResult;
240+
const { metafile, browserMetafile, serverMetafile, initialFiles, outputFiles } = bundlingResult;
214241

215242
executionResult.outputFiles.push(...outputFiles);
216243

@@ -308,31 +335,23 @@ export async function executeBuild(
308335
if (options.stats) {
309336
executionResult.addOutputFile(
310337
'browser-stats.json',
311-
JSON.stringify(buildMetafileForType(metafile, 'browser', false, outputFiles), null, 2),
338+
JSON.stringify(browserMetafile, null, 2),
312339
BuildOutputFileType.Root,
313340
);
314341
executionResult.addOutputFile(
315342
'browser-initial-stats.json',
316-
JSON.stringify(
317-
buildMetafileForType(metafile, 'browser', true, outputFiles, initialFiles),
318-
null,
319-
2,
320-
),
343+
JSON.stringify(filterMetafileByInitialFiles(browserMetafile, initialFiles), null, 2),
321344
BuildOutputFileType.Root,
322345
);
323-
if (ssrOutputEnabled) {
346+
if (ssrOutputEnabled && serverMetafile) {
324347
executionResult.addOutputFile(
325348
'server-stats.json',
326-
JSON.stringify(buildMetafileForType(metafile, 'server', false, outputFiles), null, 2),
349+
JSON.stringify(serverMetafile, null, 2),
327350
BuildOutputFileType.Root,
328351
);
329352
executionResult.addOutputFile(
330353
'server-initial-stats.json',
331-
JSON.stringify(
332-
buildMetafileForType(metafile, 'server', true, outputFiles, initialFiles),
333-
null,
334-
2,
335-
),
354+
JSON.stringify(filterMetafileByInitialFiles(serverMetafile, initialFiles), null, 2),
336355
BuildOutputFileType.Root,
337356
);
338357
}

packages/angular/build/src/tools/esbuild/angular/component-stylesheets.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,7 @@ export class ComponentStylesheetBundler {
278278
contents,
279279
outputFiles,
280280
metafile,
281+
browserMetafile: metafile,
281282
referencedFiles,
282283
externalImports: result.externalImports,
283284
initialFiles: new Map(),

packages/angular/build/src/tools/esbuild/bundler-context.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ export type BundleContextResult =
2929
errors: undefined;
3030
warnings: Message[];
3131
metafile: Metafile;
32+
browserMetafile: Metafile;
33+
serverMetafile?: Metafile;
3234
outputFiles: BuildOutputFile[];
3335
initialFiles: Map<string, InitialFileRecord>;
3436
externalImports: {
@@ -128,6 +130,8 @@ export class BundlerContext {
128130
let errors: Message[] | undefined;
129131
const warnings: Message[] = [];
130132
const metafile: Metafile = { inputs: {}, outputs: {} };
133+
const browserMetafile: Metafile = { inputs: {}, outputs: {} };
134+
let serverMetafile: Metafile | undefined;
131135
const initialFiles = new Map<string, InitialFileRecord>();
132136
const externalImportsBrowser = new Set<string>();
133137
const externalImportsServer = new Set<string>();
@@ -148,6 +152,17 @@ export class BundlerContext {
148152
Object.assign(metafile.outputs, result.metafile.outputs);
149153
}
150154

155+
// Keep browser and server metafiles isolated for separate stats output
156+
if (result.browserMetafile) {
157+
Object.assign(browserMetafile.inputs, result.browserMetafile.inputs);
158+
Object.assign(browserMetafile.outputs, result.browserMetafile.outputs);
159+
}
160+
if (result.serverMetafile) {
161+
serverMetafile ??= { inputs: {}, outputs: {} };
162+
Object.assign(serverMetafile.inputs, result.serverMetafile.inputs);
163+
Object.assign(serverMetafile.outputs, result.serverMetafile.outputs);
164+
}
165+
151166
result.initialFiles.forEach((value, key) => initialFiles.set(key, value));
152167

153168
outputFiles.push(...result.outputFiles);
@@ -170,6 +185,8 @@ export class BundlerContext {
170185
errors,
171186
warnings,
172187
metafile,
188+
browserMetafile,
189+
serverMetafile,
173190
initialFiles,
174191
outputFiles,
175192
externalImports: {
@@ -415,6 +432,8 @@ export class BundlerContext {
415432
},
416433
externalConfiguration,
417434
errors: undefined,
435+
browserMetafile: isPlatformServer ? { inputs: {}, outputs: {} } : result.metafile,
436+
serverMetafile: isPlatformServer ? result.metafile : undefined,
418437
};
419438
}
420439

packages/angular/build/src/tools/esbuild/utils.ts

Lines changed: 0 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -29,58 +29,6 @@ import {
2929
PrerenderedRoutesRecord,
3030
} from './bundler-execution-result';
3131

32-
export function buildMetafileForType(
33-
metafile: Metafile,
34-
type: 'browser' | 'server',
35-
initial: boolean,
36-
outputFiles: BuildOutputFile[],
37-
initialFiles?: Map<string, InitialFileRecord>,
38-
): Metafile {
39-
const isServer = type === 'server';
40-
41-
const outputPathsForType = new Set(
42-
outputFiles
43-
.filter(({ type: fileType }) => {
44-
const isServerFile =
45-
fileType === BuildOutputFileType.ServerApplication ||
46-
fileType === BuildOutputFileType.ServerRoot;
47-
48-
return isServer ? isServerFile : !isServerFile;
49-
})
50-
.map(({ path }) => path),
51-
);
52-
53-
const filteredOutputs: Metafile['outputs'] = {};
54-
for (const [outputPath, output] of Object.entries(metafile.outputs)) {
55-
if (!outputPathsForType.has(outputPath)) {
56-
continue;
57-
}
58-
if (initial && !initialFiles?.has(outputPath)) {
59-
continue;
60-
}
61-
filteredOutputs[outputPath] = output;
62-
}
63-
64-
const referencedInputs = new Set<string>();
65-
for (const output of Object.values(filteredOutputs)) {
66-
for (const inputPath of Object.keys(output.inputs)) {
67-
referencedInputs.add(inputPath);
68-
}
69-
}
70-
71-
const filteredInputs: Metafile['inputs'] = {};
72-
for (const [inputPath, input] of Object.entries(metafile.inputs)) {
73-
if (referencedInputs.has(inputPath)) {
74-
filteredInputs[inputPath] = input;
75-
}
76-
}
77-
78-
return {
79-
inputs: filteredInputs,
80-
outputs: filteredOutputs,
81-
};
82-
}
83-
8432
export function logBuildStats(
8533
metafile: Metafile,
8634
outputFiles: BuildOutputFile[],

0 commit comments

Comments
 (0)