fix(ssr): remove broken dynamic import and lazy-init engine
CI Pipeline / backend-test (push) Successful in 5m39s
CI Pipeline / frontend-test (push) Successful in 27s
CI Pipeline / frontend-build (push) Successful in 30s
CI Pipeline / backend-lint (push) Successful in 9s
CI Pipeline / backend-test (pull_request) Successful in 5m24s
CI Pipeline / frontend-test (pull_request) Successful in 22s
CI Pipeline / frontend-build (pull_request) Successful in 30s
CI Pipeline / quality-gate (push) Successful in 2s
CI Pipeline / quality-gate (pull_request) Successful in 2s
CI Pipeline / backend-lint (pull_request) Successful in 8s

- Replace await import('./main.server.js') with lazy getEngine()
  (original path was wrong — main.server.ts lives in src/, not root)
- AngularNodeAppEngine handles manifest registration internally;
  no manual bootstrap import needed
- Add npm scripts: build:ssr, build:prerender, serve:ssr:radio-station
- Add PRERENDER.md build documentation

Verified: clean build prerenders all 5 routes, 54 tests pass
This commit is contained in:
Hermes Agent committed 2026-08-06 16:38:27 +00:00
1 parent e95a158d57
commit 63bc2fb22d
3 files changed
+99 -6

No files matched your search

+18 -5
View File
@@ -21,8 +21,6 @@ export const PRERENDERED_ROUTES: readonly string[] = [
'/contact',
];
const ngApp = new AngularNodeAppEngine();
/**
* Normalise a request pathname and check against prerendered routes.
* Handles both bare paths (`/about`) and trailing-slash variants (`/about/`).
@@ -35,6 +33,19 @@ export function isPrerenderedRoute(url: string): boolean {
return PRERENDERED_ROUTES.includes(normalised);
}
/**
* Lazily instantiate AngularNodeAppEngine so the engine boots only when
* the first request arrives. The engine handles both prerendered route
* lookups and on-demand SSR bootstrapping internally.
*/
let appEngine: AngularNodeAppEngine | null = null;
function getEngine(): AngularNodeAppEngine {
if (!appEngine) {
appEngine = new AngularNodeAppEngine();
}
return appEngine;
}
/**
* Handle incoming requests using the Angular SSR engine.
*
@@ -46,12 +57,14 @@ export default createNodeRequestHandler(async (req, res, next) => {
try {
const prerendered = isPrerenderedRoute(req.url || '/');
if (prerendered) {
// Prerendered routes are served as static HTML — AngularNodeAppEngine
// reads the build-time manifest and returns the pre-generated response.
console.log(`[SSR] Prerendered route: ${req.url}`);
}
const response = await ngApp.handle(req);
// AngularNodeAppEngine handles manifest registration internally —
// no manual bootstrap import needed. For prerendered routes it
// returns pre-generated static HTML; for SSR routes it bootstraps
// the Angular app on demand.
const response = await getEngine().handle(req);
if (response) {
await writeResponseToNodeResponse(response, res);