@@ -10,6 +10,7 @@ const {
1010 ArrayPrototypeSort,
1111 FunctionPrototype,
1212 ObjectAssign,
13+ ObjectFreeze,
1314 ObjectSetPrototypeOf,
1415 PromisePrototypeThen,
1516 PromiseResolve,
@@ -61,6 +62,9 @@ const {
6162} = require ( 'internal/modules/helpers' ) ;
6263const { getOptionValue } = require ( 'internal/options' ) ;
6364const noop = FunctionPrototype ;
65+ // Module jobs retain both `linked` and `commonJsDeps`. Share their empty value
66+ // so leaf modules do not each retain two arrays.
67+ const kEmptyModuleDependencies = ObjectFreeze ( [ ] ) ;
6468const {
6569 ERR_REQUIRE_ASYNC_MODULE ,
6670 ERR_REQUIRE_ESM_RACE_CONDITION ,
@@ -296,9 +300,7 @@ class ModuleJobBase {
296300 constructor ( loader , url , importAttributes , phase , isMain , inspectBrk ) {
297301 assert ( typeof phase === 'number' ) ;
298302 this . loader = loader ;
299- this . importAttributes = importAttributes ;
300303 this . phase = phase ;
301- this . isMain = isMain ;
302304 this . inspectBrk = inspectBrk ;
303305
304306 this . url = url ;
@@ -317,9 +319,12 @@ class ModuleJobBase {
317319 this . loader . loadCache . set ( this . url , this . type , this ) ;
318320 const moduleRequests = this . module . getModuleRequests ( ) ;
319321 // Modules should be aligned with the moduleRequests array in order.
320- const modules = Array ( moduleRequests . length ) ;
321- const evaluationDepJobs = [ ] ;
322- this . commonJsDeps = Array ( moduleRequests . length ) ;
322+ const modules = moduleRequests . length === 0 ?
323+ kEmptyModuleDependencies : Array ( moduleRequests . length ) ;
324+ const evaluationDepJobs = moduleRequests . length === 0 ?
325+ kEmptyModuleDependencies : [ ] ;
326+ this . commonJsDeps = moduleRequests . length === 0 ?
327+ kEmptyModuleDependencies : Array ( moduleRequests . length ) ;
323328 try {
324329 for ( let idx = 0 ; idx < moduleRequests . length ; idx ++ ) {
325330 const request = moduleRequests [ idx ] ;
@@ -402,7 +407,7 @@ class ModuleJob extends ModuleJobBase {
402407 * first line paused in the debugger (because --inspect-brk is passed).
403408 * @param {ModuleRequestType } requestType Type of the module request.
404409 */
405- constructor ( loader , url , importAttributes = { __proto__ : null } , moduleOrModulePromise ,
410+ constructor ( loader , url , importAttributes , moduleOrModulePromise ,
406411 phase = kEvaluationPhase , isMain , inspectBrk , requestType ) {
407412 super ( loader , url , importAttributes , phase , isMain , inspectBrk ) ;
408413
@@ -452,9 +457,12 @@ class ModuleJob extends ModuleJobBase {
452457 // Create an ArrayLike to avoid calling into userspace with `.then`
453458 // when returned from the async function.
454459 // Modules should be aligned with the moduleRequests array in order.
455- const modulePromises = Array ( moduleRequests . length ) ;
456- const evaluationDepJobs = [ ] ;
457- this . commonJsDeps = Array ( moduleRequests . length ) ;
460+ const modulePromises = moduleRequests . length === 0 ?
461+ kEmptyModuleDependencies : Array ( moduleRequests . length ) ;
462+ const evaluationDepJobs = moduleRequests . length === 0 ?
463+ kEmptyModuleDependencies : [ ] ;
464+ this . commonJsDeps = moduleRequests . length === 0 ?
465+ kEmptyModuleDependencies : Array ( moduleRequests . length ) ;
458466 for ( let idx = 0 ; idx < moduleRequests . length ; idx ++ ) {
459467 const request = moduleRequests [ idx ] ;
460468 // Explicitly keeping track of dependency jobs is needed in order
0 commit comments