关于commonjs的问题,求解答

// a.js
const test = require('./b.js')
test.getName() // 输出‘yzy’

// b.js
const getName = () => {
    console.log('yzy')
}
module.exports = {getName} // 此导出方式a文件能正确输出
exports = {getName} // 此导出方式a文件报错

我知道exports等价于 var exports = module.exports,但是我不能理解为什么直接exports = {getName} 就无法正常导出;
求解其中的原理,感谢了!

阅读 2.6k
3 个回答

就像楼上说的,你在执行exports = {getName}的时候,会切断module.exports与exports的引用关系,改变了exports的值,并不会影响到module.exports的值。而模块导出最终是需要拿module.exports的值

const module = { exports: {} }
let exports = module.exports

// 改变引用内的数据
module.exports.name = 1

console.log(module.exports, exports) // { name: 1 } { name: 1 }

// 改变引用内的数据
module.exports = 1

console.log(module.exports, exports)// 1 1

// 改变引用指向
exports = 2

console.log(module.exports, exports)// 1 2
let a = {}
let b = a;

a.name = 1

console.log(a, b) // { name: 1 } { name: 1 }

b = { name: 2 }

console.log(a, b) // { name: 1 } { name: 2 }

commonjs的原理是,将你要引入的文件进行头尾包装

(function(exports,module){

    ...你的模块代码

});

如果你直接exports = {getName} 导致参数 exports 的指向改变!外部将无法拿到正确的导出
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题