From d46fb128a51f172da72ab403ec97213099f43de8 Mon Sep 17 00:00:00 2001 From: Alan Agius Date: Mon, 6 Nov 2023 11:30:06 +0000 Subject: [PATCH] fix(@angular-devkit/build-angular): disable dependency optimization for SSR It appears that Vite currently, has a number of limitation/bugs when using `optimizeDeps` for SSR bundles. Currently this causes a number of issues: - Deps are re-optimized everytime the server is started. - Added deps after a rebuild are not optimized. - Breaks RxJs (Unless it is added as external). See: #26235 We should follow up with Vite and try to get this solved as this would be a nice feature to use. Closes #26235 and #26234 (cherry picked from commit 7cb5d35a2642344dac27bef5f87c55b89c7d9f97) --- .../src/builders/application/execute-build.ts | 11 ++++++++++- .../src/builders/dev-server/vite-server.ts | 15 +++++++++++++-- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/packages/angular_devkit/build_angular/src/builders/application/execute-build.ts b/packages/angular_devkit/build_angular/src/builders/application/execute-build.ts index e8e9801938c7..25391649f751 100644 --- a/packages/angular_devkit/build_angular/src/builders/application/execute-build.ts +++ b/packages/angular_devkit/build_angular/src/builders/application/execute-build.ts @@ -125,7 +125,16 @@ export async function executeBuild( new BundlerContext( workspaceRoot, !!options.watch, - createServerCodeBundleOptions(options, nodeTargets, codeBundleCache), + createServerCodeBundleOptions( + { + ...options, + // Disable external deps for server bundles. + // This is because it breaks Vite 'optimizeDeps' for SSR. + externalPackages: false, + }, + nodeTargets, + codeBundleCache, + ), () => false, ), ); diff --git a/packages/angular_devkit/build_angular/src/builders/dev-server/vite-server.ts b/packages/angular_devkit/build_angular/src/builders/dev-server/vite-server.ts index be73b9abd44e..72ecf241a406 100644 --- a/packages/angular_devkit/build_angular/src/builders/dev-server/vite-server.ts +++ b/packages/angular_devkit/build_angular/src/builders/dev-server/vite-server.ts @@ -224,7 +224,7 @@ export async function* serveWithVite( server = await createServer(serverConfiguration); await server.listen(); - if (browserOptions.ssr) { + if (serverConfiguration.ssr?.optimizeDeps?.disabled === false) { /** * Vite will only start dependency optimization of SSR modules when the first request comes in. * In some cases, this causes a long waiting time. To mitigate this, we call `ssrLoadModule` to @@ -451,8 +451,19 @@ export async function setupServer( // Exclude any Node.js built in module and provided dependencies (currently build defined externals) external: serverExplicitExternal, optimizeDeps: getDepOptimizationConfig({ + /** + * ********************************************* + * NOTE: Temporary disable 'optimizeDeps' for SSR. + * ********************************************* + * + * Currently this causes a number of issues. + * - Deps are re-optimized everytime the server is started. + * - Added deps after a rebuild are not optimized. + * - Breaks RxJs (Unless it is added as external). See: https://github.com/angular/angular-cli/issues/26235 + */ + // Only enable with caching since it causes prebundle dependencies to be cached - disabled: !serverOptions.cacheOptions.enabled, + disabled: true, // !serverOptions.cacheOptions.enabled, // Exclude any explicitly defined dependencies (currently build defined externals and node.js built-ins) exclude: serverExplicitExternal, // Include all implict dependencies from the external packages internal option