From 82137d6872adb61ffc2f8ce47924dd50626b3b64 Mon Sep 17 00:00:00 2001 From: patak Date: Thu, 30 Mar 2023 20:27:26 +0200 Subject: [PATCH] perf: shorcircuit resolve in ensure entry from url (#12655) --- .../vite/src/node/plugins/importAnalysis.ts | 4 ++- packages/vite/src/node/server/moduleGraph.ts | 28 ++++++++++++++++--- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/packages/vite/src/node/plugins/importAnalysis.ts b/packages/vite/src/node/plugins/importAnalysis.ts index 8ee82040d21e7f..2c4ffeccd899a5 100644 --- a/packages/vite/src/node/plugins/importAnalysis.ts +++ b/packages/vite/src/node/plugins/importAnalysis.ts @@ -391,10 +391,12 @@ export function importAnalysisPlugin(config: ResolvedConfig): Plugin { // up-to-date version of this module. try { // delay setting `isSelfAccepting` until the file is actually used (#7870) - const depModule = await moduleGraph.ensureEntryFromUrl( + // We use an internal function to avoid resolving the url again + const depModule = await moduleGraph._ensureEntryFromUrl( unwrapId(url), ssr, canSkipImportAnalysis(url) || forceSkipImportAnalysis, + resolved, ) if (depModule.lastHMRTimestamp > 0) { url = injectQuery(url, `t=${depModule.lastHMRTimestamp}`) diff --git a/packages/vite/src/node/server/moduleGraph.ts b/packages/vite/src/node/server/moduleGraph.ts index af254e38b62704..8dda0e412a335a 100644 --- a/packages/vite/src/node/server/moduleGraph.ts +++ b/packages/vite/src/node/server/moduleGraph.ts @@ -235,6 +235,19 @@ export class ModuleGraph { rawUrl: string, ssr?: boolean, setIsSelfAccepting = true, + ): Promise { + return this._ensureEntryFromUrl(rawUrl, ssr, setIsSelfAccepting) + } + + /** + * @internal + */ + async _ensureEntryFromUrl( + rawUrl: string, + ssr?: boolean, + setIsSelfAccepting = true, + // Optimization, avoid resolving the same url twice if the caller already did it + resolved?: PartialResolvedId, ): Promise { // Quick path, if we already have a module for this rawUrl (even without extension) rawUrl = removeImportQuery(removeTimestampQuery(rawUrl)) @@ -242,8 +255,11 @@ export class ModuleGraph { if (mod) { return mod } - - const [url, resolvedId, meta] = await this._resolveUrl(rawUrl, ssr) + const [url, resolvedId, meta] = await this._resolveUrl( + rawUrl, + ssr, + resolved, + ) mod = this.idToModuleMap.get(resolvedId) if (!mod) { mod = new ModuleNode(url, setIsSelfAccepting) @@ -334,8 +350,12 @@ export class ModuleGraph { /** * @internal */ - async _resolveUrl(url: string, ssr?: boolean): Promise { - const resolved = await this.resolveId(url, !!ssr) + async _resolveUrl( + url: string, + ssr?: boolean, + alreadyResolved?: PartialResolvedId, + ): Promise { + const resolved = alreadyResolved ?? (await this.resolveId(url, !!ssr)) const resolvedId = resolved?.id || url if ( url !== resolvedId &&