diff --git a/packages/angular/build/src/builders/dev-server/vite-server.ts b/packages/angular/build/src/builders/dev-server/vite-server.ts index 682fb9d9526d..217e0af011e3 100644 --- a/packages/angular/build/src/builders/dev-server/vite-server.ts +++ b/packages/angular/build/src/builders/dev-server/vite-server.ts @@ -501,25 +501,15 @@ async function invalidateUpdatedFiles( } // Invalidate any updated files - let destroyAngularServerAppCalled = false; + let serverApplicationChanged = false; for (const [file, record] of generatedFiles) { if (!record.updated) { continue; } - record.updated = false; - - if (record.type === BuildOutputFileType.ServerApplication && !destroyAngularServerAppCalled) { - // Clear the server app cache - // This must be done before module invalidation. - const { ɵdestroyAngularServerApp } = (await server.ssrLoadModule('/main.server.mjs')) as { - ɵdestroyAngularServerApp: typeof destroyAngularServerApp; - }; - - ɵdestroyAngularServerApp(); - destroyAngularServerAppCalled = true; - } + record.updated = false; updatedFiles.push(file); + serverApplicationChanged ||= record.type === BuildOutputFileType.ServerApplication; const updatedModules = server.moduleGraph.getModulesByFile( normalizePath(join(server.config.root, file)), @@ -527,9 +517,14 @@ async function invalidateUpdatedFiles( updatedModules?.forEach((m) => server.moduleGraph.invalidateModule(m)); } - if (destroyAngularServerAppCalled) { - // Trigger module evaluation before reload to initiate dependency optimization. - await server.ssrLoadModule('/main.server.mjs'); + if (serverApplicationChanged) { + // Clear the server app cache and + // trigger module evaluation before reload to initiate dependency optimization. + const { ɵdestroyAngularServerApp } = (await server.ssrLoadModule('/main.server.mjs')) as { + ɵdestroyAngularServerApp: typeof destroyAngularServerApp; + }; + + ɵdestroyAngularServerApp(); } return updatedFiles; diff --git a/packages/angular/build/src/tools/vite/middlewares/ssr-middleware.ts b/packages/angular/build/src/tools/vite/middlewares/ssr-middleware.ts index 91fafc2deb17..36e602491fd4 100644 --- a/packages/angular/build/src/tools/vite/middlewares/ssr-middleware.ts +++ b/packages/angular/build/src/tools/vite/middlewares/ssr-middleware.ts @@ -40,6 +40,11 @@ export function createAngularSsrInternalMiddleware( const { writeResponseToNodeResponse, createWebRequestFromNodeRequest } = await loadEsmModule('@angular/ssr/node'); + // The following is necessary because accessing the module after invalidation may result in an empty module, + // which can trigger a `TypeError: ɵgetOrCreateAngularServerApp is not a function` error. + // TODO: look into why. + await server.ssrLoadModule('/main.server.mjs'); + const { ɵgetOrCreateAngularServerApp } = (await server.ssrLoadModule('/main.server.mjs')) as { ɵgetOrCreateAngularServerApp: typeof getOrCreateAngularServerApp; };