WebAssembly.instantiate()
**WebAssembly.instantiate()
** 函数允许您编译和实例化 WebAssembly 代码。此函数有两个重载。
- 主要重载接受 WebAssembly 二进制代码,以类型化数组或
ArrayBuffer
的形式,并一步完成编译和实例化。返回的Promise
解析为已编译的WebAssembly.Module
及其第一个WebAssembly.Instance
。 - 次要重载接受已编译的
WebAssembly.Module
,并返回一个解析为该Module
的Instance
的Promise
。如果Module
已经编译,则此重载很有用。
**警告:** 此方法不是获取和实例化 Wasm 模块最有效的方式。如果可能,您应该使用更新的WebAssembly.instantiateStreaming()
方法,它一步完成从原始字节码获取、编译和实例化模块,因此不需要转换为ArrayBuffer
。
语法
主要重载 - 接受 Wasm 二进制代码
WebAssembly.instantiate(bufferSource, importObject);
参数
bufferSource
-
包含要编译的 Wasm 模块的二进制代码的类型化数组或
ArrayBuffer
,或WebAssembly.Module
。 importObject
可选-
包含要导入到新创建的
Instance
中的值的 对象,例如函数或WebAssembly.Memory
对象。必须为编译模块的每个声明的导入提供一个匹配的属性,否则会抛出WebAssembly.LinkError
。
返回值
一个解析为ResultObject
的Promise
,其中包含两个字段
module
:一个WebAssembly.Module
对象,表示已编译的 WebAssembly 模块。此Module
可以再次实例化,通过postMessage()
共享,或缓存。instance
:一个WebAssembly.Instance
对象,其中包含所有导出的 WebAssembly 函数。
异常
- 如果两个参数中的任何一个类型或结构不正确,则承诺会拒绝,并显示
TypeError
。 - 如果操作失败,则承诺会拒绝,并显示
WebAssembly.CompileError
、WebAssembly.LinkError
或WebAssembly.RuntimeError
,具体取决于失败的原因。
次要重载 - 接受模块对象实例
WebAssembly.instantiate(module, importObject);
参数
module
-
要实例化的
WebAssembly.Module
对象。 importObject
可选-
包含要导入到新创建的
Instance
中的值的 对象,例如函数或WebAssembly.Memory
对象。必须为module
的每个声明的导入提供一个匹配的属性,否则会抛出WebAssembly.LinkError
。
返回值
一个解析为WebAssembly.Instance
对象的Promise
。
异常
- 如果两个参数中的任何一个类型或结构不正确,则会抛出
TypeError
。 - 如果操作失败,则承诺会拒绝,并显示
WebAssembly.CompileError
、WebAssembly.LinkError
或WebAssembly.RuntimeError
,具体取决于失败的原因。
示例
**注意:** 您可能希望在大多数情况下使用WebAssembly.instantiateStreaming()
,因为它比instantiate()
更有效。
第一个重载示例
使用 fetch 获取一些 WebAssembly 字节码后,我们使用WebAssembly.instantiate()
函数编译和实例化模块,在此过程中将 JavaScript 函数导入 WebAssembly 模块。然后,我们调用由Instance
导出的导出的 WebAssembly 函数。
const importObject = {
my_namespace: {
imported_func(arg) {
console.log(arg);
},
},
};
fetch("simple.wasm")
.then((response) => response.arrayBuffer())
.then((bytes) => WebAssembly.instantiate(bytes, importObject))
.then((result) => result.instance.exports.exported_func());
**注意:** 您也可以在 GitHub 上的index.html中找到此示例(也查看它的实时版本)。
第二个重载示例
以下示例(请查看 GitHub 上的index-compile.html演示,以及查看它的实时版本)使用WebAssembly.compileStreaming()
方法编译加载的 simple.wasm 字节码,然后使用worker通过postMessage()
将其发送到worker。
const worker = new Worker("wasm_worker.js");
WebAssembly.compileStreaming(fetch("simple.wasm")).then((mod) =>
worker.postMessage(mod),
);
在 worker 中(请查看wasm_worker.js
),我们为模块定义一个导入对象,然后设置一个事件处理程序来接收来自主线程的模块。收到模块后,我们使用WebAssembly.instantiate()
方法创建该模块的实例,并从其中调用一个导出的函数。
const importObject = {
my_namespace: {
imported_func(arg) {
console.log(arg);
},
},
};
onmessage = (e) => {
console.log("module received from main thread");
const mod = e.data;
WebAssembly.instantiate(mod, importObject).then((instance) => {
instance.exports.exported_func();
});
};
规范
规范 |
---|
WebAssembly JavaScript 接口 # dom-webassembly-instantiate |
浏览器兼容性
BCD 表只在浏览器中加载