From 6c36700fb9bf236ba62d6560d9079fb61f06753c Mon Sep 17 00:00:00 2001 From: patak Date: Tue, 28 Mar 2023 22:58:54 +0200 Subject: [PATCH 01/15] perf: module graph url shortcuts --- .../vite/src/node/plugins/importAnalysis.ts | 1 + packages/vite/src/node/server/moduleGraph.ts | 65 +++++++++++++++---- 2 files changed, 53 insertions(+), 13 deletions(-) diff --git a/packages/vite/src/node/plugins/importAnalysis.ts b/packages/vite/src/node/plugins/importAnalysis.ts index c1a7b6403502cb..3f58dbeca0f04f 100644 --- a/packages/vite/src/node/plugins/importAnalysis.ts +++ b/packages/vite/src/node/plugins/importAnalysis.ts @@ -395,6 +395,7 @@ export function importAnalysisPlugin(config: ResolvedConfig): Plugin { 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 4db3bcbca9a0f4..28347bdcfa285b 100644 --- a/packages/vite/src/node/server/moduleGraph.ts +++ b/packages/vite/src/node/server/moduleGraph.ts @@ -72,6 +72,13 @@ export class ModuleGraph { rawUrl: string, ssr?: boolean, ): Promise { + // Quick path, if we already have a module for this rawUrl (even without extension) + const cleanedUrl = removeImportQuery(removeTimestampQuery(rawUrl)) + const mod = this.urlToModuleMap.get(cleanedUrl) + if (mod) { + return mod + } + const [url] = await this.resolveUrl(rawUrl, ssr) return this.urlToModuleMap.get(url) } @@ -188,9 +195,20 @@ export class ModuleGraph { rawUrl: string, ssr?: boolean, setIsSelfAccepting = true, + // Optimization, avoid resolving the same url twice if the caller already did it + resolved?: PartialResolvedId, ): Promise { - const [url, resolvedId, meta] = await this.resolveUrl(rawUrl, ssr) - let mod = this.idToModuleMap.get(resolvedId) + // Quick path, if we already have a module for this rawUrl (even without extension) + const cleanedUrl = removeImportQuery(removeTimestampQuery(rawUrl)) + let mod = this.urlToModuleMap.get(cleanedUrl) + if (mod) { + return mod + } + + const [url, resolvedId, meta] = resolved + ? optimizedResolveUrl(rawUrl, resolved) + : await this.resolveUrl(rawUrl, ssr) + mod = this.idToModuleMap.get(resolvedId) if (!mod) { mod = new ModuleNode(url, setIsSelfAccepting) if (meta) mod.meta = meta @@ -210,6 +228,11 @@ export class ModuleGraph { else if (!this.urlToModuleMap.has(url)) { this.urlToModuleMap.set(url, mod) } + // Also register the clean url to the module, so that we can short-circuit + // resolving the same url twice + if (!this.urlToModuleMap.has(cleanedUrl)) { + this.urlToModuleMap.set(cleanedUrl, mod) + } return mod } @@ -246,17 +269,33 @@ export class ModuleGraph { url = removeImportQuery(removeTimestampQuery(url)) const resolved = await this.resolveId(url, !!ssr) const resolvedId = resolved?.id || url - if ( - url !== resolvedId && - !url.includes('\0') && - !url.startsWith(`virtual:`) - ) { - const ext = extname(cleanUrl(resolvedId)) - const { pathname, search, hash } = new URL(url, 'relative://') - if (ext && !pathname!.endsWith(ext)) { - url = pathname + ext + search + hash - } - } + url = ensureExtension(url, resolvedId) return [url, resolvedId, resolved?.meta] } } + +// Shortcircuit resolveId if we already have it +function optimizedResolveUrl( + url: string, + resolved: PartialResolvedId, +): ResolvedUrl { + url = removeImportQuery(removeTimestampQuery(url)) + const resolvedId = resolved.id + url = ensureExtension(url, resolvedId) + return [url, resolvedId, resolved?.meta] +} + +function ensureExtension(url: string, resolvedId: string) { + if ( + url !== resolvedId && + !url.includes('\0') && + !url.startsWith(`virtual:`) + ) { + const ext = extname(cleanUrl(resolvedId)) + const { pathname, search, hash } = new URL(url, 'relative://') + if (ext && !pathname!.endsWith(ext)) { + return pathname + ext + search + hash + } + } + return url +} From 5ea56d5f6dc7dc7ab857a2018346b4c359495c11 Mon Sep 17 00:00:00 2001 From: patak Date: Wed, 29 Mar 2023 11:41:14 +0200 Subject: [PATCH 02/15] chore: remove optimizedResolveUrl, let's try that in a separate PR --- .../vite/src/node/plugins/importAnalysis.ts | 1 - packages/vite/src/node/server/moduleGraph.ts | 17 +---------------- 2 files changed, 1 insertion(+), 17 deletions(-) diff --git a/packages/vite/src/node/plugins/importAnalysis.ts b/packages/vite/src/node/plugins/importAnalysis.ts index 3f58dbeca0f04f..c1a7b6403502cb 100644 --- a/packages/vite/src/node/plugins/importAnalysis.ts +++ b/packages/vite/src/node/plugins/importAnalysis.ts @@ -395,7 +395,6 @@ export function importAnalysisPlugin(config: ResolvedConfig): Plugin { 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 28347bdcfa285b..40590331d559b1 100644 --- a/packages/vite/src/node/server/moduleGraph.ts +++ b/packages/vite/src/node/server/moduleGraph.ts @@ -195,8 +195,6 @@ export class ModuleGraph { 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) const cleanedUrl = removeImportQuery(removeTimestampQuery(rawUrl)) @@ -205,9 +203,7 @@ export class ModuleGraph { return mod } - const [url, resolvedId, meta] = resolved - ? optimizedResolveUrl(rawUrl, resolved) - : await this.resolveUrl(rawUrl, ssr) + const [url, resolvedId, meta] = await this.resolveUrl(rawUrl, ssr) mod = this.idToModuleMap.get(resolvedId) if (!mod) { mod = new ModuleNode(url, setIsSelfAccepting) @@ -274,17 +270,6 @@ export class ModuleGraph { } } -// Shortcircuit resolveId if we already have it -function optimizedResolveUrl( - url: string, - resolved: PartialResolvedId, -): ResolvedUrl { - url = removeImportQuery(removeTimestampQuery(url)) - const resolvedId = resolved.id - url = ensureExtension(url, resolvedId) - return [url, resolvedId, resolved?.meta] -} - function ensureExtension(url: string, resolvedId: string) { if ( url !== resolvedId && From 3504d2c4da3551fb18d46cc84666541ea5aa1c28 Mon Sep 17 00:00:00 2001 From: patak Date: Wed, 29 Mar 2023 11:42:06 +0200 Subject: [PATCH 03/15] chore: reduce diff --- packages/vite/src/node/server/moduleGraph.ts | 27 ++++++++------------ 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/packages/vite/src/node/server/moduleGraph.ts b/packages/vite/src/node/server/moduleGraph.ts index 40590331d559b1..6fe78914f94c0d 100644 --- a/packages/vite/src/node/server/moduleGraph.ts +++ b/packages/vite/src/node/server/moduleGraph.ts @@ -265,22 +265,17 @@ export class ModuleGraph { url = removeImportQuery(removeTimestampQuery(url)) const resolved = await this.resolveId(url, !!ssr) const resolvedId = resolved?.id || url - url = ensureExtension(url, resolvedId) - return [url, resolvedId, resolved?.meta] - } -} - -function ensureExtension(url: string, resolvedId: string) { - if ( - url !== resolvedId && - !url.includes('\0') && - !url.startsWith(`virtual:`) - ) { - const ext = extname(cleanUrl(resolvedId)) - const { pathname, search, hash } = new URL(url, 'relative://') - if (ext && !pathname!.endsWith(ext)) { - return pathname + ext + search + hash + if ( + url !== resolvedId && + !url.includes('\0') && + !url.startsWith(`virtual:`) + ) { + const ext = extname(cleanUrl(resolvedId)) + const { pathname, search, hash } = new URL(url, 'relative://') + if (ext && !pathname!.endsWith(ext)) { + url = pathname + ext + search + hash + } } + return [url, resolvedId, resolved?.meta] } - return url } From 462f1f92ded2cab0ea6c22b9532f30154589f499 Mon Sep 17 00:00:00 2001 From: patak Date: Wed, 29 Mar 2023 16:20:22 +0200 Subject: [PATCH 04/15] chore: #rawUrlToModuleMap --- packages/vite/src/node/server/moduleGraph.ts | 27 +++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/packages/vite/src/node/server/moduleGraph.ts b/packages/vite/src/node/server/moduleGraph.ts index 6fe78914f94c0d..57f09ea418cfa6 100644 --- a/packages/vite/src/node/server/moduleGraph.ts +++ b/packages/vite/src/node/server/moduleGraph.ts @@ -61,6 +61,8 @@ export class ModuleGraph { fileToModulesMap = new Map>() safeModulesPath = new Set() + #rawUrlToModuleMap = new Map() + constructor( private resolveId: ( url: string, @@ -74,7 +76,7 @@ export class ModuleGraph { ): Promise { // Quick path, if we already have a module for this rawUrl (even without extension) const cleanedUrl = removeImportQuery(removeTimestampQuery(rawUrl)) - const mod = this.urlToModuleMap.get(cleanedUrl) + const mod = this.#rawUrlToModuleMap.get(cleanedUrl) if (mod) { return mod } @@ -198,7 +200,7 @@ export class ModuleGraph { ): Promise { // Quick path, if we already have a module for this rawUrl (even without extension) const cleanedUrl = removeImportQuery(removeTimestampQuery(rawUrl)) - let mod = this.urlToModuleMap.get(cleanedUrl) + let mod = this.#rawUrlToModuleMap.get(cleanedUrl) if (mod) { return mod } @@ -208,9 +210,13 @@ export class ModuleGraph { if (!mod) { mod = new ModuleNode(url, setIsSelfAccepting) if (meta) mod.meta = meta + this.urlToModuleMap.set(url, mod) + this.#rawUrlToModuleMap.set(cleanedUrl, mod) + mod.id = resolvedId this.idToModuleMap.set(resolvedId, mod) + const file = (mod.file = cleanUrl(resolvedId)) let fileMappedModules = this.fileToModulesMap.get(file) if (!fileMappedModules) { @@ -221,14 +227,17 @@ export class ModuleGraph { } // multiple urls can map to the same module and id, make sure we register // the url to the existing module in that case - else if (!this.urlToModuleMap.has(url)) { - this.urlToModuleMap.set(url, mod) - } - // Also register the clean url to the module, so that we can short-circuit - // resolving the same url twice - if (!this.urlToModuleMap.has(cleanedUrl)) { - this.urlToModuleMap.set(cleanedUrl, mod) + else { + if (!this.urlToModuleMap.has(url)) { + this.urlToModuleMap.set(url, mod) + } + // Also register the clean url to the module, so that we can short-circuit + // resolving the same url twice + if (!this.#rawUrlToModuleMap.has(cleanedUrl)) { + this.#rawUrlToModuleMap.set(cleanedUrl, mod) + } } + return mod } From b8c41aa69935f29240cf23ff6114e9e6e90dafe9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arnaud=20Barr=C3=A9?= Date: Wed, 29 Mar 2023 20:51:41 +0200 Subject: [PATCH 05/15] Fix tsconfig.check.json target --- packages/vite/tsconfig.check.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/vite/tsconfig.check.json b/packages/vite/tsconfig.check.json index 3df61bd71010e7..457b452578f5e8 100644 --- a/packages/vite/tsconfig.check.json +++ b/packages/vite/tsconfig.check.json @@ -1,5 +1,7 @@ { "compilerOptions": { + "target": "ES2020", + "moduleResolution": "node", "noEmit": true, "strict": true, "exactOptionalPropertyTypes": true From 789a93b5113342fd951552d0c0500ae223647c75 Mon Sep 17 00:00:00 2001 From: patak Date: Thu, 30 Mar 2023 10:22:57 +0200 Subject: [PATCH 06/15] fix: cleanUrl cache should depend on ssr --- packages/vite/src/node/server/moduleGraph.ts | 24 ++++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/packages/vite/src/node/server/moduleGraph.ts b/packages/vite/src/node/server/moduleGraph.ts index 57f09ea418cfa6..4613b946a5bc97 100644 --- a/packages/vite/src/node/server/moduleGraph.ts +++ b/packages/vite/src/node/server/moduleGraph.ts @@ -61,7 +61,19 @@ export class ModuleGraph { fileToModulesMap = new Map>() safeModulesPath = new Set() - #rawUrlToModuleMap = new Map() + #cleanUrlToModuleMap = new Map() + #ssrCleanUrlToModuleMap = new Map() + #getCleanUrlToModule(cleanUrl: string, ssr?: boolean) { + return (ssr ? this.#ssrCleanUrlToModuleMap : this.#cleanUrlToModuleMap).get( + cleanUrl, + ) + } + #setCleanUrlToModule(cleanUrl: string, mod: ModuleNode, ssr?: boolean) { + return (ssr ? this.#ssrCleanUrlToModuleMap : this.#cleanUrlToModuleMap).set( + cleanUrl, + mod, + ) + } constructor( private resolveId: ( @@ -76,7 +88,7 @@ export class ModuleGraph { ): Promise { // Quick path, if we already have a module for this rawUrl (even without extension) const cleanedUrl = removeImportQuery(removeTimestampQuery(rawUrl)) - const mod = this.#rawUrlToModuleMap.get(cleanedUrl) + const mod = this.#getCleanUrlToModule(cleanedUrl, ssr) if (mod) { return mod } @@ -200,7 +212,7 @@ export class ModuleGraph { ): Promise { // Quick path, if we already have a module for this rawUrl (even without extension) const cleanedUrl = removeImportQuery(removeTimestampQuery(rawUrl)) - let mod = this.#rawUrlToModuleMap.get(cleanedUrl) + let mod = this.#getCleanUrlToModule(cleanedUrl, ssr) if (mod) { return mod } @@ -212,7 +224,7 @@ export class ModuleGraph { if (meta) mod.meta = meta this.urlToModuleMap.set(url, mod) - this.#rawUrlToModuleMap.set(cleanedUrl, mod) + this.#setCleanUrlToModule(cleanedUrl, mod, ssr) mod.id = resolvedId this.idToModuleMap.set(resolvedId, mod) @@ -233,9 +245,7 @@ export class ModuleGraph { } // Also register the clean url to the module, so that we can short-circuit // resolving the same url twice - if (!this.#rawUrlToModuleMap.has(cleanedUrl)) { - this.#rawUrlToModuleMap.set(cleanedUrl, mod) - } + this.#setCleanUrlToModule(cleanedUrl, mod, ssr) } return mod From 8858ec821b9607625626e18355216b738538e5b4 Mon Sep 17 00:00:00 2001 From: patak Date: Thu, 30 Mar 2023 11:25:29 +0200 Subject: [PATCH 07/15] chore: also use cleanUrl cache on moduleGraph.resolveUrl --- packages/vite/src/node/server/moduleGraph.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/vite/src/node/server/moduleGraph.ts b/packages/vite/src/node/server/moduleGraph.ts index 4613b946a5bc97..1c1ccab7cf2926 100644 --- a/packages/vite/src/node/server/moduleGraph.ts +++ b/packages/vite/src/node/server/moduleGraph.ts @@ -217,7 +217,7 @@ export class ModuleGraph { return mod } - const [url, resolvedId, meta] = await this.resolveUrl(rawUrl, ssr) + const [url, resolvedId, meta] = await this.#resolveCleanUrl(cleanedUrl, ssr) mod = this.idToModuleMap.get(resolvedId) if (!mod) { mod = new ModuleNode(url, setIsSelfAccepting) @@ -281,7 +281,14 @@ export class ModuleGraph { // 2. resolve its extension so that urls with or without extension all map to // the same module async resolveUrl(url: string, ssr?: boolean): Promise { - url = removeImportQuery(removeTimestampQuery(url)) + const cleanedUrl = removeImportQuery(removeTimestampQuery(url)) + const mod = this.#getCleanUrlToModule(cleanedUrl, ssr) + if (mod?.id) { + return [mod.url, mod.id, mod.meta] + } + return this.#resolveCleanUrl(url, ssr) + } + async #resolveCleanUrl(url: string, ssr?: boolean): Promise { const resolved = await this.resolveId(url, !!ssr) const resolvedId = resolved?.id || url if ( From 48187f44dd547a671bcabf64e316e0f2443e4c92 Mon Sep 17 00:00:00 2001 From: patak Date: Thu, 30 Mar 2023 11:32:48 +0200 Subject: [PATCH 08/15] chore: reduce diff --- packages/vite/src/node/server/moduleGraph.ts | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/packages/vite/src/node/server/moduleGraph.ts b/packages/vite/src/node/server/moduleGraph.ts index 47de2d10ee19f2..79cece0f5f2b81 100644 --- a/packages/vite/src/node/server/moduleGraph.ts +++ b/packages/vite/src/node/server/moduleGraph.ts @@ -255,7 +255,6 @@ export class ModuleGraph { if (meta) mod.meta = meta this.urlToModuleMap.set(url, mod) - this.#setCleanUrlToModule(cleanedUrl, mod, ssr) mod.id = resolvedId this.idToModuleMap.set(resolvedId, mod) @@ -270,15 +269,14 @@ export class ModuleGraph { } // multiple urls can map to the same module and id, make sure we register // the url to the existing module in that case - else { - if (!this.urlToModuleMap.has(url)) { - this.urlToModuleMap.set(url, mod) - } - // Also register the clean url to the module, so that we can short-circuit - // resolving the same url twice - this.#setCleanUrlToModule(cleanedUrl, mod, ssr) + else if (!this.urlToModuleMap.has(url)) { + this.urlToModuleMap.set(url, mod) } + // Also register the clean url to the module, so that we can short-circuit + // resolving the same url twice + this.#setCleanUrlToModule(cleanedUrl, mod, ssr) + return mod } From c70bf0542e7a6d6aa2ad5e92a4c29c3d7cec57eb Mon Sep 17 00:00:00 2001 From: patak Date: Thu, 30 Mar 2023 11:33:26 +0200 Subject: [PATCH 09/15] chore: reduce diff --- packages/vite/src/node/server/moduleGraph.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/vite/src/node/server/moduleGraph.ts b/packages/vite/src/node/server/moduleGraph.ts index 79cece0f5f2b81..4f15ed53e34f2c 100644 --- a/packages/vite/src/node/server/moduleGraph.ts +++ b/packages/vite/src/node/server/moduleGraph.ts @@ -253,12 +253,9 @@ export class ModuleGraph { if (!mod) { mod = new ModuleNode(url, setIsSelfAccepting) if (meta) mod.meta = meta - this.urlToModuleMap.set(url, mod) - mod.id = resolvedId this.idToModuleMap.set(resolvedId, mod) - const file = (mod.file = cleanUrl(resolvedId)) let fileMappedModules = this.fileToModulesMap.get(file) if (!fileMappedModules) { From b166866606b588602beaae37a152574db8eb80fb Mon Sep 17 00:00:00 2001 From: patak Date: Thu, 30 Mar 2023 12:17:31 +0200 Subject: [PATCH 10/15] chore: avoid private identifiers for now --- packages/vite/src/node/server/moduleGraph.ts | 60 +++++++++++++------- packages/vite/tsconfig.check.json | 2 - 2 files changed, 40 insertions(+), 22 deletions(-) diff --git a/packages/vite/src/node/server/moduleGraph.ts b/packages/vite/src/node/server/moduleGraph.ts index 4f15ed53e34f2c..8ed19a74c139b0 100644 --- a/packages/vite/src/node/server/moduleGraph.ts +++ b/packages/vite/src/node/server/moduleGraph.ts @@ -61,19 +61,14 @@ export class ModuleGraph { fileToModulesMap = new Map>() safeModulesPath = new Set() - #cleanUrlToModuleMap = new Map() - #ssrCleanUrlToModuleMap = new Map() - #getCleanUrlToModule(cleanUrl: string, ssr?: boolean) { - return (ssr ? this.#ssrCleanUrlToModuleMap : this.#cleanUrlToModuleMap).get( - cleanUrl, - ) - } - #setCleanUrlToModule(cleanUrl: string, mod: ModuleNode, ssr?: boolean) { - return (ssr ? this.#ssrCleanUrlToModuleMap : this.#cleanUrlToModuleMap).set( - cleanUrl, - mod, - ) - } + /** + * @internal + */ + _cleanUrlToModuleMap = new Map() + /** + * @internal + */ + _ssrCleanUrlToModuleMap = new Map() constructor( private resolveId: ( @@ -88,7 +83,7 @@ export class ModuleGraph { ): Promise { // Quick path, if we already have a module for this rawUrl (even without extension) const cleanedUrl = removeImportQuery(removeTimestampQuery(rawUrl)) - const mod = this.#getCleanUrlToModule(cleanedUrl, ssr) + const mod = this._getCleanUrlToModule(cleanedUrl, ssr) if (mod) { return mod } @@ -243,12 +238,12 @@ export class ModuleGraph { ): Promise { // Quick path, if we already have a module for this rawUrl (even without extension) const cleanedUrl = removeImportQuery(removeTimestampQuery(rawUrl)) - let mod = this.#getCleanUrlToModule(cleanedUrl, ssr) + let mod = this._getCleanUrlToModule(cleanedUrl, ssr) if (mod) { return mod } - const [url, resolvedId, meta] = await this.#resolveCleanUrl(cleanedUrl, ssr) + const [url, resolvedId, meta] = await this._resolveCleanUrl(cleanedUrl, ssr) mod = this.idToModuleMap.get(resolvedId) if (!mod) { mod = new ModuleNode(url, setIsSelfAccepting) @@ -272,7 +267,7 @@ export class ModuleGraph { // Also register the clean url to the module, so that we can short-circuit // resolving the same url twice - this.#setCleanUrlToModule(cleanedUrl, mod, ssr) + this._setCleanUrlToModule(cleanedUrl, mod, ssr) return mod } @@ -308,13 +303,38 @@ export class ModuleGraph { // the same module async resolveUrl(url: string, ssr?: boolean): Promise { const cleanedUrl = removeImportQuery(removeTimestampQuery(url)) - const mod = this.#getCleanUrlToModule(cleanedUrl, ssr) + const mod = this._getCleanUrlToModule(cleanedUrl, ssr) if (mod?.id) { return [mod.url, mod.id, mod.meta] } - return this.#resolveCleanUrl(url, ssr) + return this._resolveCleanUrl(url, ssr) } - async #resolveCleanUrl(url: string, ssr?: boolean): Promise { + + /** + * @internal + */ + _getCleanUrlToModule( + cleanUrl: string, + ssr?: boolean, + ): ModuleNode | undefined { + return (ssr ? this._ssrCleanUrlToModuleMap : this._cleanUrlToModuleMap).get( + cleanUrl, + ) + } + /** + * @internal + */ + _setCleanUrlToModule(cleanUrl: string, mod: ModuleNode, ssr?: boolean): void { + ;(ssr ? this._ssrCleanUrlToModuleMap : this._cleanUrlToModuleMap).set( + cleanUrl, + mod, + ) + } + + /** + * @internal + */ + async _resolveCleanUrl(url: string, ssr?: boolean): Promise { const resolved = await this.resolveId(url, !!ssr) const resolvedId = resolved?.id || url if ( diff --git a/packages/vite/tsconfig.check.json b/packages/vite/tsconfig.check.json index 457b452578f5e8..3df61bd71010e7 100644 --- a/packages/vite/tsconfig.check.json +++ b/packages/vite/tsconfig.check.json @@ -1,7 +1,5 @@ { "compilerOptions": { - "target": "ES2020", - "moduleResolution": "node", "noEmit": true, "strict": true, "exactOptionalPropertyTypes": true From d27a045d8e42fe8f9c5e1ea62187c98231fee3e2 Mon Sep 17 00:00:00 2001 From: patak Date: Thu, 30 Mar 2023 15:44:50 +0200 Subject: [PATCH 11/15] chore: cleaned url -> unresolved url --- packages/vite/src/node/server/moduleGraph.ts | 44 ++++++++++---------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/packages/vite/src/node/server/moduleGraph.ts b/packages/vite/src/node/server/moduleGraph.ts index 8ed19a74c139b0..d8799736cc1f94 100644 --- a/packages/vite/src/node/server/moduleGraph.ts +++ b/packages/vite/src/node/server/moduleGraph.ts @@ -64,11 +64,11 @@ export class ModuleGraph { /** * @internal */ - _cleanUrlToModuleMap = new Map() + _unresolvedUrlToModuleMap = new Map() /** * @internal */ - _ssrCleanUrlToModuleMap = new Map() + _ssrUnresolvedUrlToModuleMap = new Map() constructor( private resolveId: ( @@ -82,8 +82,8 @@ export class ModuleGraph { ssr?: boolean, ): Promise { // Quick path, if we already have a module for this rawUrl (even without extension) - const cleanedUrl = removeImportQuery(removeTimestampQuery(rawUrl)) - const mod = this._getCleanUrlToModule(cleanedUrl, ssr) + const unresolvedUrl = removeImportQuery(removeTimestampQuery(rawUrl)) + const mod = this._getUnresolvedUrlToModule(unresolvedUrl, ssr) if (mod) { return mod } @@ -237,13 +237,13 @@ export class ModuleGraph { setIsSelfAccepting = true, ): Promise { // Quick path, if we already have a module for this rawUrl (even without extension) - const cleanedUrl = removeImportQuery(removeTimestampQuery(rawUrl)) - let mod = this._getCleanUrlToModule(cleanedUrl, ssr) + rawUrl = removeImportQuery(removeTimestampQuery(rawUrl)) + let mod = this._getUnresolvedUrlToModule(rawUrl, ssr) if (mod) { return mod } - const [url, resolvedId, meta] = await this._resolveCleanUrl(cleanedUrl, ssr) + const [url, resolvedId, meta] = await this._resolveUrl(rawUrl, ssr) mod = this.idToModuleMap.get(resolvedId) if (!mod) { mod = new ModuleNode(url, setIsSelfAccepting) @@ -267,7 +267,7 @@ export class ModuleGraph { // Also register the clean url to the module, so that we can short-circuit // resolving the same url twice - this._setCleanUrlToModule(cleanedUrl, mod, ssr) + this._setUnresolvedUrlToModule(rawUrl, mod, ssr) return mod } @@ -302,39 +302,39 @@ export class ModuleGraph { // 2. resolve its extension so that urls with or without extension all map to // the same module async resolveUrl(url: string, ssr?: boolean): Promise { - const cleanedUrl = removeImportQuery(removeTimestampQuery(url)) - const mod = this._getCleanUrlToModule(cleanedUrl, ssr) + url = removeImportQuery(removeTimestampQuery(url)) + const mod = this._getUnresolvedUrlToModule(url, ssr) if (mod?.id) { return [mod.url, mod.id, mod.meta] } - return this._resolveCleanUrl(url, ssr) + return this._resolveUrl(url, ssr) } /** * @internal */ - _getCleanUrlToModule( - cleanUrl: string, + _getUnresolvedUrlToModule( + url: string, ssr?: boolean, ): ModuleNode | undefined { - return (ssr ? this._ssrCleanUrlToModuleMap : this._cleanUrlToModuleMap).get( - cleanUrl, - ) + return ( + ssr ? this._ssrUnresolvedUrlToModuleMap : this._unresolvedUrlToModuleMap + ).get(url) } /** * @internal */ - _setCleanUrlToModule(cleanUrl: string, mod: ModuleNode, ssr?: boolean): void { - ;(ssr ? this._ssrCleanUrlToModuleMap : this._cleanUrlToModuleMap).set( - cleanUrl, - mod, - ) + _setUnresolvedUrlToModule(url: string, mod: ModuleNode, ssr?: boolean): void { + ;(ssr + ? this._ssrUnresolvedUrlToModuleMap + : this._unresolvedUrlToModuleMap + ).set(url, mod) } /** * @internal */ - async _resolveCleanUrl(url: string, ssr?: boolean): Promise { + async _resolveUrl(url: string, ssr?: boolean): Promise { const resolved = await this.resolveId(url, !!ssr) const resolvedId = resolved?.id || url if ( From 211df5d45d929dd431ba6b7ddd665e6b049b05e2 Mon Sep 17 00:00:00 2001 From: patak Date: Thu, 30 Mar 2023 15:49:14 +0200 Subject: [PATCH 12/15] perf: avoid double resolve in tranformRequest --- packages/vite/src/node/server/transformRequest.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/vite/src/node/server/transformRequest.ts b/packages/vite/src/node/server/transformRequest.ts index 82bc7fabc20716..3762c69cfef3b3 100644 --- a/packages/vite/src/node/server/transformRequest.ts +++ b/packages/vite/src/node/server/transformRequest.ts @@ -144,7 +144,9 @@ async function doTransform( // resolve const id = - (await pluginContainer.resolveId(url, undefined, { ssr }))?.id || url + module?.id ?? + (await pluginContainer.resolveId(url, undefined, { ssr }))?.id ?? + url const result = loadAndTransform(id, url, server, options, timestamp) From 84210025dcc6c4875be803ace9e538b4990ea459 Mon Sep 17 00:00:00 2001 From: patak Date: Thu, 30 Mar 2023 15:57:08 +0200 Subject: [PATCH 13/15] perf: avoid extra clean up --- packages/vite/src/node/server/moduleGraph.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/vite/src/node/server/moduleGraph.ts b/packages/vite/src/node/server/moduleGraph.ts index d8799736cc1f94..d55aa2a60a6c2d 100644 --- a/packages/vite/src/node/server/moduleGraph.ts +++ b/packages/vite/src/node/server/moduleGraph.ts @@ -82,8 +82,8 @@ export class ModuleGraph { ssr?: boolean, ): Promise { // Quick path, if we already have a module for this rawUrl (even without extension) - const unresolvedUrl = removeImportQuery(removeTimestampQuery(rawUrl)) - const mod = this._getUnresolvedUrlToModule(unresolvedUrl, ssr) + rawUrl = removeImportQuery(removeTimestampQuery(rawUrl)) + const mod = this._getUnresolvedUrlToModule(rawUrl, ssr) if (mod) { return mod } From 66acc208dd39ee9d50fbf52a0cb24a9f68cb4a3d Mon Sep 17 00:00:00 2001 From: patak Date: Thu, 30 Mar 2023 19:12:54 +0200 Subject: [PATCH 14/15] chore: update --- packages/vite/src/node/server/moduleGraph.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vite/src/node/server/moduleGraph.ts b/packages/vite/src/node/server/moduleGraph.ts index d55aa2a60a6c2d..af254e38b62704 100644 --- a/packages/vite/src/node/server/moduleGraph.ts +++ b/packages/vite/src/node/server/moduleGraph.ts @@ -88,7 +88,7 @@ export class ModuleGraph { return mod } - const [url] = await this.resolveUrl(rawUrl, ssr) + const [url] = await this._resolveUrl(rawUrl, ssr) return this.urlToModuleMap.get(url) } From b2a47b3aae2869fced28abd76b3334235ab06a5c Mon Sep 17 00:00:00 2001 From: patak Date: Thu, 30 Mar 2023 19:15:03 +0200 Subject: [PATCH 15/15] chore: remove unneeded mark explicit import --- packages/vite/src/node/plugins/importAnalysis.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vite/src/node/plugins/importAnalysis.ts b/packages/vite/src/node/plugins/importAnalysis.ts index c1a7b6403502cb..8ee82040d21e7f 100644 --- a/packages/vite/src/node/plugins/importAnalysis.ts +++ b/packages/vite/src/node/plugins/importAnalysis.ts @@ -694,7 +694,7 @@ export function importAnalysisPlugin(config: ResolvedConfig): Plugin { const normalizedAcceptedUrls = new Set() for (const { url, start, end } of acceptedUrls) { const [normalized] = await moduleGraph.resolveUrl( - toAbsoluteUrl(markExplicitImport(url)), + toAbsoluteUrl(url), ssr, ) normalizedAcceptedUrls.add(normalized)