WebAssembly.instantiateStreaming()

Baseline 廣泛可用 *

此功能已成熟,並可在多種裝置和瀏覽器版本上執行。自 2021 年 9 月起,所有瀏覽器均已支援此功能。

* 此特性的某些部分可能存在不同級別的支援。

WebAssembly.instantiateStreaming() 靜態方法直接從流式底層源編譯並例項化一個 WebAssembly 模組。這是載入 Wasm 程式碼最高效、最最佳化方式。

注意: 具有嚴格 Content Security Policy (CSP) 的網頁可能會阻止 WebAssembly 編譯和執行模組。有關允許 WebAssembly 編譯和執行的更多資訊,請參閱 script-src CSP

語法

js
WebAssembly.instantiateStreaming(source)
WebAssembly.instantiateStreaming(source, importObject)
WebAssembly.instantiateStreaming(source, importObject, compileOptions)

引數

source

一個 Response 物件或一個將解析為該物件的 Promise,代表您想要流式傳輸、編譯和例項化的 Wasm 模組的底層源。

importObject 可選

一個包含將匯入到新建立的 Instance 中的值的物件,例如函式或 WebAssembly.Memory 物件。編譯後的模組的每個宣告的匯入都必須有一個匹配的屬性,否則將丟擲 WebAssembly.LinkError

compileOptions 可選

一個包含編譯選項的物件。屬性可以包括:

builtins 可選

一個字串陣列,用於啟用在已編譯的 Wasm 模組中使用 JavaScript 內建函式。這些字串定義了您要啟用的內建函式。目前唯一可用的值是 "js-string",它啟用 JavaScript 字串內建函式。

importedStringConstants 可選

一個字串,指定 匯入的全域性字串常量 的名稱空間。如果您希望在 Wasm 模組中使用匯入的全域性字串常量,則需要指定此屬性。

返回值

一個 Promise,它解析為一個 ResultObject,該物件包含兩個欄位:

異常

示例

例項化流式傳輸

以下示例(請參閱 GitHub 上的 instantiate-streaming.html 演示,並 線上檢視)直接從底層源流式傳輸 Wasm 模組,然後進行編譯和例項化,Promise 將解析為 ResultObject。因為 instantiateStreaming() 函式接受一個 Response 物件的 Promise,所以您可以直接將其傳遞給 fetch() 呼叫,它會在 Promise fulfilled 時將響應傳遞給該函式。

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 的 instance 成員,並呼叫其中包含的匯出函式。

注意: 要使此功能正常工作,伺服器應以 application/wasm MIME 型別返回 .wasm 檔案。

啟用 JavaScript 內建函式和全域性字串匯入

此示例在使用 instantiateStreaming() 編譯和例項化 Wasm 模組時,啟用了 JavaScript 字串內建函式和匯入的全域性字串常量,然後再執行匯出的 main() 函式(該函式將 "hello world!" 列印到控制檯)。線上檢視執行效果

js
const importObject = {
  // Regular import
  m: {
    log: console.log,
  },
};

const compileOptions = {
  builtins: ["js-string"], // Enable JavaScript string builtins
  importedStringConstants: "string_constants", // Enable imported global string constants
};

WebAssembly.instantiateStreaming(
  fetch("log-concat.wasm"),
  importObject,
  compileOptions,
).then((result) => result.instance.exports.main());

規範

規範
WebAssembly Web API
# dom-webassembly-instantiatestreaming

瀏覽器相容性

另見