# module.exports和exports的区别

module.exportsexports属于commonjs语法的一部分。使用它们可以导出模块内容,在另一个文件里使用require引用。

很简单一个例子:

a.js文件:

var sayHello = function(){
  return 'hello';
};
exports.sayHello = sayHello;
exports.name = 'abc';

console.log(module.exports); //{ sayHello: [Function: sayHello], name: 'abc' }
console.log(exports);
console.log(exports === module.exports);//true

从这里看出,module.exportsexports是相等的。其实,exports就是module.exports的一个引用。这俩是等价的:

exports.name = 'abc';
module.exports.name = 'abc';

b.js文件:

const test = require('./a');
console.log(test);

console.log(test.name); //abc
console.log(test.sayHello()); //hello

WARNING

require引入的对象,本质上是module.exports,而非exports

比如,在a.js中添加一句:






 





var sayHello = function(){
  return 'hello';
};
exports.sayHello = sayHello;
exports.name = 'abc';
module.exports = sayHello;

console.log(module.exports);  //[Function: sayHello]
console.log(exports); // { sayHello: [Function: sayHello], name: 'abc' }
console.log(exports === module.exports);//false

所以,这俩同时存在时,exports就会失效,b.js文件就会报错。

TIP

根据经验,代码风格统一使用module.exports就好。实在不行,一个文件内只使用一个,不要混用。