看了好多篇博客,對於module.exports和exports區別的解釋衆說紛紜有點迷糊,仍是本身寫demo來感覺一下吧。javascript
module.exports和exports的默認值java
console.log(module); //Module { id: '.', exports: {}, ...} console.log(exports); //{}
能夠看到module.exports和exports的默認值都是空對象(對象是引用類型!)ui
foo.jscode
exports.foo = 'exports調用了我'; console.log(module.exports); //{ foo: 'exports調用了我' } console.log(exports); //{ foo: 'exports調用了我' } module.exports.foo = 'module調用了我'; console.log(module.exports); //{ foo: 'module調用了我' } console.log(exports); //{ foo: 'module調用了我' }
main.js對象
var foo= require('./foo'); console.log(foo); //{ foo: 'module調用了我' }
結論:require調用的是module.exports當中的值,而exports則是module.exports的引用,二者調用的是同一個內存地址。ip
foo.js內存
exports = 'exports調用了我'; console.log(module.exports); //{} console.log(exports); //{ foo: 'exports調用了我' }
main.js字符串
var foo= require('./foo'); console.log(foo); //{}
若是你對引用類型的理解不夠深入,直接給exports賦值。會形成exports被另一個內存地址替換,也就中斷得了module.exports和exports的聯繫。同步
但你又想讓他們賦值相同,你能夠這麼作。
foo.js博客
exports = 'exports調用了我'; module.exports = exports; console.log(module.exports); //{foo: 'exports調用了我'} console.log(exports); //{ foo: 'exports調用了我' }
二者的值又相同。由於栗子裏用的是字符串,是普通類型,意味着每次改變值都得用module.exports = exports;去從新同步值。因此仍是不建議exports = 'exports調用了我';這樣去賦值,保留初始值的對象形式或者本身賦值成引用類型對使用會比較方便。
小弟才疏學淺,講解較爲囉嗦,亦是初次寫之,如有疏漏,妄不吝賜教,特此感謝。