diff --git a/packages/vite/src/module-runner/runner.ts b/packages/vite/src/module-runner/runner.ts index 8cac7e1191b265..ae4228e3748123 100644 --- a/packages/vite/src/module-runner/runner.ts +++ b/packages/vite/src/module-runner/runner.ts @@ -245,20 +245,33 @@ export class ModuleRunner { } private async cachedModule(url: string, importer?: string) { - const cacheKey = `${url}~~${importer}` - let cached = this.moduleInfoCache.get(cacheKey) + url = normalizeAbsoluteUrl(url, this.root) + + const normalized = this.urlToIdMap.get(url) + let cachedModule = normalized && this.moduleCache.getByModuleId(normalized) + if (!cachedModule) { + cachedModule = this.moduleCache.getByModuleId(url) + } + + let cached = this.moduleInfoCache.get(url) if (!cached) { - cached = this.getModuleInformation(url, importer).finally(() => { - this.moduleInfoCache.delete(cacheKey) - }) - this.moduleInfoCache.set(cacheKey, cached) + cached = this.getModuleInformation(url, importer, cachedModule).finally( + () => { + this.moduleInfoCache.delete(url) + }, + ) + this.moduleInfoCache.set(url, cached) + } else { + this.debug?.('[module runner] using cached module info for', url) } + return cached } private async getModuleInformation( url: string, - importer?: string, + importer: string | undefined, + cachedModule: ModuleCache | undefined, ): Promise { if (this.destroyed) { throw new Error(`Vite module runner has been destroyed.`) @@ -266,14 +279,6 @@ export class ModuleRunner { this.debug?.('[module runner] fetching', url) - url = normalizeAbsoluteUrl(url, this.root) - - const normalized = this.urlToIdMap.get(url) - let cachedModule = normalized && this.moduleCache.getByModuleId(normalized) - if (!cachedModule) { - cachedModule = this.moduleCache.getByModuleId(url) - } - const isCached = !!(typeof cachedModule === 'object' && cachedModule.meta) const fetchedModule = // fast return for established externalized pattern