在ES6的`import`语法中,模块是如何精确计算的?

假设我们有四个模块, ABCD

在模块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多less次,并在控制台上打印A constructor

ES6标准中描述了这种行为吗? 不pipe直接或间接导入多less次,如果我只想要一个模块进行评估,我该怎么办? 有没有人有任何想法呢?

D模块执行时,控制台将打印此消息:

 A evaluated A constructor 

这意味着A模块只被评估一次,即使它被其他模块多次导入。

ES6 modules的评估规则与commonjs格式相同:

  • 一个模块是一个加载后执行的代码片段。 这意味着如果一个模块不包含在主包中,将不会被评估
  • 模块是单身人士。 如果一个模块被多次导入,则只有它的一个instance存在,并且在加载时只计算一次

导入 ECMAScript 6规范的HostResolveImportedModule部分的模块的相同实例的行为。
它提到:

这个操作(导入操作)如果正常完成,必须是幂等的。 每次使用特定的referencingModule,说明符对(从<source>导入<a>)作为参数调用它时,它必须返回相同的Module Record实例。

ModuleEvaluation中描述了对模块进行单次评估的行为,使用Evaluated布尔标志指出了第4和第5点。
每个模块都有Evaluated标志,确保只评估一次模块代码。