支持WebAssembly进入所有新的主流浏览器,如何检查访问我网站的当前浏览器是否支持它?
答案 0 :(得分:31)
有几种方法可以检测WebAssembly的存在。基本的一个是检查WebAssembly
是否在全局范围内是"object"
类型,而是"全局范围"在不同的JavaScript环境(主浏览器线程,worker,node.js)中进行操作是一件非常棘手的事情。
这样做在技术上也不够,因为你可能有WebAssembly支持,但由于CSP而无法实际编译或实例化(而且CSP不允许的还没有标准化,工作正在进行中{{3 }})。
保守检查可能如下:
const supported = (() => {
try {
if (typeof WebAssembly === "object"
&& typeof WebAssembly.instantiate === "function") {
const module = new WebAssembly.Module(Uint8Array.of(0x0, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00));
if (module instanceof WebAssembly.Module)
return new WebAssembly.Instance(module) instanceof WebAssembly.Instance;
}
} catch (e) {
}
return false;
})();
console.log(supported ? "WebAssembly is supported" : "WebAssembly is not supported");

它执行以下操作:
WebAssembly
。如果它不是全球性的,我们真的不在乎!.instantiate
功能,我们在这里实际使用但是您实际实例化后想要使用它,因为它是异步的并且可以处理大主线程上的模块或关闭。'\0', 'a', 's', 'm'
,然后编码为uint32
的版本号1),看看我们是否得到WebAssembly.Module
。 WebAssembly.Instance
。这有点多,但无论如何都应该有效:
答案 1 :(得分:1)
(声誉欠佳,无法发表评论...。)
如果您正在较旧的浏览器上进行测试,则不支持() =>
语法,因此可以将其作为一个函数来完成:
function wasmSupported() {
// try/catch, return false; as in JF Bastien's answer
}
if(wasmSupported()) { ... }