в узле js файл module.js используется для запуска module.load system.every, каждый раз, когда узел выполняет файл, он переносит содержимое файла js следующим образом
'(function (exports, require, module, __filename, __dirname) {',+
//your js file content
'\n});'
Из-за этого переноса в исходный код ur js вы можете получить доступ к export, require, module и т. д., этот подход используется, потому что нет другого способа передать функции, записанные в js-файле, в другой.
затем узел выполняет эту упакованную функцию, используя c ++. в этот момент объект экспорта, переданный в эту функцию, будет заполнен.
Вы можете увидеть внутри этой функции параметры экспорта и модуля. на самом деле export является открытым членом функции конструктора модуля.
посмотрите на следующий код
скопируйте этот код в b.js
console.log("module is "+Object.prototype.toString.call(module));
console.log("object.keys "+Object.keys(module));
console.log(module.exports);
console.log(exports === module.exports);
console.log("exports is "+Object.prototype.toString.call(exports));
console.log('----------------------------------------------');
var foo = require('a.js');
console.log("object.keys of foo: "+Object.keys(foo));
console.log('name is '+ foo);
foo();
скопируйте этот код в a.js
exports.name = 'hello';
module.exports.name = 'hi';
module.exports.age = 23;
module.exports = function(){console.log('function to module exports')};
//exports = function(){console.log('function to export');}
Теперь запустить с использованием узла
это выход
module is [object Object]
object.keys id,exports,parent,filename,loaded,children,paths
{}
true
экспорт является [объект объекта]
object.keys из foo: name is function () {console.log ('функция для экспорта в модуль')} функция для экспорта в модуль
Теперь удалите закомментированную строку в a.js и закомментируйте строку над этой строкой, удалите последнюю строку b.js и запустите.
в мире javascript вы не можете переназначить объект, переданный в качестве параметра, но вы можете изменить открытый член функции, когда объект этой функции задан в качестве параметра другой функции
помнишь
Используйте module.exports и только в том случае, если вы хотите получить функцию при использовании ключевого слова require. в приведенном выше примере мы var foo = require (a.js); вы можете видеть, что мы можем вызвать foo как функцию;
Вот как это объясняется в документации узла: «Объект экспорта создается системой Module. Иногда это неприемлемо, многие хотят, чтобы их модуль был экземпляром некоторого класса. Для этого назначьте нужный объект экспорта для module.exports.»