module中module.exports与exports的区别
发布于 9 年前 作者 Silence-Zhang 9734 次浏览 最后一次编辑是 8 年前 来自 分享

初学node,对此还比较困惑,就分析了几个应用场景.对于其中的内部结构和原理,还请大神们不吝赐教. 首先定义一个module为math.js,在test.js中引用此module. 一下为通过几个使用情景来阐述其中的不同: (1).正常情况下,定义和使用module中的实例. math.js:

exports.add=function(arg1,arg2){
	 return arg1+arg2;
};
exports.minus=function(arg1,arg2){
	 return arg1-arg2;
};
console.log(module);

test.js:

var math=require('./math.js');
console.log('math:'+math);
console.log(math.add(3,4));
console.log(math.minus(5,3));

控制台中信息: module:

{ id: '/home/chander-zhang/NodeJS/test/math.js',
  exports: { add: [Function], minus: [Function] },
  parent: 
   { ... },
  filename: '/home/chander-zhang/NodeJS/test/math.js',
  loaded: false,
  children: [],
  paths: 
   [ '/home/chander-zhang/NodeJS/test/node_modules',
     '/home/chander-zhang/NodeJS/node_modules',
     '/home/chander-zhang/node_modules',
     '/home/node_modules',
     '/node_modules' ] }

math:

[object Object]

此时math是一个对象. (2). math.js:

exports.add=function(arg1,arg2){
	 return arg1+arg2;
};
minus=function(arg1,arg2){
	 return arg1-arg2;
};
module.exports=minus;
console.log(module);

test.js:

var math=require('./math.js');
console.log('math:'+math);
//console.log(math.add(3,4));
console.log(math(5,3));  //相当于执行了 minus(5,3).

控制台中信息: module:

{ id: '/home/chander-zhang/NodeJS/test/math.js',
  exports: [Function],
  parent: 
   { ... },
  filename: '/home/chander-zhang/NodeJS/test/math.js',
  loaded: false,
  children: [],
  paths: 
   [ '/home/chander-zhang/NodeJS/test/node_modules',
     '/home/chander-zhang/NodeJS/node_modules',
     '/home/chander-zhang/node_modules',
     '/home/node_modules',
     '/node_modules' ] }

math:

function (arg1,arg2){
    return arg1-arg2;
}

如果使用math.add()math.minus()将会出错,因为此时math是一个函数. 即便module中出现了exports.add,由于为module.exports赋了值,也不能使用math.add(). (3). math.js:

add=function(arg1,arg2){
	 return arg1+arg2;
};
minus=function(arg1,arg2){
	 return arg1-arg2;
};
module.exports=add;
module.exports=minus;
console.log(module);

此时执行tes.js的情况和(2)中相同.如果module中出现多个module.exports,那最后一个会将前面的全部覆盖掉.所以math依旧是:

function (arg1,arg2){
    return arg1-arg2;
}

3 回复

@russj 讲的很清晰…

class Math {
 add (arg1,arg2){
     return arg1+arg2;
};
minus (arg1,arg2){
     return arg1-arg2;
}
}

es6以后是不是exports就没用了?

回到顶部