结论:exports是module.exports的引用,初始化为:exports = module.exports = {},即exports和module.exports指向同一个对象。但是require函数执行后只返回module.exports。
为了验证上面的结论,我们来看下面两个例子:
eg1:
greet.js:
exports.greet = function () {
console.log("hello node.");
};
console.log(exports);
console.log(module.exports);
app.js:
var Greet = require('./greet.js');
Greet.greet();
然后执行node app.js你会得到如下结果:
{ greet: [Function] }
{ greet: [Function] }
hello node.
因为exports和module.exports指向同一个对象,当通过exports修改这个对象后,module.exports指向的对象也会改变。
eg2:
greet.js:
module.exports = function() {
console.log("hello node");
};
console.log(exports);
console.log(module.exports);
app.js:
var greet = require('./greet.js');
greet();
然后执行node app.js,结果如下:
{}
{ greet: [Function] }
hello node.
为什么会得到上面结果呢?greet.js中module.exports被重写,指向了一个函数。这就导致exports和module.exports分别指向不同的对象,而且require函数执行时module.exports被返回。