问题描述
当D
执行模块,控制台将打印此消息:
A evaluated
A constructor
这意味着该A
模块仅被评估一次,即使它被其他模块多次导入也是如此。
的评估规则ES6 modules
与commonjs
格式相同:
ECMAScript 6规范的HostResolveImportedModule部分介绍了 的行为。 它提到:
如果此操作 (导入操作) 正常完成,则必须是幂等的。每次使用特定的referenceencingModule,说明符对 (从
导入_作为参数 )_ 调用它时,它必须返回相同的Module Record实例。
使用布尔标志在ModuleEvaluation的第4点和第5点中描述了模块的
的行为。 每个模块都有标志,可确保仅对模块代码进行一次评估。Evaluated
Evaluated
解决方法
比方说,我们有四个模块A
,B
,C
和D
在模块中A
:
console.log("A evaluated")
function AClass {
console.log("A constructor")
}
var aObj = new AClass()
export default aObj;
在模块中B
:
import aObj from A
export default "B"
在模块中C
:
import aObj from A
export default "C"
在模块中D
:
import b from B
import c from C
import aObj from A
因此,在D
评估模块时,将在控制台中打印A evaluated
和多少次A constructor
?
ES6标准中 描述了此行为吗?如果我希望一次仅评估一个模块而不论直接或间接导入多少次,该怎么办?有人对此有任何想法吗?