From c33e862328f1857ea66d10253ca5b87b37e21c07 Mon Sep 17 00:00:00 2001 From: Alan Agius Date: Mon, 30 Sep 2024 08:47:30 +0000 Subject: [PATCH] refactor(@angular/build): Enable SSR with Prerendering Disabled in Vite This commit enables server-side rendering (SSR) in Vite when prerendering is turned off. It also imports `@angular/compiler` in the SSR middleware to resolve the following issue: ``` [vite] Internal server error: The injectable 'PlatformNavigation' needs to be compiled using the JIT compiler, but '@angular/compiler' is not available. The injectable is part of a library that has been partially compiled. However, the Angular Linker has not processed the library to utilize JIT compilation as a fallback. Ideally, the library should be processed with the Angular Linker for complete AOT compilation. ``` Closes #28523 --- .../angular/build/src/builders/dev-server/vite-server.ts | 1 + .../build/src/tools/vite/middlewares/ssr-middleware.ts | 7 +++++++ 2 files changed, 8 insertions(+) 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 6f17f94759..861786edb2 100644 --- a/packages/angular/build/src/builders/dev-server/vite-server.ts +++ b/packages/angular/build/src/builders/dev-server/vite-server.ts @@ -103,6 +103,7 @@ export async function* serveWithVite( // Disable prerendering if enabled and force SSR. // This is so instead of prerendering all the routes for every change, the page is "prerendered" when it is requested. browserOptions.prerender = false; + browserOptions.ssr ||= true; } // Set all packages as external to support Vite's prebundle caching 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 e03e3940eb..8e0b6ae6d1 100644 --- a/packages/angular/build/src/tools/vite/middlewares/ssr-middleware.ts +++ b/packages/angular/build/src/tools/vite/middlewares/ssr-middleware.ts @@ -34,6 +34,9 @@ export function createAngularSsrInternalMiddleware( } (async () => { + // Load the compiler because `@angular/ssr/node` depends on `@angular/` packages, + // which must be processed by the runtime linker, even if they are not used. + await loadEsmModule('@angular/compiler'); const { writeResponseToNodeResponse, createWebRequestFromNodeRequest } = await loadEsmModule('@angular/ssr/node'); @@ -76,6 +79,10 @@ export async function createAngularSsrExternalMiddleware( | ReturnType | undefined; + // Load the compiler because `@angular/ssr/node` depends on `@angular/` packages, + // which must be processed by the runtime linker, even if they are not used. + await loadEsmModule('@angular/compiler'); + const { createWebRequestFromNodeRequest, writeResponseToNodeResponse } = await loadEsmModule('@angular/ssr/node');