Node.js中未赋值module.exports时,require()返回值是什么?
关于Node.js中require未导出模块的返回值问题
这个问题我之前排查模块依赖的时候也遇到过,一开始也有点困惑,后来翻了Node.js的CommonJS模块规范和源码逻辑才彻底搞清楚——标准情况下,当你require一个没有对exports或module.exports做任何赋值的文件时,返回值一定是空对象{},绝不会是undefined。
为什么默认是空对象?
Node.js在加载任何CommonJS模块时,都会自动完成以下初始化步骤:
- 创建一个
module对象,其中module.exports属性默认被初始化为空对象{} - 创建一个
exports变量,让它指向module.exports的引用(相当于const exports = module.exports)
只要你在模块里没有修改过module.exports,也没有给exports重新赋值(注意:给exports添加属性不算修改引用,比如exports.foo = 'bar'会同步到module.exports),那么require()最终返回的就是这个默认的空对象。
举个最简单的例子:
// no-export.js console.log('我是一个没有导出任何内容的模块'); // main.js const mod = require('./no-export.js'); console.log(mod); // 输出: {}
那为什么会看到返回undefined的情况?
如果你确实遇到了返回undefined的场景,大概率是模块里的代码显式修改了module.exports为undefined,比如:
// bad-module.js // 不小心把module.exports设成了undefined module.exports = undefined; // 或者通过逻辑赋值间接导致的 const shouldExport = false; if (shouldExport) { module.exports = { foo: 'bar' }; } else { module.exports = undefined; }
另外还有一种极端情况:模块加载过程中出现了未被捕获的错误,但这种情况Node.js通常会直接抛出异常,而不是返回undefined。
总结一下
- 未修改
exports/module.exports的模块,require()的标准返回值是空对象{} - 出现
undefined一定是模块代码主动将module.exports设置为undefined导致的,不属于默认行为
内容的提问来源于stack exchange,提问作者Panu Logic
相关产品推荐
相关产品推荐

