node 在編譯每個(gè)文件時(shí)逻杖,都會(huì)自動(dòng)生成一個(gè) module 的全局變量煤痕,可以在這個(gè)文件中直接訪問(wèn)
// 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 中的屬性
其實(shí)在訪問(wèn)node文件時(shí)涎劈,為了方便導(dǎo)出缤削,node在生成了 module 的同時(shí)瘦棋,也同時(shí)生成一個(gè)引用
var exports = module.exports = {}
此時(shí),exports 和 module.exports 時(shí)指向內(nèi)存的同一處引用 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 改變時(shí) 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
上面的例子沒(méi)有上面問(wèn)題鲜棠,再使用時(shí)注意先后順序就好
以上都沒(méi)有問(wèn)題肌厨,直到
//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 ,不應(yīng)該是{a:3,b:2},怎么沒(méi)有改變
不時(shí)指向同一塊內(nèi)存嗎豁陆?
記住柑爸,我前面說(shuō)過(guò),
exports 時(shí)modules 的一個(gè)引用,
require 時(shí)引用 moudle.exports
那么盒音,當(dāng)你 module.export={}的時(shí)候
此時(shí)表鳍,exports 時(shí)modules.exports 已經(jīng)不是指向同一內(nèi)存了,
所以在exports.a = 3; 時(shí)
module.exports 并沒(méi)有改變
module.exports.a = 1;
module.exports.b = 2;
exports = function(){};
//此時(shí)祥诽,兩個(gè)變量也已經(jīng)沒(méi)有聯(lián)系了譬圣,
exports.a = 3;
console.log(module.exports) //{a:1,b:2}
//簡(jiǎn)單的例子
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 一個(gè)道理