Перейти к содержимому

Edge WASM

Собирайте WebAssembly с линейной памятью из Java или Kotlin с помощью Elide: размеры бандлов, требования к хосту и среды выполнения, которые запускают результат.

На этой странице

Артефакт WebImage с backend = "wasm-lm" компилирует Java или Kotlin в WebAssembly для JavaScript-хостов, которые компилируют WebAssembly во время выполнения. Модуль держит свою кучу и сборщик мусора в линейной памяти, поэтому хосту не нужна поддержка WasmGC. Как и сборка для браузера, он запускается через свой загрузчик на JavaScript; это не модуль и не компонент WASI, и он не развёртывается в Cloudflare Workers.

Сборка

Требования те же, что у сборки для браузера: wasm-as из Binaryen в PATH и код, отвечающий требованиям Native Image.

amends "elide:project.pkl"
import "elide:Jvm.pkl" as jvm
import "elide:NativeImage.pkl" as nativeImage

name = "hello-edge"

artifacts {
  ["app-jar"] = new jvm.Jar {
    sources { "main" }
  }
  ["edge"] = new nativeImage.WebImage {
    from { "app-jar" }
    name = "hello"
    entrypoint = "Hello"
    backend = "wasm-lm"
    runtime = "node"
  }
}
elide build
node .dev/artifacts/native-image/hello.js

Без манифеста:

elide javac -- -d classes Hello.java
elide native-image -- --tool:wasm-lm -cp classes -o hello Hello
СвойствоЗначение для Edge
backend"wasm-lm".
runtime"node" для Node-совместимых API; "generic" также определяет API браузера.
autoRuntrue (по умолчанию) запускает main при загрузке hello.js.

Результат и размер

ФайлРазвёртыватьРазмер hello world
hello.jsДа: загрузчик.42 КБ
hello.js.wasmДа: модуль.2,1 МБ (660 КБ в gzip)
hello.js.watНет: текстовая форма для изучения.38 МБ
hello.js.mapПо желанию: создаётся при sourceMap = true.

Модуль с линейной памятью больше, чем сборка WasmGC той же программы, которая использует сборщик мусора хоста.

Требования к хосту

ТребованиеПричина
Обработка исключений WebAssembly с exnrefМодуль её использует.
Компиляция WebAssembly из байтов во время выполненияЗагрузчик читает hello.js.wasm и компилирует его при запуске.
fs из Node или fetchЗагрузчик читает модуль через одно из них.
ХостЗапускает бандл
Node.js 25+Да: node hello.js.
BunДа: bun hello.js.
Cloudflare WorkersНет: Workers компилирует только модули, включённые в бандл при развёртывании, и отклоняет компиляцию загрузчиком во время выполнения с ошибкой Wasm code generation disallowed by embedder.
Хосты WASI (Fastly Compute, Wasmtime)Нет: модуль импортирует из своего загрузчика на JavaScript, а не из WASI.

Была ли эта страница полезной?