在 ES6 的 `import` 语法中,module是如何准确计算的?

IT技术 javascript node.js ecmascript-6 webpack commonjs
2021-03-15 06:51:43

假设我们有四个module,A, B,CD

在module中A

console.log("A evaluated")
function AClass {
  console.log("A constructor")
}
var aObj = new AClass()
export default aObj;

在module中B

import aObj from A
export default "B"

在module中C

import aObj from A
export default "C"

在module中D

import b from B
import c from C
import aObj from A

那么当moduleD被评估时,A evaluatedA constructor将在控制台中打印多少次

这种行为是否在ES6 标准中描述如果我希望一个module无论直接或间接导入多少次都只评估一次,该怎么办?有没有人对此有任何想法?

1个回答

Dmodule被执行时,控制台将打印此消息:

A evaluated
A constructor

这意味着该Amodule仅被评估一次,即使它被其他module多次导入。

的评估规则ES6 modulescommonjs格式相同

  • module是一段代码,一旦加载就执行。这意味着如果一个module不包含在主包中,它将不会被评估
  • module是单例的。如果一个module被多次导入instance,那么它只存在一个并且在加载时只评估一次

ECMAScript 6 规范的HostResolveImportedModule部分描述导入相同module实例的行为 它提到:

如果正常完成,则此操作(导入操作)必须是幂等的。每次使用特定的引用module、说明符对(从 <源> 导入 <a>)作为参数调用它时,它必须返回相同的module记录实例。

module单次评估的行为ModuleEvaluation 中描述,点 4 和 5 使用Evaluated布尔标志。
每个module都有Evaluated标志,确保只评估一次module代码。

没有关于不同指定的相对进口的内容。可以看作是不同的来源。
2021-05-02 06:51:43