Ein WebImage-Artefakt kompiliert JVM-Bytecode zu einem JavaScript-Loader plus einem WASM-Modul. Wie Sie ein
vorhandenes WASM- oder WASI-Binary ausführen, beschreibt WebAssembly.
Voraussetzungen
- Binaryen 119 oder neuer, mit
wasm-asauf demPATHzur Build-Zeit. - Code, der die Anforderungen von Native Image erfüllt: Reachability-Metadaten für Reflection, Ressourcen und Proxys; keine nativen Abhängigkeiten.
- Ein Host mit WASM-Ausnahmebehandlung (und WASM GC für
wasm-gc): Node.js 25+ oder ein aktueller Browser.
Das ausgelieferte Bundle braucht weder Elide noch Binaryen.
Ein vollständiges Projekt bauen
hello-wasm/
elide.pkl
src/main/java/Hello.javapublic class Hello {
public static void main(String[] args) {
System.out.println("Hello from WebImage");
}
}amends "elide:project.pkl"
import "elide:Jvm.pkl" as jvm
import "elide:NativeImage.pkl" as nativeImage
name = "hello-wasm"
artifacts {
["app-jar"] = new jvm.Jar {
sources { "main" }
}
["web"] = new nativeImage.WebImage {
from { "app-jar" }
name = "hello"
entrypoint = "Hello"
backend = "wasm-gc"
runtime = "generic"
autoRun = true
sourceMap = false
options {
optimization = "b"
}
}
}elide buildElide baut app-jar und kompiliert es dann zu web. name ist der Basisname ohne .js oder .wasm;
optimization = "b" ist der Schnell-Build-Modus. Die Ausgabe landet in .dev/artifacts/native-image/:
| Datei | Zweck |
|---|---|
hello.js | JavaScript-Loader und Einstiegspunkt. |
hello.js.wasm | WASM-Modul, von hello.js geladen. |
hello.js.wat | WASM-Textform, zur Inspektion. |
hello.js.map | Source Map für den Loader, bei sourceMap = true. |
Liefern Sie hello.js und hello.js.wasm zusammen aus. Kotlin und andere JVM-Sprachen funktionieren genauso, sobald
sie in einem JAR verpackt sind. Ein Cache-Treffer stellt das ganze Bundle wieder her; wird sourceMap abgeschaltet,
verschwindet die alte .js.map.
Backend und Host wählen
| Eigenschaft | Wert | Bedeutung |
|---|---|---|
backend | "wasm-gc" (Standard) | Verwendet den WASM-Garbage-Collector des Hosts. |
backend | "wasm-lm" | Verwendet einen Garbage Collector im linearen Speicher; braucht trotzdem den Loader, kein WASI-Binary. |
runtime | "generic" (Standard) | Der Loader unterstützt Browser und Node. |
runtime | "browser" | Loader speziell für Browser. |
runtime | "node" | Loader speziell für Node-kompatible APIs. |
autoRun | true (Standard) | Startet das Programm, sobald der Loader geladen ist; false überlässt den Start der einbettenden Seite. |
sourceMap | false (Standard) | true erzeugt hello.js.map. |
Ein Einstiegspunkt ist auch mit autoRun = false erforderlich. Kein runtime zielt auf Cloudflare Workers, Fastly
Compute oder WASI. Gemeinsame Felder (from, entrypoint, moduleName, options) sind unter
Native Image aufgeführt. Ein WebImage kann nicht die Eingabe eines
Container-Artefakts sein.
Zielanleitungen: Browser WASM und Edge WASM.
Auf einem Backend-Host ausführen
Mit runtime = "generic" oder "node":
node .dev/artifacts/native-image/hello.jsHello from WebImageIm Browser ausführen
Legen Sie bei runtime = "browser" oder "generic" und autoRun = true diese index.html in
.dev/artifacts/native-image/ ab:
<!doctype html>
<html lang="en">
<meta charset="utf-8" />
<title>Hello WebImage</title>
<body>
<p>Open the browser console to see the application output.</p>
<script src="./hello.js"></script>
</body>
</html>elide dev --no-tui --port 8000 .dev/artifacts/native-imageÖffnen Sie http://localhost:8000/; die Ausgabe erscheint in der Browserkonsole. file://-URLs funktionieren nicht.
Compiler-Optionen
Der Block options des Artefakts nimmt die
Compiler-Optionen von Native Image an; welche davon greifen, hängt vom
Backend ab. Zwei Fälle betreffen nur WebImage:
options.driverMode = "external"verwendetnative-imageausGRAALVM_HOMEoderJAVA_HOME; diese Installation muss die WebAssembly-Backends unterstützen.-H:EntryPointsConfig=config/entrypoints.jsoninoptions.flagslegt Einstiegspunkte fest; der Pfad ist relativ zum Projektwurzelverzeichnis, und eine Änderung der Datei löst einen neuen Build aus.
Ohne Projektmanifest kompilieren
elide javac -- -d classes src/main/java/Hello.java
elide native-image -- --tool:wasm-gc -Ob -cp classes -o hello Hello
elide native-image -- --tool:wasm-lm -Ob -cp classes -o hello-lm HelloDie Bundles landen im aktuellen Verzeichnis. Ein NativeImage-Artefakt mit --tool:wasm-gc oder --tool:wasm-lm in
options.flags baut weiterhin. Zur Migration ändern Sie die Klasse in WebImage, entfernen das Flag und ein etwaiges
type und setzen backend.
Fehlerbehebung
| Symptom | Lösung |
|---|---|
wasm-as nicht gefunden | Installieren Sie Binaryen und nehmen Sie es in den PATH des Builds auf. |
| Der externe Treiber lehnt das WebAssembly-Backend ab | Lassen Sie GRAALVM_HOME oder JAVA_HOME auf eine Installation zeigen, deren native-image es unterstützt, oder verwenden Sie driverMode = "embedded". |
| Widersprüchliche Rohoptionen | Entfernen Sie Flags für Backend, Laufzeit, Start und Source Map; verwenden Sie die typisierten Eigenschaften. Überschreiben Sie weder Backend noch die Launcher-Eigenschaft. |
| Der Host lehnt WASM-Instruktionen ab | Verwenden Sie einen Host mit Ausnahmebehandlung und, für wasm-gc, WASM GC. |
| Der Browser kann das Modul nicht laden | Liefern Sie Loader und Modul gemeinsam über HTTP aus; prüfen Sie die angeforderte URL. |
elide run hello.js.wasm meldet fehlende Importe | Führen Sie stattdessen hello.js aus; das Modul braucht seinen Loader. |