require 用来加载代码,而 exports 和 module.exports 则用来导出代码。
exprots和module.exprots的区别
- module.exports 初始值为一个空对象 {}
- exports 是指向的 module.exports 的引用
- require() 返回的是 module.exports 而不是 exports
下面,我们根据例子来更清楚的了解他们的区别。
var module = {
exports:{
name:'我是module的exports属性'
}
};
var exports = module.exports;
console.log(module.exports); //{ name: '我是module的exports属性' }
console.log(exports); //{ name: '我是module的exports属性' }
exports.name = '我想改一下名字';
console.log(module.exports); //{ name: '我想改一下名字' }
console.log(exports); //{ name: '我想改一下名字' }
var sum = {
name:'我可以求和',
func:function (a,b) {
return a+b
}
};
exports = sum;
console.log(module.exports); //{ name: '我想改一下名字' }
console.log(exports); //{ name: '我可以求和', func: [Function] }
解释:module.exports
是一个对象,exports
是对 module.exports
的引用,即 module.exports
和 exports
指向同一块内存,所以前两个输出一样。当对 exports
作修改时,即 module.exports
和 exports
指向同一块内存地址的内容发生了改变,所以module.exports
也会体现出来,所以第三四个输出一样。当 exports
被覆盖时,exports
指向了一块新的内存,module.exports
还是指向原来的内存,所以最后两个输出不一样。
我们经常还看到这样的写法:
exports = module.exports = {...};
上面的代码等价于:
module.exports = {...};
exports = module.exports;
原理很简单:module.exports 指向新的对象时,exports 断开了与 module.exports 的引用,那么通过 exports = module.exports 让 exports 重新指向 module.exports。