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.
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.
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.