node 中module.exports和exports的关系
- 首先要知道
module.exports
和exports
都是CommandJS
的导出模块规范 - 模块中存在一个
module
对象,代表模块自身,module
对象有个exports
属性,用于数据的导出 exports === module.exports
两者之间是全等的关系- 例子
obj
对应着的是module
hobby
对象相当于模块中的exports
aihao
就是exports
,aihao
的指向还是原来的obj
对象中的指向- 只是为了以后调用方便就将
obj.hobby
直接使用aihao
代替,这个时候aihao
和obj.hobby
还是全等的关系,aihao === obj.hobby // true
let obj = { name: "小火车", hobby: {} } let aihao = obj.hobby aihao.age = 8 console.log(obj) // { name: '小火车', hobby: { age: 8 } }
- 注意如果使用了
aihao = 123
就相当于直接改变了aihao
的指向,这个时候的aihao
和obj.hobby
没有关系了aihao === obj.hobby // false
let obj = { name: "小火车", hobby: {} } let aihao = obj.hobby aihao = 8 console.log(obj) // { name: '小火车', hobby: {} } console.log(aihao === obj.hobby) // false
- 如果直接使用
exports
赋值的方法导出模块 错误方式exports = age
// 模块的写法 const age = 8 exports = age // 接收模块 const ex = require("./ex") console.log(ex) // {}
- 所以在使用
exports
的时候不可以直接使用赋值的方法,对象点属性值才是正确方法exports.data = age
// 模块的写法 const age = 8 exports.data = age // 接收模块 const ex = require("./ex") console.log(ex) // { data: 8 }
- 但是使用
module.exports
的时候可以直接赋值,因为原本的数据执行不会发生变化// 模块的写法 const age = 8 module.exports = age // 接收模块 const ex = require("./ex") console.log(ex) // 8
总结:exports
只是module
的一个属性,主要就是使用过程中需要注意如果直接对exports
采用赋值的方法导出模块的话,得到的只会是一个空的对象{}
,所以一般在使用过程中都是直接使用module.exports
导出模块