From 6550013b73f52dfc5dec980d4f483cc3d07d5eac Mon Sep 17 00:00:00 2001 From: Ruben Bridgewater Date: Mon, 7 May 2018 00:03:12 +0200 Subject: [PATCH] lib: lazy load necessary loaders PR-URL: https://github.com/nodejs/node/pull/20567 Reviewed-By: Gus Caplan Reviewed-By: Matteo Collina Reviewed-By: James M Snell Reviewed-By: Jeremiah Senkpiel --- lib/internal/modules/cjs/loader.js | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/lib/internal/modules/cjs/loader.js b/lib/internal/modules/cjs/loader.js index 022f58d27e2..e471cc013a6 100644 --- a/lib/internal/modules/cjs/loader.js +++ b/lib/internal/modules/cjs/loader.js @@ -23,8 +23,6 @@ const { NativeModule } = require('internal/bootstrap/loaders'); const util = require('util'); -const { decorateErrorStack } = require('internal/util'); -const { getURLFromFilePath } = require('internal/url'); const vm = require('vm'); const assert = require('assert').ok; const fs = require('fs'); @@ -53,11 +51,21 @@ const { module.exports = Module; -// these are below module.exports for the circular reference -const asyncESM = require('internal/process/esm_loader'); -const ModuleJob = require('internal/modules/esm/module_job'); -const createDynamicModule = require( - 'internal/modules/esm/create_dynamic_module'); +let asyncESM; +let ModuleJob; +let createDynamicModule; +let getURLFromFilePath; +let decorateErrorStack; + +function lazyLoadESM() { + asyncESM = require('internal/process/esm_loader'); + ModuleJob = require('internal/modules/esm/module_job'); + createDynamicModule = require( + 'internal/modules/esm/create_dynamic_module'); + decorateErrorStack = require('internal/util').decorateErrorStack; + getURLFromFilePath = require('internal/url').getURLFromFilePath; +} + const { CHAR_UPPERCASE_A, CHAR_LOWERCASE_A, @@ -497,6 +505,7 @@ Module._load = function(request, parent, isMain) { } if (experimentalModules && isMain) { + if (asyncESM === undefined) lazyLoadESM(); asyncESM.loaderPromise.then((loader) => { return loader.import(getURLFromFilePath(request).pathname); }) @@ -604,6 +613,7 @@ Module.prototype.load = function(filename) { this.loaded = true; if (experimentalModules) { + if (asyncESM === undefined) lazyLoadESM(); const ESMLoader = asyncESM.ESMLoader; const url = getURLFromFilePath(filename); const urlString = `${url}`; @@ -722,6 +732,7 @@ Module._extensions['.node'] = function(module, filename) { }; if (experimentalModules) { + if (asyncESM === undefined) lazyLoadESM(); Module._extensions['.mjs'] = function(module, filename) { throw new ERR_REQUIRE_ESM(filename); }; @@ -797,5 +808,5 @@ Module._preloadModules = function(requests) { Module._initPaths(); -// backwards compatibility +// Backwards compatibility Module.Module = Module;