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

标签 browser webassembly

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

最佳答案

有几种方法可以检测 WebAssembly 的存在。最基本的是检查是否WebAssembly if 类型为 "object"在全局范围内,但“全局范围”在不同的 JavaScript 环境(主浏览器线程、工作线程、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函数,我们在这里实际上并没有使用它,但是当你实际实例化时你会想要使用它,因为它是异步的并且可以在主线程上或关闭处理大型模块。
  • 尝试同步编译尽可能小的模块(魔数(Magic Number) '\0', 'a', 's', 'm' ,后跟版本号 1 编码为 uint32 ),看看我们是否得到 WebAssembly.Module出它。
  • 最后,尝试同步实例化该模块,并检查它是否为 WebAssembly.Instance .

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

    相关文章:

    silverlight - 以编程方式使 Silverlight XAP 文件从浏览器缓存中过期

    css - 性能:在 CSS 中空格或 > 更快吗?

    python - 除了浏览器扩展之外,还有其他方法可以将 GUI 栏悬停在用户访问的任何网站上吗?

    javascript - 在node.js中运行示例代码成功,但在浏览器中运行修改后的代码失败

    c++ - 从使用 emscripten 编译的 C++ 连接 websocket 时出现问题

    browser - 如何在我的网站的Internet Explorer 8中禁用“兼容模式”?

    c++ - Emscripten - cmake - 在 CMakeList 文件中传递 emscripten 选项

    javascript - 使用 Javascript 或 WebAssembly 进行图像插值

    javascript - 为什么 webAssembly 函数比相同的 JS 函数慢近 300 倍

    rust - 如何 "extern"多个同名模块中的一个函数?