WebAssembly.instantiateStreaming()
Baseline 广泛可用 *
WebAssembly.instantiateStreaming()
静态方法直接从流式底层源编译并实例化一个 WebAssembly 模块。这是加载 Wasm 代码最高效、最优化方式。
注意: 具有严格 Content Security Policy (CSP) 的网页可能会阻止 WebAssembly 编译和执行模块。有关允许 WebAssembly 编译和执行的更多信息,请参阅 script-src CSP。
语法
WebAssembly.instantiateStreaming(source)
WebAssembly.instantiateStreaming(source, importObject)
WebAssembly.instantiateStreaming(source, importObject, compileOptions)
参数
source
-
一个
Response
对象或一个将解析为该对象的 Promise,代表您想要流式传输、编译和实例化的 Wasm 模块的底层源。 importObject
可选-
一个包含将导入到新创建的
Instance
中的值的对象,例如函数或WebAssembly.Memory
对象。编译后的模块的每个声明的导入都必须有一个匹配的属性,否则将抛出WebAssembly.LinkError
。 compileOptions
可选-
一个包含编译选项的对象。属性可以包括:
builtins
可选-
一个字符串数组,用于启用在已编译的 Wasm 模块中使用 JavaScript 内置函数。这些字符串定义了您要启用的内置函数。目前唯一可用的值是
"js-string"
,它启用 JavaScript 字符串内置函数。 importedStringConstants
可选-
一个字符串,指定 导入的全局字符串常量 的命名空间。如果您希望在 Wasm 模块中使用导入的全局字符串常量,则需要指定此属性。
返回值
一个 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()
调用,它会在 Promise fulfilled 时将响应传递给该函数。
const importObject = {
my_namespace: { imported_func: (arg) => console.log(arg) },
};
WebAssembly.instantiateStreaming(fetch("simple.wasm"), importObject).then(
(obj) => obj.instance.exports.exported_func(),
);
然后访问 ResultObject
的 instance 成员,并调用其中包含的导出函数。
注意: 要使此功能正常工作,服务器应以 application/wasm
MIME 类型返回 .wasm
文件。
启用 JavaScript 内置函数和全局字符串导入
此示例在使用 instantiateStreaming()
编译和实例化 Wasm 模块时,启用了 JavaScript 字符串内建函数和导入的全局字符串常量,然后再运行导出的 main()
函数(该函数将 "hello world!"
打印到控制台)。在线查看运行效果。
const importObject = {
// Regular import
m: {
log: console.log,
},
};
const compileOptions = {
builtins: ["js-string"], // Enable JavaScript string builtins
importedStringConstants: "string_constants", // Enable imported global string constants
};
WebAssembly.instantiateStreaming(
fetch("log-concat.wasm"),
importObject,
compileOptions,
).then((result) => result.instance.exports.main());
规范
规范 |
---|
WebAssembly Web API # dom-webassembly-instantiatestreaming |
浏览器兼容性
加载中…