module.exports против экспорта в Node.js - PullRequest
671 голосов
/ 21 августа 2011

Я нашел следующий контракт в модуле Node.js:

module.exports = exports = nano = function database_module(cfg) {...}

Интересно, в чем разница между module.exports и exports и почему оба используются здесь.

Ответы [ 21 ]

0 голосов
/ 09 января 2014

в файле js module.js узла используется для запуска system.load system.load. Каждый раз, когда узел выполняет файл, он оборачивает содержимое вашего файла js следующим образом:

'(function (exports, require, module, __filename, __dirname) {',+
     //your js file content
 '\n});'

из-за этого переноса внутри urjs исходный код, к которому вы можете получить доступ к 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

export is [object Object]

object.keys из foo: name is function () {console.log ('function to module export')} функция для экспорта в модуль

теперь удалите закомментированную строку в a.js и закомментируйте строку над этой строкойи удалите последнюю строку b.js и запустите.

в мире javascript вы не можете переназначить объект, переданный в качестве параметра, но вы можете изменить открытый член функции, когда объект этой функции задан в качестве параметра другой функции

помните

используйте module.exports on и только если вы хотите получить функцию при использовании ключевого слова require.в приведенном выше примере мы var foo = require (a.js);вы можете видеть, что мы можем вызывать foo как функцию;

это то, как документация узла объясняет это "Объект экспорта создается системой модуля. Иногда это не приемлемо, многие хотят, чтобы их модуль был экземпляромнекоторый класс. Для этого назначьте нужный объект экспорта для module.exports. "

...