exports是module.exports的引用,即var exports = module.exports。在一個模塊的開頭,這兩個值都指向同一個空對象:exports = module.exports={}。所以,exports只是后者的引用。這篇文章中,我們將通過三個例子,探究這兩者的關系和區別。
一. 模塊默認返回的是module.exports,即便你在自定義的模塊中明確寫出return exports,真正返回的仍然是module.exports。例如:
//a.js
var a =100; exports=a;//module.exports={}, exports=a return exports;//明確寫出返回exports
剛開始的時候,exports和module.exports相等(值是空對象的地址),但是后來exports又被賦值了一個變量a(值等於a),這樣exports和module.exports就不是一回事了(給對象的引用賦值,不會改變原來的對象)。
//b.js
var modA = require('./a'); console.log(modA) // {}
返回的是空對象,說明a.js返回的值是module.exports而不是exports。
二.在exports上添加屬性也同樣會添加在module.exports上:
var a=100; exports.a = a;//相當於給exports/module.exports添加了一個屬性a
這時候,給exports添加a屬性,也就相當於給module.exports添加了a屬性。
var modA = require("./a"); console.log(modA) //{a:100}//可以拿到exports上的a屬性
三.只要直接給module.exports賦值,exports上的各種賦值就會失效
var a =100;
exports.a =a;//exports={a:a}, module.exports = {a:a} module.exports = function(){ console.log("can be output") } //module.exports指向新的內存空間,返回的是函數
從以上三個例子我們可以得到兩點結論:
1. 模塊輸出默認是module.exports,
2. 一旦直接賦值給module.exports或者exports,它們就代表不同的變量,此情況下,只有對module.exports的賦值才能被正常輸出。