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 表只在瀏覽器中載入

另請參閱