Мне нужно сделать что-то вроде:
if (condition) {
import something from 'something';
}
// ...
if (something) {
something.doStuff();
}
Приведенный выше код не компилируется; это бросает SyntaxError: ... 'import' and 'export' may only appear at the top level
.
Я попытался использовать, System.import
как показано здесь , но я не знаю, откуда System
. Это предложение ES6, которое не было принято? Ссылка на «программный API» из этой статьи выводит меня на устаревшую страницу документации .
javascript
module
ecmascript-6
ericsoco
источник
источник
package.json
; mygulpfile
then проверяет, существует ли эта зависимость, перед выполнением некоторых шагов сборки.webpack
иbabel
для транспорта ES6 в ES5. Проекты, подобныеwebpack-rewire
и похожие, здесь не помогут - github.com/jhnns/rewire-webpack/issues/12 . Одним из способов установки теста, удваивающего ИЛИ для удаления проблемных зависимостей, может быть условный импорт.webpack
используется для преобразования таблиц стилей в модули, которые вставляют соответствующие стили в DOM, когда они импортированы), но модуль также должен работать вне браузера (например, для модульного тестирования).Ответы:
У нас есть предложение по динамическому импорту с ECMA. Это на этапе 3. Это также доступно как предустановка babel .
Ниже приведен способ сделать условный рендеринг согласно вашему случаю.
Это в основном возвращает обещание. Ожидается, что разрешение обещание будет иметь модуль. Предложение также имеет другие функции, такие как множественный динамический импорт, импорт по умолчанию, импорт файлов js и т. Д. Более подробную информацию о динамическом импорте можно найти здесь .
источник
if (condition) { import('something') .then(({ somethingExported }) => { console.log(somethingExported); }); }
npm run build
я все еще получаю ошибку:SyntaxError: ... 'import' and 'export' may only appear at the top level
Если вы хотите, вы можете использовать требуют. Это способ создания условного оператора require.
источник
require()
это не является частью стандартного JavaScript - это встроенная функция в Node.js, поэтому она полезна только в этой среде. ОП не указывает на работу с Node.js.Вы не можете импортировать условно, но вы можете сделать наоборот: экспортировать что-то условно. Это зависит от вашего варианта использования, поэтому этот обходной путь может быть не для вас.
Ты можешь сделать:
api.js
apiConsumer.js
Я использую это для насмешек над аналитическими библиотеками, такими как mixpanel и т. Д., Потому что в настоящее время у меня не может быть несколько сборок или нашего внешнего интерфейса. Не самый элегантный, но работает. У меня просто есть несколько «если» здесь и там, в зависимости от среды, потому что в случае mixpanel, он нуждается в инициализации.
источник
Похоже, ответ в том, что на данный момент вы не можете.
http://exploringjs.com/es6/ch_modules.html#sec_module-loader-api
Я думаю, что цель состоит в том, чтобы включить статический анализ в максимально возможной степени, и условно импортированные модули ломают это. Также стоит упомянуть - я использую Babel , и я предполагаю, что
System
это не поддерживается Babel, потому что API загрузчика модулей не стал стандартом ES6.источник
require()
это способ импортировать некоторый модуль во время выполнения, и он одинаково подходит для статического анализа, какimport
если бы он использовался со строковыми литеральными путями. Это требуется, чтобы упаковщик выбирал зависимости для пакета.Для динамического разрешения модулей с полной поддержкой статического анализа, сначала индексируйте модули в индексаторе (index.js) и импортируйте индексатор в хост-модуле.
источник
require()
это не является частью стандартного JavaScript - это встроенная функция в Node.js, поэтому она полезна только в этой среде. ОП не указывает на работу с Node.js.Важное отличие, если вы используете режим динамического импорта Webpack
eager
:источник
import
возвращает обещание.скрывая это в eval у меня получалось, скрывая это от статического анализатора ...
источник
eval
здесь, @TormodHaugene?eval
их не следует использовать . В целом: если вы обнаружите необходимость использованияeval
, вы, вероятно, делаете это неправильно и должны сделать шаг назад, чтобы рассмотреть свои альтернативы. Вероятно, есть некоторые сценарии, в которых использованиеeval
является правильным, но вы, скорее всего, не сталкивались ни с одной из этих ситуаций.require()
это не является частью стандартного JavaScript - это встроенная функция в Node.js, поэтому она полезна только в этой среде. ОП не указывает на работу с Node.js.Я смог добиться этого, используя функцию, которая была вызвана немедленно и требовал утверждения.
источник
require()
это не является частью стандартного JavaScript - это встроенная функция в Node.js, поэтому она полезна только в этой среде. ОП не указывает на работу с Node.js.Условный импорт также может быть достигнут с тройной и
require()
с:const logger = DEBUG ? require('dev-logger') : require('logger');
Этот пример взят из глобальных документов ES Lint: https://eslint.org/docs/rules/global-require
источник
require()
это не является частью стандартного JavaScript - это встроенная функция в Node.js, поэтому она полезна только в этой среде. ОП не указывает на работу с Node.js.Посмотрите на этот пример, чтобы понять, как работает динамический импорт.
Пример импорта динамического модуля
Иметь базовое понимание импорта и экспорта модулей.
Модули JavaScript Github
Модули Javascript MDN
источник
Нет, ты не можешь!
Однако, столкнувшись с этой проблемой, вы должны переосмыслить порядок организации своего кода.
Я полагаю, что одной из причин, по которой они отказались от поддержки ES6 и далее, является тот факт, что компиляция будет очень трудной или невозможной.
источник