繁体   English   中英

在ES6的`import`语法中,如何精确评估模块?

[英]In the `import` syntax of ES6, how is a module evaluated exactly?

假设我们有四个模块, 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 evaluatedA 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM