[英]In the `import` syntax of ES6, how is a module evaluated exactly?
假设我们有四个模块, 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标准中描述? 无论直接或间接导入多少次,如果我只想评估模块,我该怎么办? 有没有人对此有任何想法?
执行D
模块时,控制台将打印此消息:
A evaluated
A constructor
这意味着A
模块仅被评估一次,即使它被其他模块多次导入。
ES6 modules
的评估规则与commonjs
格式相同:
instance
,并且在加载时仅评估一次 导入相同模块实例的行为描述了ECMAScript 6规范的HostResolveImportedModule部分。
它提到:
如果正常完成,则此操作(导入操作)必须是幂等的。 每次使用特定的referencingModule,说明符对(从<source>导入<a>)作为参数调用它时,它必须返回相同的Module Record实例。
模块的单次评估行为在ModuleEvaluation中使用Evaluated
boolean flag在第4和第5点中描述。
每个模块都有Evaluated
标志,确保只评估一次模块代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.