@@ -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