WebAssembly.instantiate()

**WebAssembly.instantiate()** 函数允许您编译和实例化 WebAssembly 代码。此函数有两个重载。

**警告:** 此方法不是获取和实例化 Wasm 模块最有效的方式。如果可能,您应该使用更新的WebAssembly.instantiateStreaming()方法,它一步完成从原始字节码获取、编译和实例化模块,因此不需要转换为ArrayBuffer

语法

主要重载 - 接受 Wasm 二进制代码

js
WebAssembly.instantiate(bufferSource, importObject);

参数

bufferSource

包含要编译的 Wasm 模块的二进制代码的类型化数组ArrayBuffer,或WebAssembly.Module

importObject 可选

包含要导入到新创建的Instance中的值的 对象,例如函数或WebAssembly.Memory 对象。必须为编译模块的每个声明的导入提供一个匹配的属性,否则会抛出WebAssembly.LinkError

返回值

一个解析为ResultObjectPromise,其中包含两个字段

异常

次要重载 - 接受模块对象实例

js
WebAssembly.instantiate(module, importObject);

参数

module

要实例化的WebAssembly.Module 对象。

importObject 可选

包含要导入到新创建的Instance中的值的 对象,例如函数或WebAssembly.Memory 对象。必须为module的每个声明的导入提供一个匹配的属性,否则会抛出WebAssembly.LinkError

返回值

一个解析为WebAssembly.Instance 对象的Promise

异常

示例

**注意:** 您可能希望在大多数情况下使用WebAssembly.instantiateStreaming(),因为它比instantiate()更有效。

第一个重载示例

使用 fetch 获取一些 WebAssembly 字节码后,我们使用WebAssembly.instantiate()函数编译和实例化模块,在此过程中将 JavaScript 函数导入 WebAssembly 模块。然后,我们调用由Instance导出的导出的 WebAssembly 函数

js
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

js
const worker = new Worker("wasm_worker.js");

WebAssembly.compileStreaming(fetch("simple.wasm")).then((mod) =>
  worker.postMessage(mod),
);

在 worker 中(请查看wasm_worker.js),我们为模块定义一个导入对象,然后设置一个事件处理程序来接收来自主线程的模块。收到模块后,我们使用WebAssembly.instantiate()方法创建该模块的实例,并从其中调用一个导出的函数。

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

另请参阅