Skip to content

Commit 14d2f7c

Browse files
committed
fix(@angular/build): include extracted routes in the manifest during prerendering
This commit ensures that extracted routes are added to the manifest during prerendering. This guarantees a correct ng-server-context value for parameterized routes and provides a performance benefit by preventing route extraction from being repeated for every rendering worker. Closes #29426 (cherry picked from commit 395562a)
1 parent c87a38f commit 14d2f7c

File tree

3 files changed

+16
-6
lines changed

3 files changed

+16
-6
lines changed

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

-1
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,6 @@ export async function executePostBundleSteps(
184184
}
185185

186186
const serializableRouteTreeNodeForManifest: WritableSerializableRouteTreeNode = [];
187-
188187
for (const metadata of serializableRouteTreeNode) {
189188
serializableRouteTreeNodeForManifest.push(metadata);
190189

packages/angular/build/src/utils/server-rendering/prerender.ts

+11
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { assertIsError } from '../error';
1616
import { urlJoin } from '../url';
1717
import { WorkerPool } from '../worker-pool';
1818
import { IMPORT_EXEC_ARGV } from './esm-in-memory-loader/utils';
19+
import { SERVER_APP_MANIFEST_FILENAME } from './manifest';
1920
import {
2021
RouteRenderMode,
2122
RoutersExtractorWorkerResult,
@@ -156,6 +157,16 @@ export async function prerenderPages(
156157
};
157158
}
158159

160+
// Add the extracted routes to the manifest file.
161+
// We could re-generate it from the start, but that would require a number of options to be passed down.
162+
const manifest = outputFilesForWorker[SERVER_APP_MANIFEST_FILENAME];
163+
if (manifest) {
164+
outputFilesForWorker[SERVER_APP_MANIFEST_FILENAME] = manifest.replace(
165+
'routes: undefined,',
166+
`routes: ${JSON.stringify(serializableRouteTreeNodeForPrerender, undefined, 2)},`,
167+
);
168+
}
169+
159170
// Render routes
160171
const { errors: renderingErrors, output } = await renderPages(
161172
baseHref,

tests/legacy-cli/e2e/tests/build/server-rendering/server-routes-output-mode-static.ts

+5-5
Original file line numberDiff line numberDiff line change
@@ -101,11 +101,11 @@ export default async function () {
101101
await replaceInFile('src/app/app.routes.server.ts', 'RenderMode.Server', 'RenderMode.Prerender');
102102
await noSilentNg('build', '--output-mode=static');
103103

104-
const expects: Record<string, string> = {
105-
'index.html': 'home works!',
106-
'ssg/index.html': 'ssg works!',
107-
'ssg/one/index.html': 'ssg-with-params works!',
108-
'ssg/two/index.html': 'ssg-with-params works!',
104+
const expects: Record<string, RegExp | string> = {
105+
'index.html': /ng-server-context="ssg".+home works!/,
106+
'ssg/index.html': /ng-server-context="ssg".+ssg works!/,
107+
'ssg/one/index.html': /ng-server-context="ssg".+ssg-with-params works!/,
108+
'ssg/two/index.html': /ng-server-context="ssg".+ssg-with-params works!/,
109109
// When static redirects as generated as meta tags.
110110
'ssg-redirect/index.html': '<meta http-equiv="refresh" content="0; url=/ssg">',
111111
};

0 commit comments

Comments
 (0)