@@ -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 ( ) {
@@ -73,10 +78,15 @@ class ModuleLoader {
73
78
*/
74
79
evalIndex = 0 ;
75
80
81
+ /**
82
+ * Registry of resolved specifiers
83
+ */
84
+ #resolveCache = newResolveCache ( ) ;
85
+
76
86
/**
77
87
* Registry of loaded modules, akin to `require.cache`
78
88
*/
79
- moduleMap = newModuleMap ( ) ;
89
+ loadCache = newLoadCache ( ) ;
80
90
81
91
/**
82
92
* Methods which translate input code or other information into ES modules
@@ -195,7 +205,7 @@ class ModuleLoader {
195
205
const ModuleJob = require ( 'internal/modules/esm/module_job' ) ;
196
206
const job = new ModuleJob (
197
207
this , url , undefined , evalInstance , false , false ) ;
198
- this . moduleMap . set ( url , undefined , job ) ;
208
+ this . loadCache . set ( url , undefined , job ) ;
199
209
const { module } = await job . run ( ) ;
200
210
201
211
return {
@@ -224,11 +234,11 @@ class ModuleLoader {
224
234
getJobFromResolveResult ( resolveResult , parentURL , importAssertions ) {
225
235
const { url, format } = resolveResult ;
226
236
const resolvedImportAssertions = resolveResult . importAssertions ?? importAssertions ;
227
- let job = this . moduleMap . get ( url , resolvedImportAssertions . type ) ;
237
+ let job = this . loadCache . get ( url , resolvedImportAssertions . type ) ;
228
238
229
239
// CommonJS will set functions for lazy job evaluation.
230
240
if ( typeof job === 'function' ) {
231
- this . moduleMap . set ( url , undefined , job = job ( ) ) ;
241
+ this . loadCache . set ( url , undefined , job = job ( ) ) ;
232
242
}
233
243
234
244
if ( job === undefined ) {
@@ -288,7 +298,7 @@ class ModuleLoader {
288
298
inspectBrk ,
289
299
) ;
290
300
291
- this . moduleMap . set ( url , importAssertions . type , job ) ;
301
+ this . loadCache . set ( url , importAssertions . type , job ) ;
292
302
293
303
return job ;
294
304
}
@@ -326,13 +336,20 @@ class ModuleLoader {
326
336
* @param {string } [parentURL] The URL path of the module's parent.
327
337
* @param {ImportAssertions } importAssertions Assertions from the import
328
338
* statement or expression.
329
- * @returns {Promise< { format: string, url: URL['href'] }> }
339
+ * @returns {{ format: string, url: URL['href'] } }
330
340
*/
331
341
resolve ( originalSpecifier , parentURL , importAssertions ) {
332
342
if ( this . #customizations) {
333
343
return this . #customizations. resolve ( originalSpecifier , parentURL , importAssertions ) ;
334
344
}
335
- return this . defaultResolve ( originalSpecifier , parentURL , importAssertions ) ;
345
+ const requestKey = this . #resolveCache. serializeKey ( originalSpecifier , importAssertions ) ;
346
+ const cachedResult = this . #resolveCache. get ( requestKey , parentURL ) ;
347
+ if ( cachedResult != null ) {
348
+ return cachedResult ;
349
+ }
350
+ const result = this . defaultResolve ( originalSpecifier , parentURL , importAssertions ) ;
351
+ this . #resolveCache. set ( requestKey , parentURL , result ) ;
352
+ return result ;
336
353
}
337
354
338
355
/**
0 commit comments