这是什么原因:
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'}
这是什么原因:
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'}
我将尝试将其作为 javascript 问题代码示例来回答
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"}
export 和 module.exports 引用相同的核心对象,直到您像在 javsacript 原型对象中那样覆盖。您覆盖参考更改的那一刻。
module.exports = {something: "works"}
有效,因为您正在更改节点在缓存时关心的模块的属性。
即使是以上
module.exports === exports //is false they are no more the same
这证明反之亦然:)
另一件事module
是对当前模块的引用,所以总是更喜欢module.exports
使用exports
exports = data;
您可以通过替换为来修复第二个代码module.exports = data;
。
前者不起作用的原因是它只分配给exports
模块名称空间中的另一个对象。而后者用您的对象替换对象exports
上的属性值。module
data
好吧,在第二个代码中,您基本上是在覆盖导出对象。因此,即使您的代码可以正常工作,我想所有其他导出都会被此破坏(覆盖)。因此,节点可能有一些保护机制来避免这种情况