Можно ли импортировать что-то в модуль, указав имя переменной при использовании импорта ES6?
Т.е. я хочу импортировать какой-то модуль во время выполнения в зависимости от значений, указанных в конфигурации:
import something from './utils/' + variableName;
javascript
node.js
ecmascript-6
Витаутас Буткус
источник
источник
Ответы:
Не с
import
заявлением.import
иexport
определены таким образом, чтобы их можно было статически анализировать, поэтому они не могут зависеть от информации времени выполнения.Вы ищете API загрузчика (polyfill) , но мне немного неясно состояние спецификации:
источник
В дополнение к ответу Феликса я прямо отмечу, что в настоящее время это не разрешено грамматикой ECMAScript 6 :
ModuleSpecifier может быть только СтроковойЛитерал , а не какой - либо другой вид выражения , как АддитивноеВыражение .
источник
const
string literal
s. Их можно статически анализировать, не так ли? Это сделало бы возможным повторное использование местоположения зависимости. (например, импортируйте шаблон и получите как шаблон, так и его расположение).Хотя на самом деле это не динамический импорт (например, в моих обстоятельствах все файлы, которые я импортирую ниже, будут импортированы и объединены веб-пакетом, а не выбраны во время выполнения), я использовал шаблон, который может помочь в некоторых обстоятельствах: :
или альтернативно:
Я не думаю, что смогу вернуться к значениям по умолчанию так же легко с помощью
require()
, что вызывает ошибку, если я пытаюсь импортировать созданный путь шаблона, который не существует.Хорошие примеры и сравнения между require и import можно найти здесь: http://www.2ality.com/2014/09/es6-modules-final.html
Отличная документация по реэкспорту из @iainastacio: http://exploringjs.com/es6/ch_modules.html#sec_all-exporting-styles
Мне интересно услышать отзывы об этом подходе :)
источник
Object.values(templates)
.Появилась новая спецификация, которая называется динамическим импортом модулей ES. В общем, вы просто звоните,
import('./path/file.js')
и все готово. Функция возвращает обещание, которое разрешается модулем, если импорт был успешным.Случаи использования
Сценарии использования включают импорт компонентов на основе маршрута для React, Vue и т. Д., А также возможность отложенной загрузки модулей. , когда они требуются во время выполнения.
Дальнейшая информация
Вот объяснение от разработчиков Google .
Совместимость браузера (апрель 2020 г.)
Согласно MDN, он поддерживается всеми текущими основными браузерами (кроме IE), а caniuse.com показывает 87% поддержки на мировом рынке. Снова нет поддержки в IE или Edge без хрома.
источник
Я понимаю вопрос, специально заданный для ES6
import
в Node.js, но следующее может помочь другим, ищущим более общее решение:Обратите внимание, если вы импортируете модуль ES6 и вам нужно получить доступ к
default
экспорту, вам нужно будет использовать одно из следующих действий:Вы также можете использовать деструктуризацию с этим подходом, который может добавить больше синтаксиса для вашего другого импорта:
К сожалению, если вы хотите получить доступ,
default
а также деструктурировать, вам нужно будет выполнить это в несколько этапов:источник
для этого вы можете использовать нотацию, отличную от ES6. вот что сработало для меня:
источник
Мне этот синтаксис меньше нравится, но он работает:
вместо того, чтобы писать
используйте этот синтаксис:
источник
require()
- это ранняя версия метода Node.JS для загрузки файлов.import
statement - это более новая версия, которая теперь является частью синтаксиса официального языка. Однако во многих случаях браузер будет использовать предыдущий (за наукой). Оператор require также кэширует ваши файлы, поэтому, если файл загружается второй раз, он будет загружен из памяти (лучшая производительность). У способа импорта есть свои преимущества - если вы используете WebPack. тогда webpack может удалить мертвые ссылки (эти скрипты не будут загружены на клиент).Динамический импорт () (доступен в Chrome 63+) сделает вашу работу. Вот как:
источник
Я бы сделал это так
источник
./utils/test.js
звонок из файла
источник