結(jié)論:exports是module.exports的引用,初始化為:exports = module.exports = {},即exports和module.exports指向同一個對象。但是require函數(shù)執(zhí)行后只返回module.exports深浮。
為了驗證上面的結(jié)論松却,我們來看下面兩個例子:
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();
然后執(zhí)行node app.js你會得到如下結(jié)果:
{ greet: [Function] }
{ greet: [Function] }
hello node.
因為exports和module.exports指向同一個對象,當(dāng)通過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();
然后執(zhí)行node app.js专执,結(jié)果如下:
{}
{ greet: [Function] }
hello node.
為什么會得到上面結(jié)果呢淮捆?greet.js中module.exports被重寫,指向了一個函數(shù)本股。這就導(dǎo)致exports和module.exports分別指向不同的對象攀痊,而且require函數(shù)執(zhí)行時module.exports被返回。