2012-05-08 4 views
1

В чем причина, что это работает:Node.js экспорта модуля

exports.foo = 'foo'; 

var bar = require('./foo'); 
console.log(bar); // {foo: 'foo'} 

но это не:

var data = { foo: 'foo' }; 
exports = data; 

var bar = require('./foo'); 
console.log(bar); // {} 
// expected {foo: 'foo'} 

ответ

1

Ну, во втором коде вы в основном перезапись объект экспорта. Поэтому, даже если бы ваш код работал, я думаю, что все остальные экспонаты будут уничтожены (перезаписаны) этим. Таким образом, возможно, узел имеет некоторый защитный механизм, чтобы избежать такого случая.

3

Вы можете исправить второй код, заменив exports = data; на module.exports = data;.

Причина, по которой первая не работает, заключается в том, что она назначает только exports другому объекту в пространстве имен модулей. В то время как последний заменяет значение exports на объекте module с вашим объектом data.

5

Попробую ответить на этот вопрос, как яваскрипта вопрос Пример кода

function a() {} 
a.prototype.foo = {test:"bar"} 
var d = new a(); 
var c = new a(); 
console.log(d.prototype ==== c.prototype) // Both c and d share the same prototype object 
d.foo.hai = "hello" 
console.log(d.prototype ==== c.prototype) // Still the they refer to the same 
d.foo = {im: "sorry"} 
console.log(d.prototype ==== c.prototype) // now they don't 

То же самое для узла

console.log(module.exports === exports);// true; They refer to the same object 
exports.a = {tamil: "selvan"} 
console.log(module.exports === exports);// true even now 

exports = {sorry: "im leaving"}; // overrides modules.exports 
console.log(module.exports === exports); //false now they don't 
console.log(module.exports); // {a: {tamil: "selvan"}} 
console.log(exports); // {sorry: "im leaving"} 

экспорта и module.exports не относятся к одному объекту ядра, пока вы переопределения как в объекте прототипа javsacript. В тот момент, когда вы переопределяете эталонные изменения.

module.exports = {something: "works"} Работает, потому что вы меняете свойство модуля, которому узел заботится при его кешировании.

Даже для вышеприведенного

module.exports === exports //is false they are no more the same

это доказывает, что наоборот тоже верно :)

более вещь module является ссылкой на текущий модуль, поэтому всегда предпочитают использовать module.exports чем exports

One
Смежные вопросы