Javascript 如何检测es6模块的功能

Javascript 如何检测es6模块的功能,javascript,ecmascript-6,Javascript,Ecmascript 6,仅当当前运行时支持使用ES6语法导出模块时,我才希望使用ES6语法导出模块。目标是开发一个支持不同模块管理系统的库 由于export是一个关键字,类似的内容将引发语法错误: typeof export 该规范的一部分有一个可用于模块反射的Reflect.LoaderAPI 虽然这不是export关键字本身的直接功能检测,但也可以从数据uri加载使用export关键字的模块,然后检查它是否抛出解析错误 但它已随第28版一起删除,带有以下更改日志条目: 删除了加载程序管道和Reflect.load

仅当当前运行时支持使用ES6语法导出模块时,我才希望使用ES6语法导出模块。目标是开发一个支持不同模块管理系统的库

由于
export
是一个关键字,类似的内容将引发语法错误:

typeof export
该规范的一部分有一个可用于模块反射的
Reflect.Loader
API

虽然这不是export关键字本身的直接功能检测,但也可以从数据uri加载使用export关键字的模块,然后检查它是否抛出解析错误

但它已随第28版一起删除,带有以下更改日志条目:

删除了加载程序管道和Reflect.loader API(功能被转移到单独的规范中)


因此,据我所知,在撰写本文时,规范似乎没有提供任何特征检测方法

将来可能会使用
Reflect.Loader
或其替代品


编辑:似乎是由whatwg开发和管理的,但它还没有处于我们可以从中派生特征检测的状态。

检查“noModule”属性:

document.currentScript && "noModule" in document.currentScript;
使用


不,即使在ES5中,
export
import
都是保留关键字,这会导致无法捕获的语法错误。我认为您应该使用ES6语法;并分发一个由6到5编译的版本。由于不同的语法规则(生成器可以通过eval进行测试,模块不能,afaics)可能重复而不是重复@joews,因为
eval
将其字符串解析为脚本而不是模块(换句话说,ExportDeclaration和ImportDeclaration不能被eval'd)这一未来是否已经到来?如果该提案(现在)成为现实,我们将很容易地检查
typeof import===“function”
@krampstudio您的评论所建议的代码在Chrome中产生了一个“未可知的语法错误”。请查看我的答案以进行工作检查。这不起作用,因为OP通常希望检查不同的运行时。DOM API不一定可用,例如在node.js或web workers中。如果它们可用,那么通过构建
元素进行检查就很简单了。@8472个Web Worker是由DOM API加载的,因此您应该知道是否支持es6模块。使用node.js,您只需要node.js的最低版本。

'noModule' in HTMLScriptElement.prototype