Ответ 1
Когда модуль D
будет выполнен, консоль напечатает это сообщение:
A evaluated
A constructor
Это означает, что модуль A
оценивался только один раз, даже если он несколько раз импортировался другими модулями.
Правила оценки для ES6 modules
такие же, как для формата commonjs
:
- Модуль представляет собой кусок кода, который выполняется после его загрузки. Это означает, что если модуль не включен в основной пакет, он не будет оцениваться
- Модули - это синглтоны. Если модуль импортируется несколько раз, существует только один
instance
, и он оценивается только один раз при загрузке
Поведение импорта одного и того же экземпляра модуля описано HostResolveImportedModule в спецификации ECMAScript 6.
В нем упоминается:
Эта операция (операция импорта) должна быть идемпотентной, если она завершается нормально. Каждый раз он вызывается с помощью конкретной пары реферирования, пары спецификаторов (import <a> from <source> ) как аргументы должны возвращать тот же экземпляр записи модуля.
Поведение однократной оценки модуля описано в ModuleEvaluation, пункты 4 и 5, используя Evaluated
логический флаг.
Каждый модуль имеет флаг Evaluated
, который обязательно оценивает код модуля только один раз.