2016-03-10 5 views
32

Условные

Возможно ли иметь условные операторы импорта, как показано ниже?ES6: условные и динамические операции импорта

if (foo === bar) { 
    import Baz from './Baz'; 
} 

Я пробовал вышеуказанное, но при компиляции получаю следующую ошибку (из Babel).

'import' and 'export' may only appear at the top level 

Dynamic

Можно ли иметь динамические операторы импорта, как показано ниже?

for (let foo in bar) { 
    if (bar.hasOwnProperty(foo)) { 
     import Baz from `./${foo}`; 
    } 
} 

Вышеприведенная процедура получает ту же ошибку от Babel во время компиляции.

Можно ли это сделать или есть что-то, что мне не хватает?

Рассуждая

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

Если это невозможно, существует ли лучший способ обработки большого количества импорта в ES6?

+1

не может наследовать использовать в таком случае? используйте 'super' для вызова определенного. – Jai

+0

Я уже использую наследование, но эти «страницы» содержат в себе «конкретную логику» страницы. У меня есть базовый «страничный» класс, который все расширяется, но этого недостаточно, чтобы очистить огромное количество импортируемых мной товаров. – Enijar

+1

@zerkms: Они не выведены из блоков - это синтаксические ошибки. – Bergi

ответ

14

Динамически не удается разрешить ваши зависимости, так как imports предназначены для статического анализа. Тем не менее, вы, вероятно, можете использовать некоторые require здесь, что-то вроде:

for (let foo in bar) { 
    if (bar.hasOwnProperty(foo)) { 
     const Baz = require(foo).Baz; 
    } 
} 
+3

", поскольку импорт предназначен для статического анализа." --- это утверждение является неопределенным. 'import' предназначены для импорта, а не для анализа. – zerkms

+11

@zerkms - Я думаю, что они имели в виду, что операторы 'import' предназначены для _suitable_ для статического анализа, потому что они никогда не являются условными, инструменты могут легче анализировать деревья зависимостей. –

+3

Трудно понять с помощью «foo» «baz» и «bar» - как насчет примера реальной жизни? – TetraDev

1

Требует не решит вашу проблему, так как это синхронный вызов. Есть несколько вариантов, и все они связаны с

  1. Просить модуль вам необходимо
  2. Ожидания обещания возвратить модуль

В ECMA Script есть поддержка для ленивых модулей загрузки с использованием SystemJS. Разумеется, это не поддерживается во всех браузерах, поэтому вы можете использовать JSPM или прошивку SystemJS.

https://github.com/ModuleLoader/es6-module-loader

8

Мы имеем динамический импорт предложение теперь с ECMA. Это находится на стадии 2. Это также доступно как babel-preset.

Ниже приведен способ выполнения условного рендеринга в соответствии с вашим случаем.

if (foo === bar) { 
    import('./Baz') 
    .then((Baz) => { 
     console.log(Baz.Baz); 
    }); 
} 

Это в основном возвращает обещание. Ожидается, что ожидается, что модуль обещания получит модуль. В предложении также есть такие вещи, как множественный динамический импорт, импорт по умолчанию, импорт файла js и т. Д. Вы можете найти дополнительную информацию о dynamic imports here.

+1

Это. Динамический импорт - это путь. Они работают так же, как и require(), за исключением того, что они дают вам обещание, а не модуль. – superluminary

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