Импортирован ли модуль модуля ES6?
Я знаю, что в новом синтаксисе модуля ES6 механизм JavaScript не должен оценивать код, чтобы знать обо всех импортах/экспорте, он будет < анализировать это и "знать", что загружать.
Это звучит как подъем. Подняты ли модули ES6? И если это так, все они будут загружены перед запуском кода?
Возможно ли этот код?
import myFunc1 from 'externalModule1';
myFunc2();
if (Math.random()>0.5) {
import myFunc2 from 'externalModule2';
}
Ответы
Ответ 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 не слишком доволен им.