随着对 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
函数,我们在这里实际上并没有使用它,但是当你实际实例化时你会想要使用它,因为它是异步的并且可以在主线程上或关闭处理大型模块。 '\0', 'a', 's', 'm'
,后跟版本号 1 编码为 uint32
),看看我们是否得到 WebAssembly.Module
出它。 WebAssembly.Instance
. 这有点多,但无论如何都应该工作:
关于browser - 如何检查浏览器是否支持 WebAssembly?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47879864/