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 verfügt über zwei Überladungen:
- Die primäre Überladung nimmt den WebAssembly-Binärcode in Form eines typisierten Arrays oder eines
ArrayBuffer
und führt sowohl die Kompilierung als auch die Instanziierung in einem Schritt durch. Das zurückgegebenePromise
löst sich zu einem kompiliertenWebAssembly.Module
und seiner erstenWebAssembly.Instance
auf. - Die sekundäre Überladung nimmt ein bereits kompiliertes
WebAssembly.Module
und gibt einPromise
zurück, das sich zu einerInstance
diesesModuls
auflöst. Diese Überladung ist nützlich, wenn dasModul
bereits kompiliert wurde.
Warnung: Diese Methode ist nicht die effizienteste Art, 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 Rohbytecode abruft, kompiliert und instanziiert, und daher keine Konvertierung in einen ArrayBuffer
erfordert.
Syntax
// 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 typisiertes Array oder
ArrayBuffer
, das den Binärcode des Wasm-Moduls enthält, das Sie kompilieren möchten, oder einWebAssembly.Module
.module
Das
WebAssembly.Module
-Objekt, das instanziiert werden soll.importObject
OptionalEin Objekt, das die Werte enthält, die in die neu erstellte
Instance
importiert werden sollen, wie etwa Funktionen oderWebAssembly.Memory
-Objekte. Es muss eine übereinstimmende Eigenschaft für jeden deklarierten Import des kompilierten Moduls vorhanden sein, andernfalls wird einWebAssembly.LinkError
ausgelöst.compileOptions
OptionalEin Objekt, das Kompilierungsoptionen enthält. Eigenschaften können Folgendes umfassen:
builtins
OptionalEin Array von Zeichenketten, das die Verwendung von JavaScript-Builtins im kompilierten Wasm-Modul ermöglicht. Die Zeichenketten definieren die Builtins, die Sie aktivieren möchten. Derzeit ist der einzige verfügbare Wert
"js-string"
, der JavaScript-String-Builtins aktiviert.importedStringConstants
OptionalEine Zeichenkette, die einen Namespace für importierte globale Zeichenkettenkonstanten angibt. Diese Eigenschaft muss angegeben werden, wenn Sie importierte globale Zeichenkettenkonstanten im Wasm-Modul verwenden möchten.
Rückgabewert
Wenn ein bufferSource
übergeben wird, gibt es ein Promise
zurück, das sich zu einem ResultObject
mit zwei Feldern auflöst:
module
: EinWebAssembly.Module
-Objekt, das das kompilierte WebAssembly-Modul darstellt. DiesesModul
kann erneut instanziiert, überpostMessage()
geteilt oder gecached werden.instance
: EinWebAssembly.Instance
-Objekt, das alle Exportierten WebAssembly-Funktionen enthält.
Wenn ein module
übergeben wird, gibt es ein Promise
zurück, das sich zu einem WebAssembly.Instance
-Objekt auflöst.
Ausnahmen
- Wenn einer der Parameter nicht den richtigen Typ oder die richtige Struktur hat, wird das Promise mit einem
TypeError
abgelehnt. - Wenn die Operation fehlschlägt, wird das Promise mit einem
WebAssembly.CompileError
,WebAssembly.LinkError
oderWebAssembly.RuntimeError
abgelehnt, je nach Ursache des Fehlers.
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
Nach dem Abrufen einiger WebAssembly-Bytecodes mit fetch kompilieren und instanziieren wir das Modul mithilfe der Funktion WebAssembly.instantiate()
, wobei wir eine JavaScript-Funktion in das WebAssembly-Modul importieren. Dann rufen wir eine Exportierte WebAssembly-Funktion auf, die von der Instance
exportiert wird.
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: Dieses Beispiel finden Sie auch unter index.html auf GitHub (auch live ansehen).
Beispiel für die zweite Überladung
Das folgende Beispiel (siehe unser index-compile.html Demo auf GitHub und auch live ansehen) kompiliert den geladenen simple.wasm-Bytecode mit der Methode WebAssembly.compileStreaming()
und sendet ihn dann an einen Worker mithilfe von postMessage()
.
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 Modul zur Verwendung, richten dann einen Ereignishandler ein, um das Modul vom Hauptthread zu empfangen. Wenn das Modul empfangen wird, erstellen wir eine Instanz daraus mithilfe der Methode WebAssembly.instantiate()
und rufen eine exportierte Funktion von innen auf.
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 globalen Zeichenkettenimporten
Dieses Beispiel aktiviert JavaScript-String-Builtins und importierte globale Zeichenkettenkonstanten beim Kompilieren und Instanziieren des Wasm-Moduls mit instantiate()
, bevor die exportierte main()
Funktion ausgeführt wird (die "hello world!"
in die Konsole protokolliert). Hier live sehen.
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 |