很早之前我就对exports
和module.exports
之间的区别产生了好奇,因为用起来感觉不出什么区别但却又是不同的用法。实际上,exports
是module.exports
的引用。
换句话说,模块最终返回的是module.exports
给调用者而不是exports
。
用图举例说明,一开始exports
跟module.exports
一样指向一个空对象
如果我们想对外暴露一个函数,例如:
function foo(){
console.log('hello world');
}
module.exports.foo = foo;
那么这个时候就变成了下图:
因为exports
是module.exports
的引用,所以到现在为止,这两个所代表的都还是同一个对象。
但是,如果当我让module.exprots
指向其他的对象,那么情况就不一样了,例如:
function foo(){
console.log('hello world');
}
module.exports.foo = foo;
let myObject = {};
module.exports = myObject;
这段代码相当于在之前的代码之后为module.exports
重新赋了值。那么现在,两个模块的关系如下图:
可以看出这时exports
和module.exports
指向了不同的对象,这也说明了exports
就是module.exports
的引用。