WebAssembly.instantiateStreaming()
**WebAssembly.instantiateStreaming()** 靜態方法直接從流式傳輸的底層原始碼編譯和例項化 WebAssembly 模組。這是載入 Wasm 程式碼最有效、最最佳化的方式。
**注意:** 具有嚴格內容安全策略 (CSP) 的網頁可能會阻止 WebAssembly 編譯和執行模組。有關允許 WebAssembly 編譯和執行的更多資訊,請參閱script-src CSP。
語法
js
WebAssembly.instantiateStreaming(source, importObject)
引數
source-
一個
Response物件或一個將以一個物件為結果的承諾,表示要流式傳輸、編譯和例項化的 Wasm 模組的底層原始碼。 importObject可選-
一個包含要匯入到新建立的
Instance中的值的物件,例如函式或WebAssembly.Memory物件。每個宣告的匯入的已編譯模組都必須有一個匹配的屬性,否則將丟擲WebAssembly.LinkError。
返回值
一個Promise,它解析為一個ResultObject,其中包含兩個欄位
-
module: 一個WebAssembly.Module物件,表示已編譯的 WebAssembly 模組。此Module可以再次例項化,也可以透過postMessage() 共享。 -
instance: 一個WebAssembly.Instance物件,其中包含所有匯出的 WebAssembly 函式。
異常
- 如果任一引數的型別或結構不正確,則會丟擲
TypeError。 - 如果操作失敗,承諾將拒絕並丟擲一個
WebAssembly.CompileError、WebAssembly.LinkError或WebAssembly.RuntimeError,具體取決於失敗的原因。
示例
例項化流式傳輸
以下示例(請參閱我們在 GitHub 上的instantiate-streaming.html 演示,以及即時檢視它)直接從底層原始碼流式傳輸 Wasm 模組,然後對其進行編譯和例項化,承諾將以一個 ResultObject 為結果。因為 instantiateStreaming() 函式接受一個針對Response 物件的承諾,所以您可以直接將其傳遞給fetch() 呼叫,它將在承諾完成時將響應傳遞到函式中。
js
const importObject = {
my_namespace: { imported_func: (arg) => console.log(arg) },
};
WebAssembly.instantiateStreaming(fetch("simple.wasm"), importObject).then(
(obj) => obj.instance.exports.exported_func(),
);
然後訪問 ResultObject 的例項成員,並呼叫其中包含的匯出的函式。
**注意:** 為了使此方法起作用,.wasm 檔案應由伺服器以 application/wasm MIME 型別返回。
規範
| 規範 |
|---|
| WebAssembly Web API # dom-webassembly-instantiatestreaming |
瀏覽器相容性
BCD 表格僅在瀏覽器中載入