1.模块的导入与导出
导入:require(xxx.js)
导出:
-
exports
exports.a = 1 exports.b = 2
-
module.exports
module.exports.a = 1 module.exports = {a:1,b:2}
区别:module.exports可以直接赋值,例如module.exports=1
,而exports不能直接赋值
module.exports = 1//right
exports = 1//err
2.exports与module.exports的区别
在模块导入导出的过程中,node底层为每个js文件都创建了一个名为module的对象,module对象中有一个含有一个名为exports的成员变量
module:{
exports:{},
....
}
并且在每个js文件末尾,node都为我们添加了以下代码
return module.exports
每当我们通过require导入模块时,上面的语句就会执行,所以我们导入的模块是其实就是module.exports对象
exports
与module.exports
都指向同一个地址值
console.log(exports === module.exports)//true
export是对module.exports的引用,即
var exports = module.exports
所以,exports和module.exports是等价的,为了减少代码的冗余,我们可以使用exports代替module.exports
并且两者可以同时使用,例如
module.exports.a = 1
exports.b = 2
当我们引入上述模块时,会获得{a:1,b:2}
错误导出示例:
module.exports.a=1
exports.b=2
exports={}
exports.c=3
当我们引入上述模块时,我们拿到的对象为{a:1,b:2}
**原因:**程序执行exports={}
这段代码时,exports的指向已经发生了改变,此时exports与module.exports已经不再指向同一个对象,所以之后对exports的任何操作都无法改变module.exports所指向的值
完整示例:
foo.js
var test = require("./main.js")
console.log(test.add(1,2))//3
console.log(test.obj.a)//1
main.js
function add(x,y)
{
return x+y
}
let obj = {
a:1,
b:2
}
/*方式一*/
exports.add = add//将add函数赋值给exports.add
exports.obj = obj
/*方式二*/
module.exports = {add,obj}