Как определить функции модулей es6
Я хочу экспортировать модуль, используя синтаксис ES6, только если он поддерживается в текущей среде выполнения. Целью является создание библиотеки, поддерживающей различные системы управления модулями.
Поскольку export
- это ключевое слово, что-то вроде того, что выкинет синтаксическую ошибку:
typeof export
Ответы
Ответ 1
Версия 27 спецификации имела API Reflect.Loader
, который можно было бы использовать для отражения модуля.
Хотя это не является прямым обнаружением функции для ключевого слова export, возможно, было бы возможно загрузить модуль, который использует ключевые слова экспорта из data-uri, а затем проверить, не выдает ли он ошибки анализа или нет.
Но он был удален с исправлением 28 со следующей записью изменений:
Удаленный конвейер загрузчика и API Reflect.Loader(функциональность передается отдельной спецификации)
Таким образом, насколько я могу судить, спецификация не обеспечивает какого-либо способа обнаружения функции на момент написания.
В будущем это возможно при Reflect.Loader
или его замене.
Изменить: спецификация загрузчика, по-видимому, разработана под управлением whatwg, но она еще не находится в состоянии, из которого мы могли бы получить обнаружение функции.
Ответ 2
Проверьте наличие атрибута noModule:
document.currentScript && "noModule" in document.currentScript;
Ответ 3
Используйте
'noModule' in HTMLScriptElement.prototype
исх
Ответ 4
Я знаю, что это немного поздно, но вот функция, которую я разработал для проверки возможностей операторов импорта ES6. Я знаю, что это не совсем то, что искал ОП, но, тем не менее, это ответ:
function hasImport() {
var test = false;
try {
if(typeof import("").catch(function() { ;; }) === "object")
test = true;
} catch(e) { ;; }
return test;
}
Обратите внимание, что это всегда должно быть сохранено как его собственная функция (не встроенная), если это вообще возможно; Иногда Javascript может отказаться от оптимизации функций, содержащих блоки "try", подобные этим, что отрицательно скажется на производительности.