Артефакт WebImage компілює байт-код JVM у завантажувач на JavaScript і модуль WASM. Як запустити наявний бінарний
файл WASM або WASI, описано на сторінці WebAssembly.
Вимоги
- Binaryen 119 або новіший, з
wasm-asуPATHпід час збирання. - Код, що відповідає вимогам Native Image: метадані досяжності для рефлексії, ресурсів і проксі; жодних нативних залежностей.
- Хост з обробкою винятків WASM (і WASM GC для
wasm-gc): Node.js 25+ або сучасний браузер.
Розгорнутому бандлу не потрібні ні Elide, ні Binaryen.
Збирання повного проєкту
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 збирає app-jar, потім компілює його у web. name — базова назва без .js і .wasm;
optimization = "b" — режим швидкого збирання. Результат записується в .dev/artifacts/native-image/:
| Файл | Призначення |
|---|---|
hello.js | Завантажувач на JavaScript і точка входу. |
hello.js.wasm | Модуль WASM, який завантажує hello.js. |
hello.js.wat | Текстова форма WASM для перегляду. |
hello.js.map | Мапа вихідного коду для завантажувача, якщо sourceMap = true. |
Розгортайте hello.js і hello.js.wasm разом. Kotlin та інші мови JVM працюють так само, якщо їх запаковано в JAR.
Влучання в кеш відновлює весь бандл; вимкнення sourceMap видаляє старий .js.map.
Вибір бекенда й хоста
| Властивість | Значення | Зміст |
|---|---|---|
backend | "wasm-gc" (за замовчуванням) | Використовує збирач сміття WASM хоста. |
backend | "wasm-lm" | Використовує збирач сміття в лінійній пам’яті; завантажувач однаково потрібен, це не бінарний файл WASI. |
runtime | "generic" (за замовчуванням) | Завантажувач підтримує браузери й Node. |
runtime | "browser" | Завантажувач, спеціалізований для браузерів. |
runtime | "node" | Завантажувач, спеціалізований для API, сумісних із Node. |
autoRun | true (за замовчуванням) | Запускає програму, щойно завантажувач завантажено; false залишає запуск сторінці, що його вбудовує. |
sourceMap | false (за замовчуванням) | true створює hello.js.map. |
Точка входу обов’язкова навіть з autoRun = false. Жодне значення runtime не призначене для Cloudflare Workers,
Fastly Compute чи WASI. Спільні поля (from, entrypoint, moduleName, options) описано в розділі
Native Image. WebImage не може бути входом
артефакту для контейнера.
Посібники для цілей: Browser WASM і Edge WASM.
Запуск на серверному хості
З runtime = "generic" або "node":
node .dev/artifacts/native-image/hello.jsHello from WebImageЗапуск у браузері
З runtime = "browser" або "generic" і autoRun = true покладіть цей index.html у
.dev/artifacts/native-image/:
<!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Відкрийте http://localhost:8000/; вивід з’явиться в консолі браузера. URL-адреси file:// не працюють.
Параметри компілятора
Блок options артефакту приймає параметри компілятора Native Image;
які з них діють, залежить від бекенда. Два випадки стосуються лише WebImage:
options.driverMode = "external"використовуєnative-imageзGRAALVM_HOMEабоJAVA_HOME; це встановлення має підтримувати бекенди WebAssembly.-H:EntryPointsConfig=config/entrypoints.jsonвoptions.flagsзадає точки входу; шлях вказується відносно кореня проєкту, а зміна файлу запускає повторне збирання.
Компіляція без маніфесту проєкту
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 HelloБандли записуються в поточний каталог. Артефакт NativeImage з --tool:wasm-gc або --tool:wasm-lm в
options.flags і далі збирається. Щоб перевести його на новий вигляд, замініть клас на WebImage, приберіть прапорець
і type, якщо він є, і задайте backend.
Усунення несправностей
| Симптом | Розв’язання |
|---|---|
wasm-as не знайдено | Встановіть Binaryen і додайте його до PATH збирання. |
| Зовнішній драйвер відхиляє бекенд WebAssembly | Вкажіть у GRAALVM_HOME або JAVA_HOME встановлення, чий native-image його підтримує, або використайте driverMode = "embedded". |
| Суперечливі низькорівневі параметри | Приберіть прапорці бекенда, середовища виконання, запуску й мапи вихідного коду; використовуйте типізовані властивості. Не перевизначайте Backend і властивість лаунчера. |
| Хост відхиляє інструкції WASM | Використовуйте хост з обробкою винятків і, для wasm-gc, з WASM GC. |
| Браузер не може завантажити модуль | Роздавайте завантажувач і модуль разом через HTTP; перевірте запитувану URL-адресу. |
elide run hello.js.wasm повідомляє про відсутні імпорти | Запустіть натомість hello.js; модулю потрібен його завантажувач. |