Node.js中module.exports不符合预期:导出模块代码被全部执行
为什么Node.js模块里非导出函数的代码也会被执行?
这其实是Node.js模块加载机制的正常行为哦~当你用require()引入一个模块时,Node.js会完整执行整个模块文件里的所有代码,之后才把module.exports指向的内容返回给调用方,而不是只执行导出函数内部的代码。
结合你的代码来看:
- 当
test2.js里执行var test = require("./test")时,Node.js会先去运行test.js的全部代码:- 首先执行顶层的
console.log("Hello2"),所以先输出了Hello2; - 然后把你定义的函数赋值给
module.exports,这个函数才被返回给test2.js里的test变量;
- 首先执行顶层的
- 之后你调用
test(),才会执行函数内部的console.log("Hello"),输出Hello。
所以最终的输出顺序就是Hello2 Hello啦。
如果你想让Hello2只在调用导出函数时才执行,只需要把它移到函数内部就行:
// file: test.js module.exports = function () { console.log("Hello"); console.log("Hello2"); // 现在只有调用test()时才会执行这行 }
另外,如果有些代码你只想在直接运行该模块文件(比如node test.js)时执行,而被其他文件require时不执行,可以用require.main === module来判断:
// file: test.js module.exports = function () { console.log("Hello"); } // 只有直接运行node test.js时才会执行这部分 if (require.main === module) { console.log("Hello2"); }
内容的提问来源于stack exchange,提问作者betzebube1000
相关产品推荐
相关产品推荐

