WebAssembly.instantiate()

Baseline Widely available *

This feature is well established and works across many devices and browser versions. It’s been available across browsers since October 2017.

* Some parts of this feature may have varying levels of support.

Die Funktion WebAssembly.instantiate() ermöglicht es Ihnen, WebAssembly-Code zu kompilieren und zu instanziieren. Diese Funktion hat zwei Überladungen:

  • Die primäre Überladung nimmt den WebAssembly-Binärcode in Form eines Typed Arrays oder eines ArrayBuffer und führt sowohl die Kompilierung als auch die Instanziierung in einem Schritt durch. Das zurückgegebene Promise wird auf ein kompiliertes WebAssembly.Module und seine erste WebAssembly.Instance aufgelöst.
  • Die sekundäre Überladung nimmt ein bereits kompiliertes WebAssembly.Module und gibt ein Promise zurück, das auf eine Instance dieses Module aufgelöst wird. Diese Überladung ist nützlich, wenn das Module bereits kompiliert wurde.

Warnung: Diese Methode ist nicht die effizienteste Möglichkeit, um Wasm-Module abzurufen und zu instanziieren. Wenn möglich, sollten Sie stattdessen die neuere Methode WebAssembly.instantiateStreaming() verwenden, die ein Modul in einem Schritt direkt aus dem Roh-Bytecode abruft, kompiliert und instanziiert und daher keine Konvertierung in einen ArrayBuffer erfordert.

Syntax

js
// Taking Wasm binary code
WebAssembly.instantiate(bufferSource)
WebAssembly.instantiate(bufferSource, importObject)
WebAssembly.instantiate(bufferSource, importObject, compileOptions)

// Taking a module object instance
WebAssembly.instantiate(module)
WebAssembly.instantiate(module, importObject)
WebAssembly.instantiate(module, importObject, compileOptions)

Parameter

bufferSource

Ein Typed Array oder ArrayBuffer mit dem Binärcode des zu kompilierenden Wasm-Moduls oder ein WebAssembly.Module.

module

Das zu instanziierende WebAssembly.Module-Objekt.

importObject Optional

Ein Objekt, das die Werte enthält, die in die neu erstellte Instance importiert werden sollen, wie zum Beispiel Funktionen oder WebAssembly.Memory-Objekte. Es muss für jeden deklarierten Import des kompilierten Moduls eine übereinstimmende Eigenschaft vorhanden sein, sonst wird ein WebAssembly.LinkError ausgelöst.

compileOptions Optional

Ein Objekt mit Kompilierungsoptionen. Die Eigenschaften können Folgendes enthalten:

builtins Optional

Ein Array von Zeichenfolgen, das die Verwendung von JavaScript builtins im kompilierten Wasm-Modul ermöglicht. Die Zeichenfolgen definieren die zu aktivierenden Builtins. Derzeit ist der einzige verfügbare Wert "js-string", der JavaScript-String-Builtins aktiviert.

importedStringConstants Optional

Eine Zeichenfolge, die einen Namensraum für importierte globale Stringkonstanten angibt. Diese Eigenschaft muss angegeben werden, wenn Sie importierte globale Stringkonstanten im Wasm-Modul verwenden möchten.

Rückgabewert

Wenn ein bufferSource übergeben wird, gibt er ein Promise zurück, das auf ein ResultObject aufgelöst wird, das zwei Felder enthält:

Wenn ein module übergeben wird, gibt er ein Promise zurück, das auf ein WebAssembly.Instance-Objekt aufgelöst wird.

Ausnahmen

Beispiele

Hinweis: In den meisten Fällen werden Sie wahrscheinlich WebAssembly.instantiateStreaming() verwenden wollen, da es effizienter ist als instantiate().

Beispiel für die erste Überladung

Nachdem wir einige WebAssembly-Bytecode mithilfe von fetch abgerufen haben, kompilieren und instanziieren wir das Modul mithilfe der WebAssembly.instantiate()-Funktion, indem wir eine JavaScript-Funktion in das WebAssembly-Modul importieren. Dann rufen wir eine exportierte WebAssembly-Funktion auf, die vom Instance exportiert wird.

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());

Hinweis: Sie können dieses Beispiel auch unter index.html auf GitHub finden (sehen Sie es auch live).

Beispiel für die zweite Überladung

Das folgende Beispiel (sehen Sie unsere index-compile.html Demo auf GitHub und sehen Sie es live) kompiliert den geladenen simple.wasm-Bytecode mit der Methode WebAssembly.compileStreaming() und sendet ihn dann an einen Worker mittels postMessage().

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

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

Im Worker (siehe wasm_worker.js) definieren wir ein Importobjekt für das zu verwendende Modul und richten einen Ereignis-Handler ein, um das Modul vom Haupt-Thread zu empfangen. Wenn das Modul empfangen wird, erstellen wir eine Instanz daraus mithilfe der WebAssembly.instantiate()-Methode und rufen eine exportierte Funktion von innen auf.

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();
  });
};

Aktivieren von JavaScript-Builtins und globale String-Importe

Dieses Beispiel aktiviert JavaScript-String-Builtins und importierte globale Stringkonstanten beim Kompilieren und Instanziieren des Wasm-Moduls mit instantiate(), bevor die exportierte main()-Funktion ausgeführt wird (die "hello world!" in die Konsole ausgibt). Sehen Sie es live.

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
};

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

Spezifikationen

Specification
WebAssembly JavaScript Interface
# dom-webassembly-instantiate

Browser-Kompatibilität

Siehe auch