WebAssembly.instantiateStreaming()

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

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

语法

js
WebAssembly.instantiateStreaming(source, importObject)

参数

source

一个 Response 对象或一个会兑现为 Response 的 promise,其表示你想要传输、编译和实例化的 Wasm 模块的底层源。

importObject 可选

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

返回值

一个 Promise,会兑现为一个包含两个属性的 ResultObject

异常

示例

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

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

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

然后访问 ResultObject 的实例成员,并调用包含的导出函数。

备注: 为了使其工作,服务器应该返回一个 application/wasm MIME 类型的 .wasm 文件。

规范

Specification
WebAssembly Web API
# dom-webassembly-instantiatestreaming

浏览器兼容性

BCD tables only load in the browser

参见