Рассмотрим внутреннюю структуру модуля:
// moduleWrapper.js
console.log('Module arguments:', arguments);
console.log('Module this:', this);
console.log('Module closure vars:', typeof require, typeof module, typeof exports, typeof __filename, typeof __dirname);
При запуске увидим:
arguments
содержит параметры wrapper-функцииthis
ссылается на module.exports
Из исходников Node.js (lib/internal/modules/cjs/loader.js):
const wrapper = [
'(function (exports, require, module, __filename, __dirname) { ',
'\n});'
];
function wrap(script) {
return wrapper[0] + script + wrapper[1];
}
Это явно показывает, что весь код модуля оборачивается в функцию.
Любая функция в JavaScript может быть преобразована в строку:
// checkWrapper.js
const wrapper = function(module, exports, require, __filename, __dirname) {
console.log('Module code wrapper:', wrapper.toString());
};
wrapper();
Вывод покажет стандартную обертку модуля.
Каждый модуль имеет собственный scope благодаря замыканию:
// moduleA.js
var secret = 123;
// moduleB.js
console.log(typeof secret); // undefined
Это доказывает изоляцию через function scope.
Через module
API можно увидеть обернутый код:
const fs = require('fs');
const module = require('module');
const original = fs.readFileSync(__filename, 'utf8');
const wrapped = module.wrap(original);
console.log(wrapped);
Запустим Node.js с флагом --inspect
и исследуем:
arguments
require
, module
и др.)Это фундаментальный механизм системы модулей CommonJS в Node.js, обеспечивающий изоляцию и повторную используемость кода.