Skip to content

Commit 5ead461

Browse files
authored
fix: return the same instance of ModuleNode for the same EnvironmentModuleNode (#18455)
1 parent d4e0442 commit 5ead461

1 file changed

Lines changed: 36 additions & 2 deletions

File tree

packages/vite/src/node/server/mixedModuleGraph.ts

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,12 @@ export class ModuleGraph {
220220

221221
fileToModulesMap: Map<string, Set<ModuleNode>>
222222

223+
private moduleNodeCache = new DualWeakMap<
224+
EnvironmentModuleNode,
225+
EnvironmentModuleNode,
226+
ModuleNode
227+
>()
228+
223229
constructor(moduleGraphs: {
224230
client: () => EnvironmentModuleGraph
225231
ssr: () => EnvironmentModuleGraph
@@ -452,8 +458,36 @@ export class ModuleGraph {
452458
clientModule?: EnvironmentModuleNode,
453459
ssrModule?: EnvironmentModuleNode,
454460
): ModuleNode {
455-
// ...
456-
return new ModuleNode(this, clientModule, ssrModule)
461+
const cached = this.moduleNodeCache.get(clientModule, ssrModule)
462+
if (cached) {
463+
return cached
464+
}
465+
466+
const moduleNode = new ModuleNode(this, clientModule, ssrModule)
467+
this.moduleNodeCache.set(clientModule, ssrModule, moduleNode)
468+
return moduleNode
469+
}
470+
}
471+
472+
class DualWeakMap<K1 extends WeakKey, K2 extends WeakKey, V> {
473+
private map = new WeakMap<K1 | object, WeakMap<K2 | object, V>>()
474+
private undefinedKey = {}
475+
476+
get(key1: K1 | undefined, key2: K2 | undefined): V | undefined {
477+
const k1 = key1 ?? this.undefinedKey
478+
const k2 = key2 ?? this.undefinedKey
479+
return this.map.get(k1)?.get(k2)
480+
}
481+
482+
set(key1: K1 | undefined, key2: K2 | undefined, value: V): void {
483+
const k1 = key1 ?? this.undefinedKey
484+
const k2 = key2 ?? this.undefinedKey
485+
if (!this.map.has(k1)) {
486+
this.map.set(k1, new Map<K2, V>())
487+
}
488+
489+
const m = this.map.get(k1)!
490+
m.set(k2, value)
457491
}
458492
}
459493

0 commit comments

Comments
 (0)