WebAssembly

Baseline 广泛可用 *

此功能已非常成熟,可在多种设备和浏览器版本上使用。自 2017 年 10 月以来,它已在各大浏览器中可用。

* 此特性的某些部分可能存在不同级别的支持。

WebAssembly JavaScript 对象是所有 WebAssembly 相关功能的命名空间。

与大多数其他全局对象不同,WebAssembly 不是一个构造函数(它不是一个函数对象)。你可以将其与 Math 进行比较,Math 也是数学常量和函数的命名空间对象,或者与 Intl 进行比较,Intl 是国际化构造函数和其他语言敏感函数的命名空间对象。

描述

WebAssembly 对象的主要用途是:

接口

WebAssembly.CompileError

指示在 WebAssembly 解码或验证期间发生的错误。

WebAssembly.Global

表示一个全局变量实例,可从 JavaScript 访问,也可在多个 WebAssembly.Module 实例之间导入/导出。这允许动态链接多个模块。

WebAssembly.Instance

WebAssembly.Module 的一个有状态的、可执行的实例。

WebAssembly.LinkError

指示在模块实例化期间发生的错误(除了起始函数中的 陷阱)。

WebAssembly.Memory

一个对象,其 buffer 属性是一个可调整大小的 ArrayBuffer,它保存了 WebAssembly Instance 访问的原始内存字节。

WebAssembly.Module

包含已由浏览器编译的状态无关的 WebAssembly 代码,可以高效地 与 Workers 共享,并可以多次实例化。

WebAssembly.RuntimeError

每当 WebAssembly 指定 陷阱 时抛出的错误类型。

WebAssembly.Table

一个类数组结构,代表 WebAssembly 表,用于存储 引用,例如函数引用。

WebAssembly.Tag

表示 WebAssembly 异常类型的对象。

WebAssembly.Exception

一个 WebAssembly 异常对象,可以在 WebAssembly/JavaScript 边界内外抛出、捕获和重新抛出。

静态方法

WebAssembly.compile()

从 WebAssembly 二进制代码编译 WebAssembly.Module,将实例化作为一个单独的步骤。

WebAssembly.compileStreaming()

直接从流式底层源编译 WebAssembly.Module,将实例化作为一个单独的步骤。

WebAssembly.instantiate()

用于编译和实例化 WebAssembly 代码的主要 API,返回一个 Module 及其第一个 Instance

WebAssembly.instantiateStreaming()

直接从流式底层源编译和实例化 WebAssembly 模块,返回一个 Module 及其第一个 Instance

WebAssembly.validate()

验证给定的 WebAssembly 二进制代码的类型化数组,并返回字节是否为有效的 WebAssembly 代码(true)或否(false)。

示例

流式传输 Wasm 模块,然后编译和实例化它

下面的示例(请参阅 GitHub 上的 instantiate-streaming.html 演示,以及 在线查看)直接从底层源流式传输 Wasm 模块,然后编译和实例化它,promise 将使用 ResultObject 来满足。因为 instantiateStreaming() 函数接受一个 Response 对象的 promise,所以你可以直接将一个 fetch() 调用传递给它,当 promise 满足时,它将把响应传递给函数。

js
const importObject = {
  my_namespace: { imported_func: (arg) => console.log(arg) },
};

WebAssembly.instantiateStreaming(fetch("simple.wasm"), importObject).then(
  (obj) => obj.instance.exports.exported_func(),
);

然后访问 ResultObject.instance 属性,并调用包含的导出函数。

规范

规范
WebAssembly JavaScript 接口
# webassembly-namespace

浏览器兼容性

另见