如何检查浏览器是否支持WebAssembly?

时间:2017-12-19 04:04:10

标签: browser webassembly

支持WebAssembly进入所有新的主流浏览器,如何检查访问我网站的当前浏览器是否支持它?

2 个答案:

答案 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

这有点多,但无论如何都应该有效:

  • 代码正在运行的地方(主线程,worker,node.js)。
  • CSP最终如何标准化。

答案 1 :(得分:1)

(声誉欠佳,无法发表评论...。) 如果您正在较旧的浏览器上进行测试,则不支持() =>语法,因此可以将其作为一个函数来完成:

function wasmSupported() {
    // try/catch, return false; as in JF Bastien's answer
}
    
if(wasmSupported()) { ... }