Skip to content

Node.js mit WebAssembly

WebAssembly ist eine hochleistungsfähige, assemblerähnliche Sprache, die aus verschiedenen Sprachen wie C/C++, Rust und AssemblyScript kompiliert werden kann. Sie wird derzeit von Chrome, Firefox, Safari, Edge und Node.js unterstützt!

Die WebAssembly-Spezifikation beschreibt zwei Dateiformate: ein binäres Format namens WebAssembly-Modul mit der Erweiterung .wasm und eine entsprechende Textdarstellung namens WebAssembly-Textformat mit der Erweiterung .wat.

Schlüsselkonzepte

  • Modul - Eine kompilierte WebAssembly-Binärdatei, d.h. eine .wasm-Datei.
  • Speicher - Ein veränderbarer ArrayBuffer.
  • Tabelle - Ein veränderbares, typisiertes Array von Referenzen, das nicht im Speicher abgelegt wird.
  • Instanz - Eine Instanziierung eines Moduls mit seinem Speicher, seiner Tabelle und seinen Variablen.

Um WebAssembly verwenden zu können, benötigen Sie eine .wasm-Binärdatei und eine Reihe von APIs zur Kommunikation mit WebAssembly. Node.js stellt die notwendigen APIs über das globale WebAssembly-Objekt bereit.

javascript
console.log(WebAssembly)
/*
Object [WebAssembly] {
  compile: [Function: compile],
  validate: [Function: validate],
  instantiate: [Function: instantiate]
}
*/

Erzeugen von WebAssembly-Modulen

Es gibt mehrere Methoden zum Erzeugen von WebAssembly-Binärdateien, darunter:

  • Manuelles Schreiben von WebAssembly (.wat) und Konvertieren in das binäre Format mit Tools wie wabt.
  • Verwendung von emscripten mit einer C/C++-Anwendung
  • Verwendung von wasm-pack mit einer Rust-Anwendung
  • Verwendung von AssemblyScript, wenn Sie eine TypeScript-ähnliche Erfahrung bevorzugen

TIP

Einige dieser Tools erzeugen nicht nur die Binärdatei, sondern auch den JavaScript-"Glue"-Code und die entsprechenden HTML-Dateien, um sie im Browser auszuführen.

Wie man es benutzt

Sobald Sie ein WebAssembly-Modul haben, können Sie es mit dem Node.js WebAssembly-Objekt instanziieren.

javascript
const fs = require('node:fs')
const wasmBuffer = fs.readFileSync('/path/to/add.wasm')
WebAssembly.instantiate(wasmBuffer).then(wasmModule => {
  // Exportierte Funktionen leben unter instance.exports
  const { add } = wasmModule.instance.exports
  const sum = add(5, 6)
  console.log(sum) // Gibt aus: 11
})

Interaktion mit dem Betriebssystem

WebAssembly-Module können nicht direkt auf eigene Faust auf Betriebssystemfunktionen zugreifen. Ein Drittanbieter-Tool Wasmtime kann verwendet werden, um auf diese Funktionen zuzugreifen. Wasmtime nutzt die WASI-API, um auf die Betriebssystemfunktionen zuzugreifen.

Ressourcen