module.exports和exports的区别 - pod4g/tool GitHub Wiki

这两个的区别,只要知道下面两点就够了

  1. 首先两者指向的是同一个对象
console.log(exports === module.exports) // true
  1. 其次导出的永远都是module.exports所指向的对象
// a.js
exports = ['a.js']

// b.js
module.exports = ['b.js']

// c.js
module.exports.c = ['c.js']

// d.js
exports.d = ['d.js']


// index.js
const a = require('./a')
const b = require('./b')
const c = require('./c')
const d = require('./d')

console.log(a) // {} ,注意:并不是['a.js'],原因见下面的说明
console.log(b) // ['b.js']
console.log(c) // {c: ['c.js']}
console.log(d) // {d: ['d.js']}

因为导出的对象永远都是module.exports所指向的对象,所以就会造成当 exports = ['a.js']的时候,这个['a.js'],并不会被导出,因为exports虽然指向了一个新对象['a.js'],但是module.exports并没有指向它

那么既然有了module.exports为什么要定义exports别名呢?这是为了解决下面的问题:

 // 如果没有别名的话,我们必须要这样写
 module.exports.c = ['c.js']
 // 现在有了别名,我们只需这样写就好了
 exports.c = ['c.js']

其实理由很朴素,就是为了少写module. 这几个字符而已