Фон
Спецификация JavaScript ES6 поддерживает импорт модулей aka ES6 модулей .
Stati c Импорт довольно очевиден использовать и уже есть довольно хорошая поддержка браузера , но динамический c импорт по-прежнему отстает .
Так что вполне возможно, что ваш код использует stati c модули (когда они не поддерживаются, код даже не будет выполняться), но браузер может пропустить поддержку dynamici c импорта. Таким образом, определение того, работает ли загрузка Dynami c (перед попыткой фактически загрузить код), может быть полезным. И , поскольку браузер не одобряет обнаружение , конечно, я хотел бы использовать функцию обнаружения.
Сценарии использования могут состоять в том, чтобы показать ошибку, откат к некоторым другим данным / стандартному / загрузочному алгоритму Предоставьте разработчикам преимущества динамической загрузки c (данных, например, в стиле ленивого режима) в модуль, в то же время позволяя отступить от прямой передачи данных и т. д. c. По сути, все обычные случаи использования, в которых может использоваться обнаружение функций.
Проблема
Теперь, когда модули Dynami c импортируются с import('/modules/my-module.js')
, очевидно, что будет просто пытаться определить, есть такая функция:
// this code does NOT work
if (import) {
console.log("dynamic import supported")
}
Полагаю, для каждой (?) другой функции это будет работать, но проблема, по-видимому, такова: как import
, соответственно, было a зарезервированное ключевое слово в ECMAScript , и теперь, очевидно, также используется для указания импорта stati c, это не настоящая функция. Как говорит MDN, это «функционально».
Tries
import()
приводит к синтаксической ошибке, поэтому это не очень удобно, а import("")
приводит к обещанию, которое отклоняет, что может быть полезно, но выглядит действительно хакерским / как обходной путь. Кроме того, он требует наличия асинхронного c контекста (await
et c.) Только для определения возможностей, что не очень хорошо.
typeeof import
также не работает напрямую, вызывая синтаксическую ошибку из-за Ключевое слово («неожиданный токен: ключевое слово« импорт »»).
Итак, каков наилучший способ надежного определения функций, который браузер поддерживает dynamici c ES6 модули ?
Редактировать: Поскольку я вижу некоторые ответы, обратите внимание, что решение, конечно, должно быть максимально удобным для использования, например, CSP может помешать использование eval
и в PWA вы не должны предполагать, что вы всегда онлайн, поэтому простая попытка запроса какого-либо файла с ошибкой может привести к неверным результатам.