其实说起两者的区别也很简单 ,今天这个只是给自己和刚开始node的新手解释,大佬们不喜勿喷啊。
exports和module.exports区别
-
解释之前先铺一个小例子
var a ={name:'lihua'}; var b = a; console.log(a); console.log(b); b.name = 'zhangsan'; console.log(a); console.log(b); var b= {name:'lisi'}; console.log(a); console.log(b)//结果 { name: 'lihua' } { name: 'lihua' } { name: 'zhangsan' } { name: 'zhangsan' } { name: 'zhangsan' } { name: 'lisi' }来分析一波吧!开始var了一个对象a,b是对a的引用。也就是说a和b此时指向同一块内存,当改变b.name时,还是指向的那块内存,改变了那块内存里的内容,所以a也发生了改变。当b被覆盖时(var b= {name:'lisi'}),b也就指向了一块新的内存,所以最后结果不同。
-
当一个node.js文件执行时 ,会创建一个module对象,同时module对象会创建一个exports属性,初始化的值是
module.exports = {}; -
如果希望模块成为一个传统的模块实例,也就是 exports.xxx=xxx 这种情况下可以直接使用exports导出
这时exports.xxx就像开始例子中的直接改变b.name的情况,随着exports 的改变module.exports也改变
-
但是如果希望模块是一个特别的类型(我称它是覆盖式类型) ,引用时 直接就像下面这样,就必须使用module.exports了,不能只用exports。因为如果只是用exports就像开始例子中 var b= {name:'lisi'};b直接被覆盖,它此时指向就和module.exports不同了 。结果也就不同了
const {rmbToDollar,dollarToRmb} = require('./currency/currency'); console.log(rmbToDollar(6)); console.log(dollarToRmb(1)); -
为甚么非要两者相同 ,因为module.exports才是真正的接口,exports只不过是它的一个辅助工具。require引用时最终返回调用的是module.exports而不是exports。