Skip to content

Commit 45c477c

Browse files
joyeecheungtargos
authored andcommitted
lib: restructure cjs and esm loaders
Create `lib/internal/modules` and restructure the module loaders to make the purpose of those files clearer. Also make it clear in the code that the object exported by `lib/internal/modules/cjs/loader.js` is `CJSModule` instead of the ambiguous `Module`. Before: ``` lib β”œβ”€β”€ ... β”œβ”€β”€ internal β”‚ β”œβ”€β”€ loaders β”‚ β”‚ β”œβ”€β”€ CreateDynamicModule.js β”‚ β”‚ β”œβ”€β”€ DefaultResolve.js β”‚ β”‚ β”œβ”€β”€ Loader.js β”‚ β”‚ β”œβ”€β”€ ModuleJob.js β”‚ β”‚ β”œβ”€β”€ ModuleMap.js β”‚ β”‚ β”œβ”€β”€ ModuleWrap.js β”‚ β”‚ └── Translators.js β”‚ └── module.js └── module.js ``` After: ``` lib β”œβ”€β”€ ... β”œβ”€β”€ internal β”‚ β”œβ”€β”€ ... β”‚ └── modules β”‚ β”œβ”€β”€ cjs β”‚ β”‚ β”œβ”€β”€ helpers.js β”‚ β”‚ └── loader.js β”‚ └── esm β”‚ β”œβ”€β”€ CreateDynamicModule.js β”‚ β”œβ”€β”€ DefaultResolve.js β”‚ β”œβ”€β”€ Loader.js β”‚ β”œβ”€β”€ ModuleJob.js β”‚ β”œβ”€β”€ ModuleMap.js β”‚ └── Translators.js └── module.js # deleted in this commit to work with git file mode ``` Backport-PR-URL: #19374 PR-URL: #19177 Refs: #19112 Reviewed-By: Gus Caplan <me@gus.host> Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com>
1 parent 83ebaf0 commit 45c477c

40 files changed

+200
-171
lines changed

β€Žlib/internal/bootstrap/loaders.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// This file creates the internal module & binding loaders used by built-in
22
// modules. In contrast, user land modules are loaded using
3-
// lib/module.js (CommonJS Modules) or lib/internal/loader/* (ES Modules).
3+
// lib/internal/modules/cjs/loader.js (CommonJS Modules) or
4+
// lib/internal/modules/esm/* (ES Modules).
45
//
56
// This file is compiled and run by node.cc before bootstrap/node.js
67
// was called, therefore the loaders are bootstraped before we start to

β€Žlib/internal/bootstrap/node.js

Lines changed: 29 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@
110110
process.emitWarning(
111111
'The ESM module loader is experimental.',
112112
'ExperimentalWarning', undefined);
113-
NativeModule.require('internal/process/modules').setup();
113+
NativeModule.require('internal/process/esm_loader').setup();
114114
}
115115

116116

@@ -170,22 +170,24 @@
170170
preloadModules();
171171
perf.markMilestone(NODE_PERFORMANCE_MILESTONE_PRELOAD_MODULE_LOAD_END);
172172

173-
const internalModule = NativeModule.require('internal/module');
174-
internalModule.addBuiltinLibsToObject(global);
173+
const {
174+
addBuiltinLibsToObject
175+
} = NativeModule.require('internal/modules/cjs/helpers');
176+
addBuiltinLibsToObject(global);
175177
evalScript('[eval]');
176178
} else if (process.argv[1] && process.argv[1] !== '-') {
177179
perf.markMilestone(NODE_PERFORMANCE_MILESTONE_MODULE_LOAD_START);
178180
// make process.argv[1] into a full path
179181
const path = NativeModule.require('path');
180182
process.argv[1] = path.resolve(process.argv[1]);
181183

182-
const Module = NativeModule.require('module');
184+
const CJSModule = NativeModule.require('internal/modules/cjs/loader');
183185

184186
// check if user passed `-c` or `--check` arguments to Node.
185187
if (process._syntax_check_only != null) {
186188
const fs = NativeModule.require('fs');
187189
// read the source
188-
const filename = Module._resolveFilename(process.argv[1]);
190+
const filename = CJSModule._resolveFilename(process.argv[1]);
189191
const source = fs.readFileSync(filename, 'utf-8');
190192
checkScriptSyntax(source, filename);
191193
process.exit(0);
@@ -196,7 +198,7 @@
196198
preloadModules();
197199
perf.markMilestone(
198200
NODE_PERFORMANCE_MILESTONE_PRELOAD_MODULE_LOAD_END);
199-
Module.runMain();
201+
CJSModule.runMain();
200202
} else {
201203
perf.markMilestone(NODE_PERFORMANCE_MILESTONE_MODULE_LOAD_START);
202204
perf.markMilestone(NODE_PERFORMANCE_MILESTONE_MODULE_LOAD_END);
@@ -321,7 +323,7 @@
321323

322324
function setupGlobalConsole() {
323325
const originalConsole = global.console;
324-
const Module = NativeModule.require('module');
326+
const CJSModule = NativeModule.require('internal/modules/cjs/loader');
325327
// Setup Node.js global.console
326328
const wrappedConsole = NativeModule.require('console');
327329
Object.defineProperty(global, 'console', {
@@ -331,22 +333,23 @@
331333
return wrappedConsole;
332334
}
333335
});
334-
setupInspector(originalConsole, wrappedConsole, Module);
336+
setupInspector(originalConsole, wrappedConsole, CJSModule);
335337
}
336338

337-
function setupInspector(originalConsole, wrappedConsole, Module) {
339+
function setupInspector(originalConsole, wrappedConsole, CJSModule) {
338340
if (!process.config.variables.v8_enable_inspector) {
339341
return;
340342
}
341343
const { addCommandLineAPI, consoleCall } = process.binding('inspector');
342344
// Setup inspector command line API
343-
const { makeRequireFunction } = NativeModule.require('internal/module');
345+
const { makeRequireFunction } =
346+
NativeModule.require('internal/modules/cjs/helpers');
344347
const path = NativeModule.require('path');
345348
const cwd = tryGetCwd(path);
346349

347-
const consoleAPIModule = new Module('<inspector console>');
350+
const consoleAPIModule = new CJSModule('<inspector console>');
348351
consoleAPIModule.paths =
349-
Module._nodeModulePaths(cwd).concat(Module.globalPaths);
352+
CJSModule._nodeModulePaths(cwd).concat(CJSModule.globalPaths);
350353
addCommandLineAPI('require', makeRequireFunction(consoleAPIModule));
351354
const config = {};
352355
for (const key of Object.keys(wrappedConsole)) {
@@ -461,13 +464,13 @@
461464
}
462465

463466
function evalScript(name) {
464-
const Module = NativeModule.require('module');
467+
const CJSModule = NativeModule.require('internal/modules/cjs/loader');
465468
const path = NativeModule.require('path');
466469
const cwd = tryGetCwd(path);
467470

468-
const module = new Module(name);
471+
const module = new CJSModule(name);
469472
module.filename = path.join(cwd, name);
470-
module.paths = Module._nodeModulePaths(cwd);
473+
module.paths = CJSModule._nodeModulePaths(cwd);
471474
const body = wrapForBreakOnFirstLine(process._eval);
472475
const script = `global.__filename = ${JSON.stringify(name)};\n` +
473476
'global.exports = exports;\n' +
@@ -486,21 +489,26 @@
486489
// Load preload modules
487490
function preloadModules() {
488491
if (process._preload_modules) {
489-
NativeModule.require('module')._preloadModules(process._preload_modules);
492+
const {
493+
_preloadModules
494+
} = NativeModule.require('internal/modules/cjs/loader');
495+
_preloadModules(process._preload_modules);
490496
}
491497
}
492498

493499
function checkScriptSyntax(source, filename) {
494-
const Module = NativeModule.require('module');
500+
const CJSModule = NativeModule.require('internal/modules/cjs/loader');
495501
const vm = NativeModule.require('vm');
496-
const internalModule = NativeModule.require('internal/module');
502+
const {
503+
stripShebang, stripBOM
504+
} = NativeModule.require('internal/modules/cjs/helpers');
497505

498506
// remove Shebang
499-
source = internalModule.stripShebang(source);
507+
source = stripShebang(source);
500508
// remove BOM
501-
source = internalModule.stripBOM(source);
509+
source = stripBOM(source);
502510
// wrap it
503-
source = Module.wrap(source);
511+
source = CJSModule.wrap(source);
504512
// compile the script, this will throw if it fails
505513
new vm.Script(source, { displayErrors: true, filename });
506514
}
File renamed without changes.

β€Žlib/module.js renamed to β€Žlib/internal/modules/cjs/loader.js

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,12 @@ const {
3434
internalModuleReadFile,
3535
internalModuleStat
3636
} = process.binding('fs');
37-
const internalModule = require('internal/module');
37+
const {
38+
makeRequireFunction,
39+
requireDepth,
40+
stripBOM,
41+
stripShebang
42+
} = require('internal/modules/cjs/helpers');
3843
const preserveSymlinks = !!process.binding('config').preserveSymlinks;
3944
const experimentalModules = !!process.binding('config').experimentalModules;
4045

@@ -43,9 +48,9 @@ const errors = require('internal/errors');
4348
module.exports = Module;
4449

4550
// these are below module.exports for the circular reference
46-
const internalESModule = require('internal/process/modules');
47-
const ModuleJob = require('internal/loader/ModuleJob');
48-
const createDynamicModule = require('internal/loader/CreateDynamicModule');
51+
const asyncESM = require('internal/process/esm_loader');
52+
const ModuleJob = require('internal/modules/esm/ModuleJob');
53+
const createDynamicModule = require('internal/modules/esm/CreateDynamicModule');
4954

5055
function stat(filename) {
5156
filename = path.toNamespacedPath(filename);
@@ -456,7 +461,7 @@ Module._load = function(request, parent, isMain) {
456461
}
457462

458463
if (experimentalModules && isMain) {
459-
internalESModule.loaderPromise.then((loader) => {
464+
asyncESM.loaderPromise.then((loader) => {
460465
return loader.import(getURLFromFilePath(request).pathname);
461466
})
462467
.catch((e) => {
@@ -562,7 +567,7 @@ Module.prototype.load = function(filename) {
562567
this.loaded = true;
563568

564569
if (experimentalModules) {
565-
const ESMLoader = internalESModule.ESMLoader;
570+
const ESMLoader = asyncESM.ESMLoader;
566571
const url = getURLFromFilePath(filename);
567572
const urlString = `${url}`;
568573
const exports = this.exports;
@@ -605,7 +610,7 @@ var resolvedArgv;
605610
// Returns exception, if any.
606611
Module.prototype._compile = function(content, filename) {
607612

608-
content = internalModule.stripShebang(content);
613+
content = stripShebang(content);
609614

610615
// create wrapper function
611616
var wrapper = Module.wrap(content);
@@ -638,8 +643,8 @@ Module.prototype._compile = function(content, filename) {
638643
}
639644
}
640645
var dirname = path.dirname(filename);
641-
var require = internalModule.makeRequireFunction(this);
642-
var depth = internalModule.requireDepth;
646+
var require = makeRequireFunction(this);
647+
var depth = requireDepth;
643648
if (depth === 0) stat.cache = new Map();
644649
var result;
645650
if (inspectorWrapper) {
@@ -657,15 +662,15 @@ Module.prototype._compile = function(content, filename) {
657662
// Native extension for .js
658663
Module._extensions['.js'] = function(module, filename) {
659664
var content = fs.readFileSync(filename, 'utf8');
660-
module._compile(internalModule.stripBOM(content), filename);
665+
module._compile(stripBOM(content), filename);
661666
};
662667

663668

664669
// Native extension for .json
665670
Module._extensions['.json'] = function(module, filename) {
666671
var content = fs.readFileSync(filename, 'utf8');
667672
try {
668-
module.exports = JSON.parse(internalModule.stripBOM(content));
673+
module.exports = JSON.parse(stripBOM(content));
669674
} catch (err) {
670675
err.message = filename + ': ' + err.message;
671676
throw err;

β€Žlib/internal/loader/DefaultResolve.js renamed to β€Žlib/internal/modules/esm/DefaultResolve.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
'use strict';
22

33
const { URL } = require('url');
4-
const CJSmodule = require('module');
4+
const CJSmodule = require('internal/modules/cjs/loader');
55
const internalFS = require('internal/fs');
66
const { NativeModule, internalBinding } = require('internal/bootstrap/loaders');
77
const { extname } = require('path');

β€Žlib/internal/loader/Loader.js renamed to β€Žlib/internal/modules/esm/Loader.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
'use strict';
22

33
const errors = require('internal/errors');
4-
const ModuleMap = require('internal/loader/ModuleMap');
5-
const ModuleJob = require('internal/loader/ModuleJob');
6-
const defaultResolve = require('internal/loader/DefaultResolve');
7-
const createDynamicModule = require('internal/loader/CreateDynamicModule');
8-
const translators = require('internal/loader/Translators');
4+
const ModuleMap = require('internal/modules/esm/ModuleMap');
5+
const ModuleJob = require('internal/modules/esm/ModuleJob');
6+
const defaultResolve = require('internal/modules/esm/DefaultResolve');
7+
const createDynamicModule = require('internal/modules/esm/CreateDynamicModule');
8+
const translators = require('internal/modules/esm/Translators');
99

1010
const FunctionBind = Function.call.bind(Function.prototype.bind);
1111

β€Žlib/internal/loader/ModuleMap.js renamed to β€Žlib/internal/modules/esm/ModuleMap.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use strict';
22

3-
const ModuleJob = require('internal/loader/ModuleJob');
3+
const ModuleJob = require('internal/modules/esm/ModuleJob');
44
const { SafeMap } = require('internal/safe_globals');
55
const debug = require('util').debuglog('esm');
66
const errors = require('internal/errors');

0 commit comments

Comments
Β (0)