看了好多篇博客,对于module.exports和exports区别的解释众说纷纭有点迷糊,还是自己写demo来感受一下吧。
module.exports和exports的默认值
console.log(module); //Module { id: '.', exports: {}, ...}
console.log(exports); //{}
可以看到module.exports和exports的默认值都是空对象(对象是引用类型!)
foo.js
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的引用,两者调用的是同一个内存地址。
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调用了我’;这样去赋值,保留初始值的对象形式或者自己赋值成引用类型对使用会比较方便。
小弟才疏学浅,讲解较为啰嗦,亦是初次写之,若有疏漏,妄不吝赐教,特此感谢。