@@ -20,9 +20,14 @@ const {
2020} = require ( 'internal/modules/esm/utils' ) ;
2121let defaultResolve , defaultLoad , importMetaInitializer ;
2222
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 ( ) ;
2631}
2732
2833function getTranslators ( ) {
@@ -73,10 +78,15 @@ class ModuleLoader {
7378 */
7479 evalIndex = 0 ;
7580
81+ /**
82+ * Registry of resolved specifiers
83+ */
84+ #resolveCache = newResolveCache ( ) ;
85+
7686 /**
7787 * Registry of loaded modules, akin to `require.cache`
7888 */
79- moduleMap = newModuleMap ( ) ;
89+ loadCache = newLoadCache ( ) ;
8090
8191 /**
8292 * Methods which translate input code or other information into ES modules
@@ -195,7 +205,7 @@ class ModuleLoader {
195205 const ModuleJob = require ( 'internal/modules/esm/module_job' ) ;
196206 const job = new ModuleJob (
197207 this , url , undefined , evalInstance , false , false ) ;
198- this . moduleMap . set ( url , undefined , job ) ;
208+ this . loadCache . set ( url , undefined , job ) ;
199209 const { module } = await job . run ( ) ;
200210
201211 return {
@@ -224,11 +234,11 @@ class ModuleLoader {
224234 getJobFromResolveResult ( resolveResult , parentURL , importAssertions ) {
225235 const { url, format } = resolveResult ;
226236 const resolvedImportAssertions = resolveResult . importAssertions ?? importAssertions ;
227- let job = this . moduleMap . get ( url , resolvedImportAssertions . type ) ;
237+ let job = this . loadCache . get ( url , resolvedImportAssertions . type ) ;
228238
229239 // CommonJS will set functions for lazy job evaluation.
230240 if ( typeof job === 'function' ) {
231- this . moduleMap . set ( url , undefined , job = job ( ) ) ;
241+ this . loadCache . set ( url , undefined , job = job ( ) ) ;
232242 }
233243
234244 if ( job === undefined ) {
@@ -288,7 +298,7 @@ class ModuleLoader {
288298 inspectBrk ,
289299 ) ;
290300
291- this . moduleMap . set ( url , importAssertions . type , job ) ;
301+ this . loadCache . set ( url , importAssertions . type , job ) ;
292302
293303 return job ;
294304 }
@@ -326,13 +336,20 @@ class ModuleLoader {
326336 * @param {string } [parentURL] The URL path of the module's parent.
327337 * @param {ImportAssertions } importAssertions Assertions from the import
328338 * statement or expression.
329- * @returns {Promise< { format: string, url: URL['href'] }> }
339+ * @returns {{ format: string, url: URL['href'] } }
330340 */
331341 resolve ( originalSpecifier , parentURL , importAssertions ) {
332342 if ( this . #customizations) {
333343 return this . #customizations. resolve ( originalSpecifier , parentURL , importAssertions ) ;
334344 }
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 ;
336353 }
337354
338355 /**
0 commit comments