WebAssembly.instantiateStreaming()

Baseline Widely available *

This feature is well established and works across many devices and browser versions. It’s been available across browsers since September 2021.

* Some parts of this feature may have varying levels of support.

WebAssembly.instantiateStreaming() 静态方法直接从流式底层源编译并实例化 WebAssembly 模块。这是加载 Wasm 代码最有效、最优化的方式。

备注: 具有严格的内容安全策略(CSP)的网页可能会阻止 WebAssembly 编译和执行模块。请参阅 script-src CSP 以了解更多有关允许 WebAssembly 编译和执行的信息。

语法

js
WebAssembly.instantiateStreaming(source)
WebAssembly.instantiateStreaming(source, importObject)
WebAssembly.instantiateStreaming(source, importObject, compileOptions)

参数

source

Response 对象或兑现为 Response 对象的 promise,表示的是你想要流式、编译和实例化的 Wasm 模块的底层源。

importObject 可选

包含要导入到新创建的 Instance 的值(例如,函数或 WebAssembly.Memory 对象)的对象。已编译模块的每个声明的导入一定有一个匹配的属性,否则抛出 WebAssembly.LinkError

compileOptions 可选

包含编译选项的对象。属性包含:

builtins 可选

由在已编译的 Wasm 模块中启用 JavaScript 内置用法的字符串组成的数组。字符串定义的你想要启用的内置。当前唯一可用的值是 "js-string",启用的是 JavaScript 字符串内置。

importedStringConstants 可选

导入的全局字符串常量指定命名空间的字符串。如果你想在 Wasm 模块中使用导入的全局字符串常量的话,则需要指定该属性。

返回值

兑现为含两个字段的 ResultObjectPromise

异常

示例

实例化流

下面的示例(在 GitHub 上查看 instantiate-streaming.html 示例,也可在线查看)直接从底层源流式 Wasm 模块,然后进行编译和实例化,promise 兑现的是 ResultObject。因为 instantiateStreaming() 函数接受兑现为 Response 对象的 promise,你可以直接传递 fetch() 调用,它会在兑现后将 response 传递给该函数。

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 的实例成员,并调用其包含的导出函数。

备注: 为了能运行,服务器返回的 .wasm 文件应该有 application/wasm MIME 类型。

启用 JavaScript 内置和全局字符串导入

这个示例在用 instantiateStreaming() 编译和实例化 Wasm 模块时,启用 JavaScript 字符串内置和导入的全局字符串常量,然后运行导出的 main() 函数(输出 "hello world!" 到控制台)。(查看在线示例)。

js
const importObject = {
  // 常规导入
  m: {
    log: console.log,
  },
};

const compileOptions = {
  builtins: ["js-string"], // 启用 JavaScript 字符串内置
  importedStringConstants: "string_constants", // 启用导入的全局字符串常量
};

WebAssembly.instantiateStreaming(
  fetch("log-concat.wasm"),
  importObject,
  compileOptions,
).then((result) => result.instance.exports.main());

规范

Specification
WebAssembly Web API
# dom-webassembly-instantiatestreaming

浏览器兼容性

参见