假设我们有四个模块,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标准中描述?如果我想要仅对一个模块进行评估,无论直接或间接导入多少次,我该怎么办?有没有人对此有任何想法?
答案 0 :(得分:23)
执行D
模块时,控制台将打印此消息:
A evaluated
A constructor
这意味着A
模块只评估过一次,即使它被其他模块多次导入。
ES6 modules
的评估规则与commonjs
格式的评估规则相同:
instance
模块,并且仅在加载时评估一次 ECMAScript 6规范的HostResolveImportedModule部分描述了导入模块的同一实例的行为。
它提到:
如果正常完成,此操作(导入操作)必须是幂等的。每一次 它使用特定的referencingModule,说明符对(从< source>导入< a>)调用 参数必须返回相同的Module Record实例。
模块的单次评估的行为在ModuleEvaluation,第4和第5点使用Evaluated
布尔标志进行了描述。
每个模块都有Evaluated
标志,确保只对模块代码进行一次评估。