从Node模块导入函数时,模块顶级代码为何会自动执行?
该行为属于Node.js模块系统的预期行为
是的,这个现象完全符合Node.js ES模块系统的设计规则。
当你从一个模块导入内容时,Node.js会完整加载、解析并执行整个模块文件,并非只提取你需要的导出成员。模块的顶级代码(比如全局的console.log、变量声明、初始化逻辑等)会在模块首次被导入时执行一次——这是因为模块必须先完成自身的初始化,才能生成可供外部使用的导出成员。
结合你的代码示例来看:
main.js中的console.log('running main.js')属于模块顶级代码,当tester.js导入add_numbers函数时,Node.js会先执行main.js的所有顶级代码,所以会先输出running main.js;- 等
main.js执行完毕、导出成员准备好后,才会继续执行tester.js自身的代码,输出后续内容。
另外补充:模块的顶级代码只会执行一次,哪怕其他模块多次导入同一个模块,Node.js也会缓存已加载的模块,不会重复执行初始化逻辑。
运行tester.js的输出:
$ npm run tester > demo-import-from-main@1.0.0 tester > node ./tester.js running main.js tester.js start. tester.js. add numbers result:60
代码示例:
main.js
console.log(`running main.js`); export function add_numbers( v1, v2 ) { return v1 + v2; }
tester.js
import { add_numbers } from "./main.js"; console.log(`tester.js start.`); const res = add_numbers(25, 35); console.log(`tester.js. add numbers result:${res}`);
package.json配置:
{ "name": "demo-import-from-main", "version": "1.0.0", "type": "module", "description": "demo that importing function from node module causes module level code to also run in the module.", "main": "./server.js", "scripts": { "main": "node ./main.js", "tester": "node ./tester.js" } }
内容的提问来源于stack exchange,提问作者RockBoro
相关产品推荐
相关产品推荐

