Подтвердить что ты не робот

Импортирован ли модуль модуля ES6?

Я знаю, что в новом синтаксисе модуля ES6 механизм JavaScript не должен оценивать код, чтобы знать обо всех импортах/экспорте, он будет < анализировать это и "знать", что загружать.

Это звучит как подъем. Подняты ли модули ES6? И если это так, все они будут загружены перед запуском кода?

Возможно ли этот код?

import myFunc1 from 'externalModule1';

myFunc2();

if (Math.random()>0.5) {
    import myFunc2 from 'externalModule2';
}
4b9b3361

Ответ 1

После нескольких исследований я обнаружил:

  • Импорт AE поднят! в соответствии с спецификация ModuleDeclarationInstantiation
  • Все зависимые модули будут загружены перед запуском любого кода.

Этот код не будет иметь ошибок и будет работать:

localFunc();

import {myFunc1} from 'mymodule';

function localFunc() { // localFunc is hoisted
    myFunc1();
}

Ответ 2

Это будет SyntaxError. Согласно эта часть спецификации:

Module :
   ModuleBody

ModuleBody :
    ModuleItemList

ModuleItemList :
    ModuleItem
    ModuleItemList ModuleItem

ModuleItem :
    ImportDeclaration
    ExportDeclaration
    StatementListItem

Это означает, что модуль может содержать только ImportDeclaration 's, ExportDeclaration или StatementListItem. Согласно это StatementListItem может не содержат ImportDeclaration и ExportDeclaration.

import myFunc1 from 'externalModule1'; 

является объявлением импорта, а:

if (Math.random()>0.5) {
    import myFunc2 from 'externalModule2';
}

- это утверждение. Таким образом, ваш код приведет к синтаксической ошибке.

Как насчет "все они будут загружены перед запуском кода?". Эта часть спецификации содержит следующее предложение:

ПРИМЕЧАНИЕ. Перед созданием модуля все запрошенные модули должны быть доступны.

Итак, да. Все они будут загружены перед запуском кода.

Ответ 3

Спецификация ES6 может быть изменена, но этот проект является явным:

Разрешение статической переменной и связывание проверок прохождения конфликтов в импортированных именах переменных. Если есть конфликт между двумя импортированные имена или импортированное имя и другое локальное связывание, тогда это является ошибкой времени компиляции.

И попытка импортировать во время выполнения является сомнительной идеей не только в ES6. Также из проекта:

Компиляция разрешает и проверяет все определения переменных и Рекомендации. Связь также происходит во время компиляции; связывание разрешений и проверяет все импорт и экспорт модулей.

Вы можете видеть, что реализация Babel ES6 не слишком доволен им.