diff --git a/packages/vite/src/node/plugins/resolve.ts b/packages/vite/src/node/plugins/resolve.ts index 11db96a2898179..c0bfb36750d373 100644 --- a/packages/vite/src/node/plugins/resolve.ts +++ b/packages/vite/src/node/plugins/resolve.ts @@ -116,6 +116,11 @@ export interface InternalResolveOptions extends Required { shouldExternalize?: (id: string) => boolean | undefined } +const resolvedCache = new WeakMap< + InternalResolveOptions, + Map +>() + export function resolvePlugin(resolveOptions: InternalResolveOptions): Plugin { const { root, @@ -126,6 +131,8 @@ export function resolvePlugin(resolveOptions: InternalResolveOptions): Plugin { } = resolveOptions const { target: ssrTarget, noExternal: ssrNoExternal } = ssrConfig ?? {} + const resolvedIdCache = new Map() + resolvedCache.set(resolveOptions, resolvedIdCache) return { name: 'vite:resolve', @@ -338,6 +345,21 @@ export function resolvePlugin(resolveOptions: InternalResolveOptions): Plugin { // bare package imports, perform node resolve if (bareImportRE.test(id)) { const external = options.shouldExternalize?.(id) + const key = JSON.stringify({ + id, + external, + asSrc, + depsOptimizer: !!depsOptimizer, + targetWeb, + ...options, + ssr, + }) + const cache = resolvedIdCache.get(key) + + if (cache) { + return cache + } + if ( !external && asSrc && @@ -345,6 +367,7 @@ export function resolvePlugin(resolveOptions: InternalResolveOptions): Plugin { !options.scan && (res = await tryOptimizedResolve(depsOptimizer, id, importer)) ) { + resolvedIdCache.set(key, res) return res } @@ -359,6 +382,7 @@ export function resolvePlugin(resolveOptions: InternalResolveOptions): Plugin { external, )) ) { + resolvedIdCache.set(key, res) return res } @@ -373,6 +397,7 @@ export function resolvePlugin(resolveOptions: InternalResolveOptions): Plugin { external, )) ) { + resolvedIdCache.set(key, res) return res }