Я начал использовать es2015 с babel в последнем проекте. Когда я пытаюсь выполнить import
или export
внутри условия if
, у меня возникает ошибка 'import' and 'export' may only appear at the top level
. Я вижу много случаев для этого, и это хорошо работает с require
, но не с модулями es2015. Есть ли причина для этого ограничения?
Почему экспортно-импортные декларации должны быть на верхнем уровне в es2015?
- Возможно, потому что модули es2015 загружаются синхронно? Разрешение вложенных
export
s будет означать, что экспорт может быть отложен до тех пор, пока не будет вызвана эта строка. 10.12.2015 - вавилон-эслинт. stackoverflow.com/questions/39158552/ 07.07.2017
Ответы:
JavaScript выполняет статический анализ модулей ES6. Это означает, что вы не можете динамически выполнять импорт или экспорт. Дополнительную информацию см. в разделе 4.2 этой статьи:
Статическая структура модуля означает, что вы можете определять импорт и экспорт во время компиляции (статически) — вам нужно только посмотреть исходный код, вам не нужно его выполнять.
Для такого подхода есть много причин, некоторые из которых заключаются в том, чтобы подготовить JavaScript для будущих функций, которые полагаются на возможность статического анализа исходного файла, а именно макросы и типы. (обсуждается в вышеупомянутой статье).
В другой интересной статье на эту тему упоминается циклический зависимости и быстрый поиск в качестве причин.
______
Если вы хотите выполнить export
в каком-то вложенном блоке модуля, пересмотрите то, как вы пишете модуль и раскрываете его API/внутренние компоненты, поскольку в этом почти наверняка нет необходимости. То же самое происходит, если вы в настоящее время require
ируете модули во вложенных блоках в своем коде ES5. Почему бы не использовать require
/ import
в верхней части модуля и использовать их API/внутренние компоненты во вложенных блоках? Главное преимущество этого подхода, по крайней мере, с точки зрения удобочитаемости, заключается в том, что вы можете узнать зависимости модуля без необходимости сканировать его исходный код на наличие require
вызовов.
if
потребует выполнения. 10.12.2015