JS 中的 Importing(require) 模块是否也执行整个代码?

co_*_*lin 2 javascript module export node.js

让 moduleFile.js 为

const calc = {
    add(a,b) = {return a+b},
    sub(a,b) = {return a-b}
}

console.log(`hello from module`);

exports.calcModule = calc;
Run Code Online (Sandbox Code Playgroud)

并让 main.js 与 moduleFile.js 位于同一目录中

const { calcModule } = require(`./moduleFile`);

console.log(calcModule.add(1,2));
Run Code Online (Sandbox Code Playgroud)

当我在控制台中执行时main.js结果$ node main.js

hello from module
3
Run Code Online (Sandbox Code Playgroud)

我很难理解hello from module也打印出来的。
导入模块是否包括执行整个模块文件?

jfr*_*d00 6

是的。第一次使用 加载 CommonJS 模块时require(),将执行任何顶级代码。正如您所看到的,情况必须如此,以便exports.calcModule = calc运行并建立模块的导出,并且您console.log('hellow from module')也将运行。

加载后,该模块将被缓存,因此对该同一模块的任何其他调用都require()只会从该模块的原始执行中返回导出对象,并且顶级代码将不会再次运行。因此,无论模块在程序中加载多少次,顶层代码都只运行一次。

导入模块是否包括执行整个模块文件?

是的,它执行您正在加载的模块中的所有顶级代码。