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 表格仅在浏览器中加载