2015-03-29 2 views
29

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

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

Возможно ли использование этого кода?

import myFunc1 from 'externalModule1'; 

myFunc2(); 

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

модуль 'import' заявления просто недействительные в блоках, как объявления функций. – Bergi

ответ

18

После этого еще некоторое исследование, я нашел:

  • Imports поднимаются! в соответствии с spec из ModuleDeclarationInstantiation
  • все зависимые модули будут загружены перед запуском любой код.

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

localFunc(); 

import {myFunc1} from 'mymodule'; 

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

Данный пример не демонстрирует подъем по импорту. myFunc1 используется только в области ниже импорта. Сам локальный Func поднят, и это все, что демонстрирует этот пример. – Constablebrew

+3

, если вызов localFunc не вызывает ошибку при вызове myFunc1, тогда он демонстрирует, что импорт был поднят. – Shanimal

3

ES6 спецификация подлежат изменению, но this draft явно:

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

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

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

Вы можете видеть, что Babel's ES6 implementation не слишком доволен этим.

+1

Предлагается, хотя 'System.require (" modulename ")' или около того позволит динамическую загрузку модуля, возвращая обещание для модуля. Конечно, он не будет связан с областью модуля. – Bergi

21

Это будет SyntaxError. По this part of specification:

Module : 
    ModuleBody 

ModuleBody : 
    ModuleItemList 

ModuleItemList : 
    ModuleItem 
    ModuleItemList ModuleItem 

ModuleItem : 
    ImportDeclaration 
    ExportDeclaration 
    StatementListItem 

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

import myFunc1 from 'externalModule1'; 

является декларация импорта, в то время как:

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

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

Как насчет «все они будут загружены перед запуском кода?». This part of specification содержит следующее предложение:

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

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

+0

alexpods, спасибо за его очистку, но мне удалось поднять импорт, не помещая его в инструкцию «if». см. мой ответ. – gilamran

Смежные вопросы