В синтаксисе `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? Что мне делать, если я хочу, чтобы модуль оценивался ТОЛЬКО ОДИН РАЗ, независимо от того, сколько раз он импортирован прямо или косвенно? У кого-нибудь есть идеи по этому поводу?
Когда D Модуль выполнен, консоль напечатает это сообщение:
A evaluated
A constructor
Это означает, что A Модуль был оценен только один раз, даже если он был импортирован несколько раз другими модулями.
Правила оценки для ES6 modules такой же, как для commonjs формат:
Модуль - это фрагмент кода, который выполняется после загрузки. Это означает, что если модуль не включен в основной комплект, он не будет оцениваться
Модули одиночные. Если модуль импортируется несколько раз, только один instance существует и оценивается только один раз при загрузке
Поведение импорта того же экземпляра модуля описано в разделе HostResolveImportedModule спецификации ECMAScript 6. Это упоминает:
Эта операция ( операция импорта) должна быть идемпотентной, если она завершается нормально. Каждый раз, когда он вызывается с определенной ссылочной Module, парой спецификаторов (import из ) в качестве аргументов, он должен возвращать один и тот же экземпляр модульной записи.
Поведение одноразовой оценки модуля описано в ModuleEvaluation, пункты 4 и 5 с использованием Evaluated логический флаг. Каждый модуль имеет Evaluated флаг, который проверяет код модуля только один раз.