From 7007ad2cfaf764248075047b4eb7224cecdab83c Mon Sep 17 00:00:00 2001 From: ivan Date: Tue, 28 Mar 2023 00:02:11 +0800 Subject: [PATCH 1/3] perf(ModuleGraph): resolve dep urls in parallel --- packages/vite/src/node/server/moduleGraph.ts | 38 ++++++++++++++------ 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/packages/vite/src/node/server/moduleGraph.ts b/packages/vite/src/node/server/moduleGraph.ts index 4db3bcbca9a0f4..47ff8d71ade68d 100644 --- a/packages/vite/src/node/server/moduleGraph.ts +++ b/packages/vite/src/node/server/moduleGraph.ts @@ -150,15 +150,24 @@ export class ModuleGraph { const prevImports = mod.importedModules const nextImports = (mod.importedModules = new Set()) let noLongerImported: Set | undefined + let resolvePromises = [] // update import graph for (const imported of importedModules) { - const dep = - typeof imported === 'string' - ? await this.ensureEntryFromUrl(imported, ssr) - : imported - dep.importers.add(mod) - nextImports.add(dep) + if (typeof imported === 'string') { + resolvePromises.push( + this.ensureEntryFromUrl(imported, ssr).then((dep) => { + dep.importers.add(mod) + nextImports.add(dep) + }), + ) + } else { + imported.importers.add(mod) + nextImports.add(imported) + } } + + resolvePromises.length && (await Promise.all(resolvePromises)) + // remove the importer from deps that were imported but no longer are. prevImports.forEach((dep) => { if (!nextImports.has(dep)) { @@ -169,15 +178,22 @@ export class ModuleGraph { } } }) + // update accepted hmr deps const deps = (mod.acceptedHmrDeps = new Set()) + resolvePromises = [] for (const accepted of acceptedModules) { - const dep = - typeof accepted === 'string' - ? await this.ensureEntryFromUrl(accepted, ssr) - : accepted - deps.add(dep) + if (typeof accepted === 'string') { + resolvePromises.push( + this.ensureEntryFromUrl(accepted, ssr).then((dep) => deps.add(dep)), + ) + } else { + deps.add(accepted) + } } + + resolvePromises.length && (await Promise.all(resolvePromises)) + // update accepted hmr exports mod.acceptedHmrExports = acceptedExports mod.importedBindings = importedBindings From fec8a91c0c1daf6e73c506435526677ee0638753 Mon Sep 17 00:00:00 2001 From: ivan Date: Tue, 28 Mar 2023 22:03:48 +0800 Subject: [PATCH 2/3] refactor: condition style --- packages/vite/src/node/server/moduleGraph.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/vite/src/node/server/moduleGraph.ts b/packages/vite/src/node/server/moduleGraph.ts index 47ff8d71ade68d..8b11809914d767 100644 --- a/packages/vite/src/node/server/moduleGraph.ts +++ b/packages/vite/src/node/server/moduleGraph.ts @@ -166,7 +166,9 @@ export class ModuleGraph { } } - resolvePromises.length && (await Promise.all(resolvePromises)) + if (resolvePromises.length) { + await Promise.all(resolvePromises) + } // remove the importer from deps that were imported but no longer are. prevImports.forEach((dep) => { @@ -192,7 +194,9 @@ export class ModuleGraph { } } - resolvePromises.length && (await Promise.all(resolvePromises)) + if (resolvePromises.length) { + await Promise.all(resolvePromises) + } // update accepted hmr exports mod.acceptedHmrExports = acceptedExports From 10d9026c2202e144722a4ea0914d4ba8c4bfcd6c Mon Sep 17 00:00:00 2001 From: ivan Date: Wed, 29 Mar 2023 10:29:24 +0800 Subject: [PATCH 3/3] fix: keep nextImports order --- packages/vite/src/node/server/moduleGraph.ts | 23 +++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/packages/vite/src/node/server/moduleGraph.ts b/packages/vite/src/node/server/moduleGraph.ts index 8b11809914d767..f7d49ce5395ef6 100644 --- a/packages/vite/src/node/server/moduleGraph.ts +++ b/packages/vite/src/node/server/moduleGraph.ts @@ -148,21 +148,24 @@ export class ModuleGraph { ): Promise | undefined> { mod.isSelfAccepting = isSelfAccepting const prevImports = mod.importedModules - const nextImports = (mod.importedModules = new Set()) let noLongerImported: Set | undefined + let resolvePromises = [] + let resolveResults = new Array(importedModules.size) + let index = 0 // update import graph for (const imported of importedModules) { + const nextIndex = index++ if (typeof imported === 'string') { resolvePromises.push( this.ensureEntryFromUrl(imported, ssr).then((dep) => { dep.importers.add(mod) - nextImports.add(dep) + resolveResults[nextIndex] = dep }), ) } else { imported.importers.add(mod) - nextImports.add(imported) + resolveResults[nextIndex] = imported } } @@ -170,6 +173,8 @@ export class ModuleGraph { await Promise.all(resolvePromises) } + const nextImports = (mod.importedModules = new Set(resolveResults)) + // remove the importer from deps that were imported but no longer are. prevImports.forEach((dep) => { if (!nextImports.has(dep)) { @@ -182,15 +187,19 @@ export class ModuleGraph { }) // update accepted hmr deps - const deps = (mod.acceptedHmrDeps = new Set()) resolvePromises = [] + resolveResults = new Array(acceptedModules.size) + index = 0 for (const accepted of acceptedModules) { + const nextIndex = index++ if (typeof accepted === 'string') { resolvePromises.push( - this.ensureEntryFromUrl(accepted, ssr).then((dep) => deps.add(dep)), + this.ensureEntryFromUrl(accepted, ssr).then((dep) => { + resolveResults[nextIndex] = dep + }), ) } else { - deps.add(accepted) + resolveResults[nextIndex] = accepted } } @@ -198,6 +207,8 @@ export class ModuleGraph { await Promise.all(resolvePromises) } + mod.acceptedHmrDeps = new Set(resolveResults) + // update accepted hmr exports mod.acceptedHmrExports = acceptedExports mod.importedBindings = importedBindings