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