看了很多博客,对module.exports和exports的区别的解释有点乱。写个demo感受下吧。module.exports和exportsconsole.log(module)的默认值;//Module{id:'.',exports:{},...}console.log(exports);//{}可以看到模块。exports和exports的默认值都是空对象(对象是引用类型!)foo.jsexports.foo='exportscalledme';console.log(module.exports);//{foo:'exports叫我'}console.log(exports);//{foo:'exportscalledme'}module.exports.foo='modulecalledme';console.log(module.exports);//{foo:'模块调用}console.log(exports);//{foo:'modulecalledme'}main.jsvarfoo=require('./foo');console.log(foo);//{foo:'modulecallsme'}结论:require调用的是module.exports中的值,exports是module.exports的引用,两者调用同一个内存地址。foo.jsexports='出口叫我';console.log(module.exports);//{}console.log(导出);//{foo:'exportscalledme'}main.jsvarfoo=require('./foo');console.log(foo);//{}如果对引用类型理解不够深入,直接给exports赋值。它会导致exports被另一个内存地址替换,module.exports和exports之间的连接会中断。但是你想让它们赋相同的值,你可以这样做。foo.jsexports='exportscalledme';module.exports=exports;console.log(module.exports);//{foo:'exports叫我'}console.log(exports);//{foo:'exportscalledme'}两者再次具有相同的值。因为栗子中使用的字符串是普通类型,也就是说每次改值都要用module.exports=exports;重新同步值。所以还是不建议export='exportscalledme';这样赋值比较方便,保留初值的对象形式或者自己赋值给一个引用类型。弟无才无学,解说颇啰嗦。这也是我第一次写。如果有任何遗漏,请告诉我。非常感谢。
