module.exports和exports的区别
- 在nodejs中使用CommonJs导出数据有两种方式:
//方式一
exports.name = "test"
exports.age = 22
//方式二
module.exports = {
name: "test",
age: 22
}
这时有人会有疑惑,为什么不能直接给exports赋值对象导出呢:
//不能导出
exports = {
name: "test",
age: 22
}
让我们接着往下看
- node导出时内部实现是:
//两者指向同一块内存空间
module.exports = {};
exports = module.exports;
//最后导出module.exports
虽然有两种导出方式,本质上导出的是module.exports
- 当我们给module.exports赋值新对象时,例如:
module.exports = {
name: 'test',
age: 22
}
因为导出的是module.exports,所以可行。
- 当我们给exports赋值新对象时,它与module.exports的连接就断开了。为什么会断开呢,因为本质上导出的是module.exports,当给exports重新赋值对象,exports就会指向新的一块内存空间,就和要导出的module.exports的指向不在同一块空间上,所以exports就不能直接赋值对象导出。
- 当我们直接给exports增加属性时,例如:
//可行
exports.name = "test"
这样是可以的,因为此时它和module.exports指向的是同一块内存空间,这样的操作就相当于给module.exports增加属性,导出的是module.exports,属性会在module.exports里被导出。
总结
- node模块化导出数据有两种方式,分别是exports.xxx和module.exports={},推荐使用module.exports。
- module.exports是node内部实现的,不是CommonJs的一部分,exports是CommonJs的。
- node可以用exports导出的原因是为了妥协CommonJs的规范。