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 <[email protected]> Reviewed-By: Matteo Collina <[email protected]> Reviewed-By: Benjamin Gruenbaum <[email protected]>
1 parent 83ebaf0 commit 45c477c

40 files changed

+200
-171
lines changed

lib/internal/bootstrap/loaders.js

+2-1
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

+29-21
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 lib/internal/modules/cjs/loader.js

+16-11
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 lib/internal/modules/esm/DefaultResolve.js

+1-1
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 lib/internal/modules/esm/Loader.js

+5-5
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

File renamed without changes.

lib/internal/loader/ModuleMap.js lib/internal/modules/esm/ModuleMap.js

+1-1
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');
File renamed without changes.

lib/internal/loader/Translators.js lib/internal/modules/esm/Translators.js

+8-5
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,13 @@
22

33
const { NativeModule, internalBinding } = require('internal/bootstrap/loaders');
44
const { ModuleWrap } = internalBinding('module_wrap');
5-
const internalCJSModule = require('internal/module');
6-
const CJSModule = require('module');
5+
const {
6+
stripShebang,
7+
stripBOM
8+
} = require('internal/modules/cjs/helpers');
9+
const CJSModule = require('internal/modules/cjs/loader');
710
const internalURLModule = require('internal/url');
8-
const createDynamicModule = require('internal/loader/CreateDynamicModule');
11+
const createDynamicModule = require('internal/modules/esm/CreateDynamicModule');
912
const fs = require('fs');
1013
const { _makeLong } = require('path');
1114
const { SafeMap } = require('internal/safe_globals');
@@ -24,7 +27,7 @@ translators.set('esm', async (url) => {
2427
const source = `${await readFileAsync(new URL(url))}`;
2528
debug(`Translating StandardModule ${url}`);
2629
return {
27-
module: new ModuleWrap(internalCJSModule.stripShebang(source), url),
30+
module: new ModuleWrap(stripShebang(source), url),
2831
reflect: undefined
2932
};
3033
});
@@ -82,7 +85,7 @@ translators.set('json', async (url) => {
8285
const pathname = internalURLModule.getPathFromURL(new URL(url));
8386
const content = readFileSync(pathname, 'utf8');
8487
try {
85-
const exports = JsonParse(internalCJSModule.stripBOM(content));
88+
const exports = JsonParse(stripBOM(content));
8689
reflect.exports.default.set(exports);
8790
} catch (err) {
8891
err.message = pathname + ': ' + err.message;

lib/internal/process/modules.js lib/internal/process/esm_loader.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ const {
66
} = internalBinding('module_wrap');
77

88
const { getURLFromFilePath } = require('internal/url');
9-
const Loader = require('internal/loader/Loader');
9+
const Loader = require('internal/modules/esm/Loader');
1010
const path = require('path');
1111
const { URL } = require('url');
1212

lib/repl.js

+14-9
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,11 @@
4242

4343
'use strict';
4444

45-
const internalModule = require('internal/module');
45+
const {
46+
builtinLibs,
47+
makeRequireFunction,
48+
addBuiltinLibsToObject
49+
} = require('internal/modules/cjs/helpers');
4650
const internalUtil = require('internal/util');
4751
const { isTypedArray } = require('internal/util/types');
4852
const util = require('util');
@@ -54,7 +58,7 @@ const path = require('path');
5458
const fs = require('fs');
5559
const { Interface } = require('readline');
5660
const { Console } = require('console');
57-
const Module = require('module');
61+
const CJSModule = require('internal/modules/cjs/loader');
5862
const domain = require('domain');
5963
const debug = util.debuglog('repl');
6064
const errors = require('internal/errors');
@@ -90,7 +94,7 @@ try {
9094
}
9195

9296
// Hack for repl require to work properly with node_modules folders
93-
module.paths = Module._nodeModulePaths(module.filename);
97+
module.paths = CJSModule._nodeModulePaths(module.filename);
9498

9599
// If obj.hasOwnProperty has been overridden, then calling
96100
// obj.hasOwnProperty(prop) will break.
@@ -103,7 +107,7 @@ function hasOwnProperty(obj, prop) {
103107
// This is the default "writer" value if none is passed in the REPL options.
104108
exports.writer = util.inspect;
105109

106-
exports._builtinLibs = internalModule.builtinLibs;
110+
exports._builtinLibs = builtinLibs;
107111

108112
function REPLServer(prompt,
109113
stream,
@@ -673,14 +677,15 @@ REPLServer.prototype.createContext = function() {
673677
}
674678
}
675679

676-
var module = new Module('<repl>');
677-
module.paths = Module._resolveLookupPaths('<repl>', parentModule, true) || [];
680+
var module = new CJSModule('<repl>');
681+
module.paths =
682+
CJSModule._resolveLookupPaths('<repl>', parentModule, true) || [];
678683

679-
var require = internalModule.makeRequireFunction(module);
684+
var require = makeRequireFunction(module);
680685
context.module = module;
681686
context.require = require;
682687

683-
internalModule.addBuiltinLibsToObject(context);
688+
addBuiltinLibsToObject(context);
684689

685690
return context;
686691
};
@@ -889,7 +894,7 @@ function complete(line, callback) {
889894
} else if (/^\.\.?\//.test(completeOn)) {
890895
paths = [process.cwd()];
891896
} else {
892-
paths = module.paths.concat(Module.globalPaths);
897+
paths = module.paths.concat(CJSModule.globalPaths);
893898
}
894899

895900
for (i = 0; i < paths.length; i++) {

0 commit comments

Comments
 (0)