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