随着所有新的主要浏览器都支持WebAssembly,我如何检查正在访问我的网站的当前浏览器是否支持它?

最佳答案

您可以通过几种方法来检测WebAssembly的存在。基本的方法是检查全局范围内WebAssembly是否为"object"类型,但是在不同的JavaScript环境(主浏览器线程,worker,node.js)中,“全局范围”是一件棘手的事情。

这样做在技术上还不够,因为您可能拥有WebAssembly支持,但由于CSP而无​​法实际编译或实例化(并且CSP不允许的功能尚未标准化,请继续进行here)。

保守检查可能如下:

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

  • 这有点多,但是无论如何都可以工作:
  • 代码在哪里运行(主线程,工作程序,node.js)。
  • CSP如何最终被标准化。
  • 关于browser - 如何检查浏览器是否支持WebAssembly?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47879864/

    10-10 06:15