diff --git a/packages/vite/src/node/optimizer/index.ts b/packages/vite/src/node/optimizer/index.ts index d9b5d4897d667e..f50b0730096c96 100644 --- a/packages/vite/src/node/optimizer/index.ts +++ b/packages/vite/src/node/optimizer/index.ts @@ -61,6 +61,7 @@ export interface DepsOptimizer { delayDepsOptimizerUntil: (id: string, done: () => Promise) => void registerWorkersSource: (id: string) => void resetRegisteredIds: () => void + ensureFirstRun: () => void options: DepOptimizationOptions } diff --git a/packages/vite/src/node/optimizer/optimizer.ts b/packages/vite/src/node/optimizer/optimizer.ts index 9a331e9db90ab4..37a3aef745b4f3 100644 --- a/packages/vite/src/node/optimizer/optimizer.ts +++ b/packages/vite/src/node/optimizer/optimizer.ts @@ -83,6 +83,7 @@ export async function initDepsOptimizer( registerWorkersSource, delayDepsOptimizerUntil, resetRegisteredIds, + ensureFirstRun, options: config.optimizeDeps } @@ -521,12 +522,28 @@ export async function initDepsOptimizer( let seenIds = new Set() let workersSources = new Set() let waitingOn: string | undefined + let firstRunEnsured = false function resetRegisteredIds() { registeredIds = [] seenIds = new Set() workersSources = new Set() waitingOn = undefined + firstRunEnsured = false + } + + // If all the inputs are dependencies, we aren't going to get any + // delayDepsOptimizerUntil(id) calls. We need to guard against this + // by forcing a rerun if no deps have been registered + function ensureFirstRun() { + if (!firstRunEnsured && !firstRunCalled && registeredIds.length === 0) { + setTimeout(() => { + if (!firstRunCalled && registeredIds.length === 0) { + getDepsOptimizer(config)?.run() + } + }, runOptimizerIfIdleAfterMs) + } + firstRunEnsured = true } function registerWorkersSource(id: string): void { @@ -559,7 +576,7 @@ export async function initDepsOptimizer( waitingOn = next.id const afterLoad = () => { waitingOn = undefined - if (!workersSources.has(next.id)) { + if (!firstRunCalled && !workersSources.has(next.id)) { if (registeredIds.length > 0) { runOptimizerWhenIdle() } else { diff --git a/packages/vite/src/node/plugins/optimizedDeps.ts b/packages/vite/src/node/plugins/optimizedDeps.ts index 3eff36bd1bc13e..3db6d850f7f286 100644 --- a/packages/vite/src/node/plugins/optimizedDeps.ts +++ b/packages/vite/src/node/plugins/optimizedDeps.ts @@ -108,8 +108,12 @@ export function optimizedDepsBuildPlugin(config: ResolvedConfig): Plugin { if (!metadata || !depsOptimizer?.isOptimizedDepFile(id)) { return } + + depsOptimizer?.ensureFirstRun() + const file = cleanUrl(id) // Search in both the currently optimized and newly discovered deps + // If all the inputs are dependencies, we aren't going to get any const info = optimizedDepInfoFromFile(metadata, file) if (info) { try {