From f87f22d3f1436678ca1e07cc10874a012ae55e60 Mon Sep 17 00:00:00 2001 From: Alan Agius Date: Mon, 6 Nov 2023 14:04:19 +0000 Subject: [PATCH] fix(@angular-devkit/build-angular): keep dependencies pre-bundling validate between builds Prior to this commit, the pre-bundling of dependencies was being invalidated for each build. This is because vite uses parts of the config among other things to generate a hash. In our case the config was not always consistent for the same project between different builds. The main 2 problems areas were: - Random `root` path - `include` and `exclude` arrays were not always in the same order. (cherry picked from commit 07a8ffd5af3d9b52a494bb6c9403a1a738044bda) --- .../build_angular/src/builders/dev-server/vite-server.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) 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 72ecf241a406..32e2a183ee54 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 @@ -12,7 +12,6 @@ import type { json, logging } from '@angular-devkit/core'; import type { Plugin } from 'esbuild'; import { lookup as lookupMimeType } from 'mrmime'; import assert from 'node:assert'; -import { randomUUID } from 'node:crypto'; import { readFile } from 'node:fs/promises'; import { ServerResponse } from 'node:http'; import { dirname, extname, join, relative } from 'node:path'; @@ -192,6 +191,12 @@ export async function* serveWithVite( externalMetadata.explicit.push(...explicit); externalMetadata.implicitServer.push(...implicitServer); externalMetadata.implicitBrowser.push(...implicitBrowser); + + // The below needs to be sorted as Vite uses these options are part of the hashing invalidation algorithm. + // See: https://github.com/vitejs/vite/blob/0873bae0cfe0f0718ad2f5743dd34a17e4ab563d/packages/vite/src/node/optimizer/index.ts#L1203-L1239 + externalMetadata.explicit.sort(); + externalMetadata.implicitServer.sort(); + externalMetadata.implicitBrowser.sort(); } if (server) { @@ -405,7 +410,7 @@ export async function setupServer( // Path will not exist on disk and only used to provide separate path for Vite requests const virtualProjectRoot = normalizePath( - join(serverOptions.workspaceRoot, `.angular/vite-root/${randomUUID()}/`), + join(serverOptions.workspaceRoot, `.angular/vite-root`, serverOptions.buildTarget.project), ); const serverExplicitExternal = [