Node.js module.exports 与 exports 区别详解
本文深入解析Node.js中module.exports与exports的关系及区别。通过源码机制说明二者默认指向同一对象,并对比四种赋值场景下的导出结果。重点阐述直接赋值给exports导致导出失效的原理,帮助开发者避免模块导出错误。
概述
module:每个模块内部均包含module对象,用于存储当前模块的相关信息;module.exports:用于定义模块向外导出的内容;exports:在默认状态下,exports与module.exports指向同一对象实例。
代码示例
test.js
console.log('module', module)
console.log('module.exports', module.exports)
console.log('exports', exports)
console.log('module.exports === exports', module.exports === exports)在终端运行 node test.js,输出日志如下:
module Module {
id: '.',
path: 'E:\lin\webpack-learning\src\cjs\demo1',
exports: {},
filename: 'E:\lin\webpack-learning\src\cjs\demo1\test.js',
loaded: false,
children: [],
paths: [
'E:\lin\webpack-learning\src\cjs\demo1\node_modules',
'E:\lin\webpack-learning\src\cjs\node_modules',
'E:\lin\webpack-learning\src\node_modules',
'E:\lin\webpack-learning\node_modules',
'E:\lin\node_modules',
'E:\node_modules'
]
}
module.exports {}
exports {}
module.exports === exports true源码解析
github.com/nodejs/node…

const exports = this.exports;
const thisValue = exports;
const module = this;关键点:exports 实质上是 module.exports 的引用
实例解析
案例一
test1.js
exports.name = 'lin';
module.exports.age = 18;
console.log('module.exports', module.exports)
console.log('exports', exports)
console.log('module.exports === exports', module.exports === exports)index.js
const test = require('./test1')
console.log("test", test);终端运行 node index.js,输出日志如下:
module.exports { name: 'lin', age: 18 }
exports { name: 'lin', age: 18 }
module.exports === exports true
test { name: 'lin', age: 18 }结构图示:

案例二
test2.js
module.exports.name = 'lin'
exports = {
name: 'myName',
age: 6
}
console.log('module.exports', module.exports)
console.log('exports', exports)
console.log('module.exports === exports', module.exports === exports)index.js 调整为引入 test2.js 模块
const test = require('./test2')
console.log("test", test);终端运行 node index.js,输出日志如下:
module.exports { name: 'lin' }
exports { name: 'myName', age: 6 }
module.exports === exports false
test { name: 'lin' }结构图示:

案例三
test3.js
module.exports = {
name: 'lin',
age: 18
}
exports.name = "myName"
console.log('module.exports', module.exports)
console.log('exports', exports)
console.log('module.exports === exports', module.exports === exports)index.js 调整为引入 test3.js 模块
const test = require('./test3')
console.log("test", test);终端运行 node index.js,输出日志如下:
module.exports { name: 'lin', age: 18 }
exports { name: 'myName' }
module.exports === exports false
test { name: 'lin', age: 18 } 结构图示:

案例四
test4.js
exports = {
name: 'lin',
age: 18
}
module.exports = exports
module.exports.job = 'FE'
console.log('module.exports', module.exports)
console.log('exports', exports)
console.log('module.exports === exports', module.exports === exports)index.js 调整为引入 test4.js 模块
const test = require('./test4')
console.log("test", test);终端运行 node index.js,输出日志如下:
module.exports { name: 'lin', age: 18, job: 'FE' }
exports { name: 'lin', age: 18, job: 'FE' }
module.exports === exports true
test { name: 'lin', age: 18, job: 'FE' }结构图示:

总结
exports是module.exports的引用;- 对
exports和module.exports进行赋值时需格外谨慎,务必明确模块最终导出的值; - 当使用
require()导入模块 A 时,所得结果是模块 A 中module.exports所指向的值。
至此,关于Node.js中module.exports与exports区别的介绍已结束,更多关于Node.js exports的内容可查阅本站往期文章或继续浏览后续文章,感谢大家的支持!
Node.js 安装配置与第一个 HTTP 服务器编写
2026-11-05 11:41:40
怎么使用 nvm 管理并平滑升级 Node.js 版本
2026-11-04 23:15:07
Node.js 怎么使用 zlib 模块解压 gzip 和 deflate
2026-11-03 23:40:50
直接覆盖安装还是用版本管理器?Node.js 升级方式对比
2026-11-03 22:59:07
Express.js 是什么:Node.js Web 框架核心概念与适用场景
2026-11-03 20:00:12
