Javascript ES6模块导入是否执行导入文件中的代码?

Javascript ES6模块导入是否执行导入文件中的代码?,javascript,ecmascript-6,Javascript,Ecmascript 6,js文件中的代码是否在导入期间运行?如果是,那么是一次还是每次? e、 g 是的,确实有一次 见: 如果此模块已评估,则不执行任何操作。否则,可传递地评估此模块的所有模块依赖项,然后评估此模块 如果有人正在使用带有“模块”:“es6”的TypeScript并想知道如何执行此操作,请使用全局此关键字: function outputMsg(msg: string) : void { console.log(msg); } // export function for global sco

js文件中的代码是否在导入期间运行?如果是,那么是一次还是每次? e、 g


是的,确实有一次

见:

如果此模块已评估,则不执行任何操作。否则,可传递地评估此模块的所有模块依赖项,然后评估此模块


如果有人正在使用带有
“模块”:“es6”
的TypeScript并想知道如何执行此操作,请使用
全局此
关键字:

function outputMsg(msg: string) : void {
    console.log(msg);
}

// export function for global scope
globalThis.outputMsg = outputMsg;
然后像往常一样在Chrome DevTools控制台中调用
outputMsg(“我的控制台输出”)
,它会自动完成并运行您的功能

您还可以重命名“全局导出”:


然后在控制台中呼叫myCrazyFunc(“疯狂消息”)。

接受的答案不完全正确。一个已安装的模块在导入时将执行一次,是的,但如果该模块已安装多次(在节点中很容易执行),那么它将执行与已安装相同的次数

考虑一下如果a.jsb.jsc.js分别位于三个独立的包中(package\u apackage\u bpackage\u c都指定package\u a作为依赖项,会发生什么情况,并且您的项目指定了包b包c

node_modules/
├── package_b/
│   └── node_modules/
│       └── package_a/
|           └── a.js
└── package_c/
    └── node_modules/
        └── package_a/
            └── a.js
由于包a将安装两次(就您的项目而言,这是两个完全不同的包),因此a.js中的代码将被导入,并因此执行两次

许多在这个问题上发言的人不太可能意识到node的这种怪癖,但如果他们在这个问题上发言,他们可能需要意识到


这是一篇关于npm如何以及为什么这样做的更详细的老文章。

我只能结合webpack来测试它。执行是默认浏览器行为(在规范中定义)。这是可以使用的还是反模式?(谢谢,我更正了括号)@user2520818:“如果此模块已经评估过,请不要执行任何操作。否则,请传递地评估此模块的所有模块依赖项,然后评估此模块。”web pack无需对此进行测试。例如,您可以使用babel节点运行它。这不是反模式。这就是它的工作方式。目前,它可能在您最喜欢的浏览器中工作,也可能不工作,但任何执行它的环境都会以这种方式执行。感谢@FelixKling,它无耻地窃取了您的链接。与“为什么您只是尝试,它会乱来”相比,“它保证每次都有这种行为,没有例外”;)非常感谢大家!!!最后,我有一个答案!!!
globalThis.myCrazyFunc = outputMsg;
node_modules/
├── package_b/
│   └── node_modules/
│       └── package_a/
|           └── a.js
└── package_c/
    └── node_modules/
        └── package_a/
            └── a.js