@@ -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 ( ) {
@@ -71,10 +76,15 @@ class ModuleLoader {
7176 */
7277 evalIndex = 0 ;
7378
79+ /**
80+ * Registry of resolved specifiers
81+ */
82+ #resolveCache = newResolveCache ( ) ;
83+
7484 /**
7585 * Registry of loaded modules, akin to `require.cache`
7686 */
77- moduleMap = newModuleMap ( ) ;
87+ loadCache = newLoadCache ( ) ;
7888
7989 /**
8090 * Methods which translate input code or other information into ES modules
@@ -183,7 +193,7 @@ class ModuleLoader {
183193 const ModuleJob = require ( 'internal/modules/esm/module_job' ) ;
184194 const job = new ModuleJob (
185195 this , url , undefined , evalInstance , false , false ) ;
186- this . moduleMap . set ( url , undefined , job ) ;
196+ this . loadCache . set ( url , undefined , job ) ;
187197 const { module } = await job . run ( ) ;
188198
189199 return {
@@ -213,11 +223,11 @@ class ModuleLoader {
213223 getJobFromResolveResult ( resolveResult , parentURL , importAssertions ) {
214224 const { url, format } = resolveResult ;
215225 const resolvedImportAssertions = resolveResult . importAssertions ?? importAssertions ;
216- let job = this . moduleMap . get ( url , resolvedImportAssertions . type ) ;
226+ let job = this . loadCache . get ( url , resolvedImportAssertions . type ) ;
217227
218228 // CommonJS will set functions for lazy job evaluation.
219229 if ( typeof job === 'function' ) {
220- this . moduleMap . set ( url , undefined , job = job ( ) ) ;
230+ this . loadCache . set ( url , undefined , job = job ( ) ) ;
221231 }
222232
223233 if ( job === undefined ) {
@@ -277,7 +287,7 @@ class ModuleLoader {
277287 inspectBrk ,
278288 ) ;
279289
280- this . moduleMap . set ( url , importAssertions . type , job ) ;
290+ this . loadCache . set ( url , importAssertions . type , job ) ;
281291
282292 return job ;
283293 }
@@ -315,13 +325,20 @@ class ModuleLoader {
315325 * @param {string } [parentURL] The URL path of the module's parent.
316326 * @param {ImportAssertions } importAssertions Assertions from the import
317327 * statement or expression.
318- * @returns {Promise< { format: string, url: URL['href'] }> }
328+ * @returns {{ format: string, url: URL['href'] } }
319329 */
320330 resolve ( originalSpecifier , parentURL , importAssertions ) {
321331 if ( this . #customizations) {
322332 return this . #customizations. resolve ( originalSpecifier , parentURL , importAssertions ) ;
323333 }
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 ;
325342 }
326343
327344 /**
0 commit comments