Node.js mit WebAssembly
WebAssembly ist eine leistungsstarke, assemblerähnliche Sprache, die aus verschiedenen Sprachen kompiliert werden kann, darunter C/C++, Rust und AssemblyScript. Derzeit wird sie 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
.
Wichtige Konzepte
- Modul - Eine kompilierte WebAssembly-Binärdatei, d. h. eine
.wasm
-Datei. - Speicher - Ein ArrayBuffer mit variabler Größe.
- Tabelle - Ein Typed Array mit variabler Größe von Referenzen, die nicht im Speicher gespeichert sind.
- Instanz - Eine Instanziierung eines Moduls mit seinem Speicher, seiner Tabelle und seinen Variablen.
Um WebAssembly zu verwenden, 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]
}
*/
Generieren von WebAssembly-Modulen
Es gibt verschiedene Methoden zum Generieren von WebAssembly-Binärdateien, darunter:
- Schreiben von WebAssembly (
.wat
) von Hand und Konvertieren in das Binärformat mithilfe von Tools wie wabt. - Verwenden von emscripten mit einer C/C++-Anwendung
- Verwenden von wasm-pack mit einer Rust-Anwendung
- Verwenden von AssemblyScript, wenn Sie eine TypeScript-ähnliche Erfahrung bevorzugen
TIP
Einige dieser Tools generieren nicht nur die Binärdatei, sondern auch den JavaScript-"Glue"-Code und die entsprechenden HTML-Dateien zur Ausführung im Browser.
Wie man es benutzt
Sobald Sie ein WebAssembly-Modul haben, können Sie das Node.js WebAssembly
-Objekt verwenden, um es zu instanziieren.
const fs = require('node:fs')
const wasmBuffer = fs.readFileSync('/path/to/add.wasm')
WebAssembly.instantiate(wasmBuffer).then(wasmModule => {
// Exportierte Funktionen befinden sich 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 Betriebssystemfunktionen zugreifen. Ein Drittanbieter-Tool Wasmtime kann verwendet werden, um auf diese Funktionalität zuzugreifen. Wasmtime
nutzt die WASI API, um auf die Betriebssystemfunktionalität zuzugreifen.