2021 年更新:
虽然 Loader 规范似乎停滞不前,但动态导入替代方案一直是 implemented by various runtimes。
由于对模块的支持是动态导入的先决条件,因此后者可用于探测对前者的支持。
这不依赖于任何 DOM API 细节,因此可以在其他上下文中使用。一个限制是它必须异步查询。另一个限制是此检测与unsafe-eval CSP 不兼容,在这种情况下,通过HTMLScriptElement 或Worker API 进行探测可以用作后备。
let supported = null;
async function modulesSupported() {
if (supported !== null) {
return supported;
}
try {
let module = await new Function("return (async () => {return await import('data:application/javascript,export%20let%20canary%20=%201;')})")()()
supported = module && module.canary && module.canary == 1;
} catch(e) {
supported = false;
}
return supported;
}
modulesSupported().then(r => console.log(r));
// => `true`
旧答案:
规范的Revision 27 有一个Reflect.Loader API,可用于模块反射。
虽然这本身并不是直接对 export 关键字进行特征检测,但可能可以从 data-uri 加载使用 export 关键字的模块,然后检查它是否引发解析错误。
但它已在修订版 28 中被删除,并带有以下更改日志条目:
删除了加载器管道和 Reflect.Loader API(功能被转移到单独的规范中)
因此,据我所知,在撰写本文时,该规范似乎没有提供任何特征检测方式。
将来可能会使用Reflect.Loader 或其替代品。
编辑:loader spec 似乎是由 whatwg 管理开发的,但它还没有处于我们可以从中派生特征检测的状态。