在这个页面(http://docs.nodejitsu.com/articles/getting-started/what-is-require)上,它声明“如果你想将exports对象设置为一个函数或一个新对象,你必须使用模块。出口对象。”
我的问题是为什么。
// right
module.exports = function () {
console.log("hello world")
}
// wrong
exports = function () {
console.log("hello world")
}
我的控制台。记录结果(result=require(example.js)),第一个是[Function],第二个是{}。
你能解释一下背后的原因吗?我读了这篇文章:模块。出口vs Node.js中的出口。它是有帮助的,但并没有解释为什么它是这样设计的。如果直接退回出口的参考资料会有问题吗?
Node是这样做的:
module.exports = exports = {}
模块。Exports和Exports引用同一个对象。
这样做只是为了方便。
所以不像这样写
module.exports.PI = 3.14
我们可以写
exports.PI = 3.14
因此,向exports添加属性是可以的,但将其分配给不同的对象是不可以的
exports.add = function(){
.
.
}
这是可以的,和module.exports.add = function(){…}一样
exports = function(){
.
.
}
这是不正确的,并且空对象将作为模块返回。Exports仍然引用{},Exports引用不同的对象。
还有一件事可能有助于理解:
math.js
this.add = function (a, b) {
return a + b;
};
client.js
var math = require('./math');
console.log(math.add(2,2); // 4;
很好,在这种情况下:
console.log(this === module.exports); // true
console.log(this === exports); // true
console.log(module.exports === exports); // true
因此,默认情况下,"this"实际上等于module.exports。
但是,如果您将实现更改为:
math.js
var add = function (a, b) {
return a + b;
};
module.exports = {
add: add
};
在这种情况下,它可以正常工作,但是,“this”不等于module。不再导出,因为创建了一个新对象。
console.log(this === module.exports); // false
console.log(this === exports); // true
console.log(module.exports === exports); // false
现在,require返回的是模块中定义的东西。出口,不再是这个或出口。
另一种方法是:
math.js
module.exports.add = function (a, b) {
return a + b;
};
Or:
math.js
exports.add = function (a, b) {
return a + b;
};