Einleitung: Warum WebAssembly und TypeScript das ideale Paar sind
Die moderne Webentwicklung erfordert zunehmend höhere Leistung, insbesondere in Bereichen wie Bildverarbeitung, 3D-Grafik, Kryptographie und Spiele. WebAssembly (Wasm) hat sich als revolutionäre Lösung erwiesen, die es ermöglicht, Code mit nahezu nativer Geschwindigkeit auszuführen. Allerdings kann die direkte Arbeit mit Wasm auf niedriger Ebene komplex sein. Hier kommt TypeScript ins Spiel – eine streng typisierte Sprache, die sich hervorragend mit WebAssembly kombinieren lässt.
In diesem Artikel werden wir untersuchen, wie man effektiv mit WebAssembly in TypeScript-Projekten arbeitet. Sie erfahren mehr über die Kompilierung von C/C++ und Rust zu Wasm, die Verwendung von AssemblyScript zum Schreiben von Wasm-Modulen in einer TypeScript-ähnlichen Syntax sowie über die besten Praktiken für die Integration.
Grundlagen von WebAssembly und seine Interaktion mit TypeScript
Was ist WebAssembly?
WebAssembly ist ein binäres Befehlsformat für eine stackbasierte virtuelle Maschine. Es wurde als portables Kompilierungsziel für höhere Programmiersprachen entwickelt. Wasm-Module werden im Browser mit nahezu nativer Geschwindigkeit ausgeführt und bieten eine strenge Speicherisolierung.
Typische Anwendungsszenarien für Wasm in TypeScript
- Rechenintensive Aufgaben – Video-, Audio- und Bildverarbeitung
- Kryptographische Operationen – Hashing, Verschlüsselung
- Spiele-Engines – Physik, Rendering
- Compiler und Parser – Syntaxanalyse großer Dateien
Interaktionsarchitektur
TypeScript-Code (kompiliert zu JavaScript) fungiert als "Kleber" zwischen dem Browser und dem Wasm-Modul. Der JS-Code lädt das Modul, ruft dessen Funktionen auf und verarbeitet die Ergebnisse. Das Wasm-Modul kann wiederum JS-Funktionen über Imports aufrufen.
Möglichkeiten zur Erstellung von WebAssembly-Modulen für TypeScript
1. Kompilierung von C/C++ mit Emscripten
Emscripten ist das ausgereifteste Werkzeug zur Kompilierung von C/C++ zu Wasm. Es generiert sowohl die Binärdatei (.wasm) als auch einen JS-Wrapper für den bequemen Aufruf aus TypeScript.
Beispiel einer C-Funktion:
// math.c#include <emscripten.h>
EMSCRIPTEN_KEEPALIVEint add(int a, int b) { return a + b;}Kompilierung:
emcc math.c -o math.js -s EXPORTED_FUNCTIONS='["_add"]' -s EXPORTED_RUNTIME_METHODS='["ccall"]'Verwendung in TypeScript:
// math.tsinterface EmscriptenModule { ccall: (name: string, returnType: string, argTypes: string[], args: any[]) => any;}
const Module = await import('./math.js') as unknown as EmscriptenModule;const result = Module.ccall('add', 'number', ['number', 'number'], [5, 3]);console.log(result); // 82. Verwendung von Rust mit wasm-pack
Rust ist eine moderne Systemprogrammiersprache, die sich hervorragend zu Wasm kompilieren lässt. Das Tool wasm-pack automatisiert die Erstellung von npm-Paketen aus Rust-Code.
Beispiel einer Rust-Funktion:
// lib.rsuse wasm_bindgen::prelude::*;
#[wasm_bindgen]pub fn fibonacci(n: u32) -> u32 { match n { 0 => 0, 1 => 1, _ => fibonacci(n - 1) + fibonacci(n - 2), }}Einbindung in TypeScript:
// app.tsimport init, { fibonacci } from 'my-wasm-package';
await init();console.log(fibonacci(10)); // 553. AssemblyScript – TypeScript für WebAssembly
AssemblyScript ist eine streng typisierte Teilmenge von TypeScript, die direkt zu WebAssembly kompiliert wird. Es ist die ideale Wahl für Entwickler, die Wasm-Code in einer vertrauten Syntax schreiben möchten.
Beispiel eines AssemblyScript-Moduls:
// assembly/index.tsexport function factorial(n: i32): i32 { if (n <= 1) return 1; return n * factorial(n - 1);}Kompilierung: