You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 16:20:15