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 一个道理

上一篇下一篇

猜你喜欢

热点阅读