Общие JS модули на самом деле довольно просты: вы берете весь код в файл и просто оборачиваете его в функцию. Выполните функцию и верните вызывающей стороне значение module.exports
после выполнения.
Вы можете увидеть заголовок этой функции в node.js исходном коде :
const wrapper = [
'(function (exports, require, module, __filename, __dirname) { ',
'\n});'
];
Оболочка применяется к коду в файле require
'd и затем вызывается следующим образом :
const exports = this.exports;
const thisValue = exports;
const module = this;
if (requireDepth === 0) statCache = new Map();
if (inspectorWrapper) {
result = inspectorWrapper(compiledWrapper, thisValue, exports,
require, module, filename, dirname);
} else {
result = compiledWrapper.call(thisValue, exports, require, module,
filename, dirname);
}
Как видите, это довольно просто. const exports = this.exports
, а затем exports
передается в качестве аргумента функции-обертки - таким образом, они изначально указывают на одно и то же значение, но если вы переназначаете либо, они больше не будут.