Arhn - архитектура программирования

Почему экспортно-импортные декларации должны быть на верхнем уровне в es2015?

Я начал использовать es2015 с babel в последнем проекте. Когда я пытаюсь выполнить import или export внутри условия if, у меня возникает ошибка 'import' and 'export' may only appear at the top level. Я вижу много случаев для этого, и это хорошо работает с require, но не с модулями es2015. Есть ли причина для этого ограничения?


  • Возможно, потому что модули es2015 загружаются синхронно? Разрешение вложенных exports будет означать, что экспорт может быть отложен до тех пор, пока не будет вызвана эта строка. 10.12.2015
  • вавилон-эслинт. stackoverflow.com/questions/39158552/ 07.07.2017

Ответы:


1

JavaScript выполняет статический анализ модулей ES6. Это означает, что вы не можете динамически выполнять импорт или экспорт. Дополнительную информацию см. в разделе 4.2 этой статьи:

Статическая структура модуля означает, что вы можете определять импорт и экспорт во время компиляции (статически) — вам нужно только посмотреть исходный код, вам не нужно его выполнять.

Для такого подхода есть много причин, некоторые из которых заключаются в том, чтобы подготовить JavaScript для будущих функций, которые полагаются на возможность статического анализа исходного файла, а именно макросы и типы. (обсуждается в вышеупомянутой статье).

В другой интересной статье на эту тему упоминается циклический зависимости и быстрый поиск в качестве причин.

______

Если вы хотите выполнить export в каком-то вложенном блоке модуля, пересмотрите то, как вы пишете модуль и раскрываете его API/внутренние компоненты, поскольку в этом почти наверняка нет необходимости. То же самое происходит, если вы в настоящее время requireируете модули во вложенных блоках в своем коде ES5. Почему бы не использовать require / import в верхней части модуля и использовать их API/внутренние компоненты во вложенных блоках? Главное преимущество этого подхода, по крайней мере, с точки зрения удобочитаемости, заключается в том, что вы можете узнать зависимости модуля без необходимости сканировать его исходный код на наличие require вызовов.

10.12.2015
  • Мало того, они концептуально подняты, поскольку зависимости модулей полностью обрабатываются еще до того, как какой-либо ваш код даже выполнится, а концепция импорта в if потребует выполнения. 10.12.2015
  • @loganfsmyth Это гораздо более лаконичный способ выразить это :-) 10.12.2015
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..