具体解释可以往后看。
'use strict'
let app = { // 注册全局对象
    ...
}
... // 封装工具箱
exports = module.exports = app // 导出工具箱node.js执行文件,都自动创建一个module对象,同时,module对象会创建一个叫exports的属性,初始化的值是 {}。即:module.exports = {}exports是引用 module.exports的值module.exports,而不是exportsfoo.js
'use strict'
module.exports.sayHello = function(){
    console.log(this.name)
}
exports.name = 'foo.js' // exports引用module.exports的值test.js
'use strict'
let foo = require('./foo')
foo.sayHello()为了验证真正导出的是
module.exports而不是exports,我们对foo.js修改如下:
'use strict'
module.exports = {
    sayHello:function(){
        console.log(this.name)
    },
    name:'module.exports'
}
exports.sayHello = function(){
    console.log('exports')
}test.js的输出就是:module.exports。
因为module.exports的引用改变(js中对象的赋值都是引用),断开了和exports的连接,而真正导出的只是module.exports。
原文:https://www.cnblogs.com/geyouneihan/p/9127298.html