Skip to content

Commit

Permalink
perf(hmr): skip traversed modules when checking circular imports (#15034
Browse files Browse the repository at this point in the history
)
  • Loading branch information
skovhus authored Nov 21, 2023
1 parent dc494ad commit 41e437f
Showing 1 changed file with 8 additions and 0 deletions.
8 changes: 8 additions & 0 deletions packages/vite/src/node/server/hmr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -361,11 +361,13 @@ function propagateUpdate(
* @param nodeChain The chain of nodes/imports that lead to the node.
* (The last node in the chain imports the `node` parameter)
* @param currentChain The current chain tracked from the `node` parameter
* @param traversedModules The set of modules that have traversed
*/
function isNodeWithinCircularImports(
node: ModuleNode,
nodeChain: ModuleNode[],
currentChain: ModuleNode[] = [node],
traversedModules = new Set<ModuleNode>(),
): HasDeadEnd {
// To help visualize how each parameters work, imagine this import graph:
//
Expand All @@ -383,6 +385,11 @@ function isNodeWithinCircularImports(
// It works by checking if any `node` importers are within `nodeChain`, which
// means there's an import loop with a HMR-accepted module in it.

if (traversedModules.has(node)) {
return false
}
traversedModules.add(node)

for (const importer of node.importers) {
// Node may import itself which is safe
if (importer === node) continue
Expand Down Expand Up @@ -416,6 +423,7 @@ function isNodeWithinCircularImports(
importer,
nodeChain,
currentChain.concat(importer),
traversedModules,
)
if (result) return result
}
Expand Down

0 comments on commit 41e437f

Please sign in to comment.