WebAssembly.instantiateStreaming()
**WebAssembly.instantiateStreaming()** 静态方法直接从流式传输的底层源代码编译和实例化 WebAssembly 模块。这是加载 Wasm 代码最有效、最优化的方式。
**注意:** 具有严格内容安全策略 (CSP) 的网页可能会阻止 WebAssembly 编译和执行模块。有关允许 WebAssembly 编译和执行的更多信息,请参阅script-src CSP。
语法
js
WebAssembly.instantiateStreaming(source, importObject)
参数
source-
一个
Response对象或一个将以一个对象为结果的承诺,表示要流式传输、编译和实例化的 Wasm 模块的底层源代码。 importObject可选-
一个包含要导入到新创建的
Instance中的值的对象,例如函数或WebAssembly.Memory对象。每个声明的导入的已编译模块都必须有一个匹配的属性,否则将抛出WebAssembly.LinkError。
返回值
一个Promise,它解析为一个ResultObject,其中包含两个字段
-
module: 一个WebAssembly.Module对象,表示已编译的 WebAssembly 模块。此Module可以再次实例化,也可以通过postMessage() 共享。 -
instance: 一个WebAssembly.Instance对象,其中包含所有导出的 WebAssembly 函数。
异常
- 如果任一参数的类型或结构不正确,则会抛出
TypeError。 - 如果操作失败,承诺将拒绝并抛出一个
WebAssembly.CompileError、WebAssembly.LinkError或WebAssembly.RuntimeError,具体取决于失败的原因。
示例
实例化流式传输
以下示例(请参阅我们在 GitHub 上的instantiate-streaming.html 演示,以及实时查看它)直接从底层源代码流式传输 Wasm 模块,然后对其进行编译和实例化,承诺将以一个 ResultObject 为结果。因为 instantiateStreaming() 函数接受一个针对Response 对象的承诺,所以您可以直接将其传递给fetch() 调用,它将在承诺完成时将响应传递到函数中。
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 类型返回。
规范
| 规范 |
|---|
| WebAssembly Web API # dom-webassembly-instantiatestreaming |
浏览器兼容性
BCD 表格仅在浏览器中加载