В синтаксисе `import` ES6 как точно оценивается модуль?

Допустим, у нас есть четыре модуля, 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? Что мне делать, если я хочу, чтобы модуль оценивался ТОЛЬКО ОДИН РАЗ, независимо от того, сколько раз он импортирован прямо или косвенно? У кого-нибудь есть идеи по этому поводу?

1 ответ

Решение

Когда D Модуль выполнен, консоль напечатает это сообщение:

A evaluated
A constructor

Это означает, что A Модуль был оценен только один раз, даже если он был импортирован несколько раз другими модулями.

Правила оценки для ES6 modules такой же, как для commonjs формат:

  • Модуль - это фрагмент кода, который выполняется после загрузки. Это означает, что если модуль не включен в основной комплект, он не будет оцениваться
  • Модули одиночные. Если модуль импортируется несколько раз, только один instance существует и оценивается только один раз при загрузке

Поведение импорта того же экземпляра модуля описано в разделе HostResolveImportedModule спецификации ECMAScript 6.
Это упоминает:

Эта операция ( операция импорта) должна быть идемпотентной, если она завершается нормально. Каждый раз, когда он вызывается с определенной ссылочной Module, парой спецификаторов (import из ) в качестве аргументов, он должен возвращать один и тот же экземпляр модульной записи.

Поведение одноразовой оценки модуля описано в ModuleEvaluation, пункты 4 и 5 с использованием Evaluated логический флаг.
Каждый модуль имеет Evaluated флаг, который проверяет код модуля только один раз.

Другие вопросы по тегам