@@ -20,9 +20,14 @@ const {
20
20
} = require ( 'internal/modules/esm/utils' ) ;
21
21
let defaultResolve , defaultLoad , importMetaInitializer ;
22
22
23
- function newModuleMap ( ) {
24
- const ModuleMap = require ( 'internal/modules/esm/module_map' ) ;
25
- return new ModuleMap ( ) ;
23
+ function newResolveCache ( ) {
24
+ const { ResolveCache } = require ( 'internal/modules/esm/module_map' ) ;
25
+ return new ResolveCache ( ) ;
26
+ }
27
+
28
+ function newLoadCache ( ) {
29
+ const { LoadCache } = require ( 'internal/modules/esm/module_map' ) ;
30
+ return new LoadCache ( ) ;
26
31
}
27
32
28
33
function getTranslators ( ) {
@@ -71,10 +76,15 @@ class ModuleLoader {
71
76
*/
72
77
evalIndex = 0 ;
73
78
79
+ /**
80
+ * Registry of resolved specifiers
81
+ */
82
+ #resolveCache = newResolveCache ( ) ;
83
+
74
84
/**
75
85
* Registry of loaded modules, akin to `require.cache`
76
86
*/
77
- moduleMap = newModuleMap ( ) ;
87
+ loadCache = newLoadCache ( ) ;
78
88
79
89
/**
80
90
* Methods which translate input code or other information into ES modules
@@ -183,7 +193,7 @@ class ModuleLoader {
183
193
const ModuleJob = require ( 'internal/modules/esm/module_job' ) ;
184
194
const job = new ModuleJob (
185
195
this , url , undefined , evalInstance , false , false ) ;
186
- this . moduleMap . set ( url , undefined , job ) ;
196
+ this . loadCache . set ( url , undefined , job ) ;
187
197
const { module } = await job . run ( ) ;
188
198
189
199
return {
@@ -213,11 +223,11 @@ class ModuleLoader {
213
223
getJobFromResolveResult ( resolveResult , parentURL , importAssertions ) {
214
224
const { url, format } = resolveResult ;
215
225
const resolvedImportAssertions = resolveResult . importAssertions ?? importAssertions ;
216
- let job = this . moduleMap . get ( url , resolvedImportAssertions . type ) ;
226
+ let job = this . loadCache . get ( url , resolvedImportAssertions . type ) ;
217
227
218
228
// CommonJS will set functions for lazy job evaluation.
219
229
if ( typeof job === 'function' ) {
220
- this . moduleMap . set ( url , undefined , job = job ( ) ) ;
230
+ this . loadCache . set ( url , undefined , job = job ( ) ) ;
221
231
}
222
232
223
233
if ( job === undefined ) {
@@ -277,7 +287,7 @@ class ModuleLoader {
277
287
inspectBrk ,
278
288
) ;
279
289
280
- this . moduleMap . set ( url , importAssertions . type , job ) ;
290
+ this . loadCache . set ( url , importAssertions . type , job ) ;
281
291
282
292
return job ;
283
293
}
@@ -315,13 +325,20 @@ class ModuleLoader {
315
325
* @param {string } [parentURL] The URL path of the module's parent.
316
326
* @param {ImportAssertions } importAssertions Assertions from the import
317
327
* statement or expression.
318
- * @returns {Promise< { format: string, url: URL['href'] }> }
328
+ * @returns {{ format: string, url: URL['href'] } }
319
329
*/
320
330
resolve ( originalSpecifier , parentURL , importAssertions ) {
321
331
if ( this . #customizations) {
322
332
return this . #customizations. resolve ( originalSpecifier , parentURL , importAssertions ) ;
323
333
}
324
- return this . defaultResolve ( originalSpecifier , parentURL , importAssertions ) ;
334
+ const requestKey = this . #resolveCache. serializeKey ( originalSpecifier , importAssertions ) ;
335
+ const cachedResult = this . #resolveCache. get ( requestKey , parentURL ) ;
336
+ if ( cachedResult != null ) {
337
+ return cachedResult ;
338
+ }
339
+ const result = this . defaultResolve ( originalSpecifier , parentURL , importAssertions ) ;
340
+ this . #resolveCache. set ( requestKey , parentURL , result ) ;
341
+ return result ;
325
342
}
326
343
327
344
/**
0 commit comments