看了好多篇博客,对于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调用了我';这样去赋值,保留初始值的对象形式或者本身赋值成引用类型对使用会比较方便。
小弟才疏学浅,讲解较为啰嗦,亦是初次写之,如有疏漏,妄不吝赐教,特此感谢。