Node.js中module.exports和exports的区别

看了好多篇博客,对于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调用了我’;这样去赋值,保留初始值的对象形式或者自己赋值成引用类型对使用会比较方便。

小弟才疏学浅,讲解较为啰嗦,亦是初次写之,若有疏漏,妄不吝赐教,特此感谢。

    原文作者:messchow
    原文地址: https://segmentfault.com/a/1190000015341604
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞