module.exports 和 exports 的区别
2018-03-23 本文已影响0人
小毛蛋_
node 在编译每个文件时,都会自动生成一个 module 的全局变量,可以在这个文件中直接访问
// a.js
console.log(module)
//Module {
// id: '.',
// exports: {},
// parent: null,
// filename: 'E:\\myproject\\nodetest\\a.js',
// loaded: false,
// children: [],
// paths:
// [ 'E:\\myproject\\nodetest\\node_modules',
// 'E:\\myproject\\node_modules',
// 'E:\\node_modules' ] }
可以看到 exports 是 module 中的属性
其实在访问node文件时,为了方便导出,node在生成了 module 的同时,也同时生成一个引用
var exports = module.exports = {}
此时,exports 和 module.exports 时指向内存的同一处引用 so.
//a.js
console.log(exports === module.exports) //true
console.log(exports == module.exports) //true
exports.a = 1;
exports.b = 2;
coonsole.log(module.exports) // {a:1,b:2}
//exports 改变时 module.exports 也随着改变了
//b.js
var a = require('./a.js') //require 引入的是a.js中的module.js
console.log(a) //{a:1,b:2}
下面再看
exports.a = 3;
console.log(module.exports); //3
module.exports.a = 4;
console.log(module.exports); //4
exports.a = 5;
console.log(module.exports); //5
上面的例子没有上面问题,再使用时注意先后顺序就好
以上都没有问题,直到
//c.js
module.exports = {
a:1,
b:2
}
exports.a = 3;
//d.js
var c = require('./c.js')
console.log(c) //{a:1,c:3}
what ? 什么 怎么回事
引入的c ,不应该是{a:3,b:2},怎么没有改变
不时指向同一块内存吗?
记住,我前面说过,
exports 时modules 的一个引用,
require 时引用 moudle.exports
那么,当你 module.export={}的时候
此时,exports 时modules.exports 已经不是指向同一内存了,
所以在exports.a = 3; 时
module.exports 并没有改变
module.exports.a = 1;
module.exports.b = 2;
exports = function(){};
//此时,两个变量也已经没有联系了,
exports.a = 3;
console.log(module.exports) //{a:1,b:2}
//简单的例子
var obj = {exports:{a:1}};
var copyObj = obj.exports;
copyObj.a = 2;
console.log(obj) //{exports:{a:2}}
注意
obj.exports = {a:10}
copyObj.a = 2;
console.log(obj) //{exports:{a:10}}
与 上面的exports 和module.exports 一个道理