Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

perf(moduleGraph): resolve dep urls in parallel #12619

Merged
merged 3 commits into from Mar 29, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
57 changes: 44 additions & 13 deletions packages/vite/src/node/server/moduleGraph.ts
Expand Up @@ -148,17 +148,33 @@ export class ModuleGraph {
): Promise<Set<ModuleNode> | undefined> {
mod.isSelfAccepting = isSelfAccepting
const prevImports = mod.importedModules
const nextImports = (mod.importedModules = new Set())
let noLongerImported: Set<ModuleNode> | undefined

let resolvePromises = []
let resolveResults = new Array(importedModules.size)
let index = 0
// 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)
const nextIndex = index++
if (typeof imported === 'string') {
resolvePromises.push(
this.ensureEntryFromUrl(imported, ssr).then((dep) => {
dep.importers.add(mod)
resolveResults[nextIndex] = dep
}),
)
} else {
imported.importers.add(mod)
resolveResults[nextIndex] = imported
}
}

if (resolvePromises.length) {
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)) {
Expand All @@ -169,15 +185,30 @@ 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 dep =
typeof accepted === 'string'
? await this.ensureEntryFromUrl(accepted, ssr)
: accepted
deps.add(dep)
const nextIndex = index++
if (typeof accepted === 'string') {
resolvePromises.push(
this.ensureEntryFromUrl(accepted, ssr).then((dep) => {
resolveResults[nextIndex] = dep
}),
)
} else {
resolveResults[nextIndex] = accepted
}
}

if (resolvePromises.length) {
await Promise.all(resolvePromises)
sun0day marked this conversation as resolved.
Show resolved Hide resolved
}

mod.acceptedHmrDeps = new Set(resolveResults)

// update accepted hmr exports
mod.acceptedHmrExports = acceptedExports
mod.importedBindings = importedBindings
Expand Down