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 October 2017.
WebAssembly.instantiateStreaming()
函数直接从流式底层源编译并实例化 WebAssembly 模块。这是加载 Wasm 代码的最有效、最优化的方式。
备注: 具有严格的内容安全策略(CSP)的网页可能会阻止 WebAssembly 模块的编译和执行。请参阅 script-src CSP 以了解更多有关允许 WebAssembly 编译和执行的信息。
语法
WebAssembly.instantiateStreaming(source, importObject)
参数
source
-
一个
Response
对象或一个会兑现为 Response 的 promise,其表示你想要传输、编译和实例化的 Wasm 模块的底层源。 importObject
可选-
包含一些想要导入到新创建的
Instance
中的值的对象,例如函数或WebAssembly.Memory
对象。每个已编译模块的声明导入必须有一个匹配属性,否则抛出WebAssembly.LinkError
异常。
返回值
一个 Promise
,会兑现为一个包含两个属性的 ResultObject
:
module
:WebAssembly.Module
对象,表示编译完成的 WebAssembly 模块。这个Module
能够再次被实例化或通过 postMessage() 共享。instance
:WebAssembly.Instance
对象,包含所有导出的 WebAssembly 方法。
异常
- 如果任意参数的类型或结构存在错误,则抛出
TypeError
。 - 如果操作失败,Promise 根据失败原因以
WebAssembly.CompileError
、WebAssembly.LinkError
或WebAssembly.RuntimeError
拒绝。
示例
下面的示例(在 GitHub 上查看 instantiate-streaming.html 示例,也可在线查看)直接从基础源传输一个 Wasm 模块,然后进行编译和实例化,Promise 会兑现 ResultObject
。因为 instantiateStreaming()
函数接受兑现后返回 Response
对象的 Promise,你可以直接传递一个 fetch()
调用,它会在兑现后将 response 传递给该函数。
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