diff --git a/packages/vite/src/client/client.ts b/packages/vite/src/client/client.ts index 0ea5af710c0518..fdd28e6be42278 100644 --- a/packages/vite/src/client/client.ts +++ b/packages/vite/src/client/client.ts @@ -400,46 +400,29 @@ async function fetchUpdate({ path, acceptedPath, timestamp }: Update) { const moduleMap = new Map() const isSelfUpdate = path === acceptedPath - // make sure we only import each dep once - const modulesToUpdate = new Set() - if (isSelfUpdate) { - // self update - only update self - modulesToUpdate.add(path) - } else { - // dep update - for (const { deps } of mod.callbacks) { - deps.forEach((dep) => { - if (acceptedPath === dep) { - modulesToUpdate.add(dep) - } - }) - } - } - // determine the qualified callbacks before we re-import the modules - const qualifiedCallbacks = mod.callbacks.filter(({ deps }) => { - return deps.some((dep) => modulesToUpdate.has(dep)) - }) - - await Promise.all( - Array.from(modulesToUpdate).map(async (dep) => { - const disposer = disposeMap.get(dep) - if (disposer) await disposer(dataMap.get(dep)) - const [path, query] = dep.split(`?`) - try { - const newMod: ModuleNamespace = await import( - /* @vite-ignore */ - base + - path.slice(1) + - `?import&t=${timestamp}${query ? `&${query}` : ''}` - ) - moduleMap.set(dep, newMod) - } catch (e) { - warnFailedFetch(e, dep) - } - }) + const qualifiedCallbacks = mod.callbacks.filter(({ deps }) => + deps.includes(acceptedPath) ) + if (isSelfUpdate || qualifiedCallbacks.length > 0) { + const dep = acceptedPath + const disposer = disposeMap.get(dep) + if (disposer) await disposer(dataMap.get(dep)) + const [path, query] = dep.split(`?`) + try { + const newMod: ModuleNamespace = await import( + /* @vite-ignore */ + base + + path.slice(1) + + `?import&t=${timestamp}${query ? `&${query}` : ''}` + ) + moduleMap.set(dep, newMod) + } catch (e) { + warnFailedFetch(e, dep) + } + } + return () => { for (const { deps, fn } of qualifiedCallbacks) { fn(deps.map((dep) => moduleMap.get(dep)))