diff options
| author | ketsuban <ketsuban@kukuri.dev> | 2026-08-28 18:40:24 +0000 |
|---|---|---|
| committer | ketsuban <ketsuban@kukuri.dev> | 2026-08-28 18:40:24 +0000 |
| commit | 8799a45024cc80b5720a1c56bb7e658edf190962 (patch) | |
| tree | 5f7a35c7d915415ad9041fb5037cc3f11709328c | |
| parent | b399dbd6ab6d0597998d0fe068c2178bf6d4dfa4 (diff) | |
| download | kukuri-8799a45024cc80b5720a1c56bb7e658edf190962.tar.gz kukuri-8799a45024cc80b5720a1c56bb7e658edf190962.tar.bz2 kukuri-8799a45024cc80b5720a1c56bb7e658edf190962.zip | |
Ship Compose-for-Wasm UI as the live web app
Root cause of earlier wasm OOM: kotlin.daemon.jvmargs=1024m in
gradle.properties (CLI -Dkotlin.daemon.jvmargs is ignored for daemon
matching). Measured on this 4GB box with daemon heap bisect:
1280m OOM / 1536m OK (dev), production webpack OK at 2048m
(peak: kotlin daemon ~2.0GB + gradle daemon ~0.55GB + node 0.15GB).
- gradle.properties: kotlin.daemon.jvmargs=-Xmx2048m -XX:+UseSerialGC
- orgflow-ui: wasmJs browser target, CanvasBasedWindow entry, index.html
with ComposeTarget canvas + loading overlay
- bundleWeb: package production webpack output + index.html (13MB:
orgflow-ui.js 0.5MB + app.wasm 8.4MB + skiko.wasm 2.8MB)
- web/ now renders the full OrgFlowApp in-browser instead of the
domain banner/DOM report page
| -rw-r--r-- | gradle.properties | 2 | ||||
| -rw-r--r-- | modules/orgflow-domain/build.gradle.kts | 7 | ||||
| -rw-r--r-- | modules/orgflow-ui/build.gradle.kts | 3 | ||||
| -rw-r--r-- | modules/orgflow-ui/src/wasmJsMain/kotlin/jp/orgflow/ui/Main.kt | 10 | ||||
| -rw-r--r-- | modules/orgflow-ui/src/wasmJsMain/resources/index.html | 20 |
5 files changed, 39 insertions, 3 deletions
diff --git a/gradle.properties b/gradle.properties index 958e132..18a9480 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ org.gradle.jvmargs=-Xmx1536m -XX:MaxMetaspaceSize=512m -kotlin.daemon.jvmargs=-Xmx1024m +kotlin.daemon.jvmargs=-Xmx2048m -XX:+UseSerialGC org.gradle.parallel=true org.gradle.caching=true org.gradle.configuration-cache=true diff --git a/modules/orgflow-domain/build.gradle.kts b/modules/orgflow-domain/build.gradle.kts index 23a90ce..0d06289 100644 --- a/modules/orgflow-domain/build.gradle.kts +++ b/modules/orgflow-domain/build.gradle.kts @@ -101,8 +101,11 @@ tasks.register<Zip>("bundleWasmNode") { tasks.register<Zip>("bundleWeb") { group = "deployment" - dependsOn("assemble") - from(layout.buildDirectory.dir("dist/wasmJs/productionExecutable")) + dependsOn(project(":modules:orgflow-ui").tasks.named("wasmJsBrowserProductionWebpack")) + from(project(":modules:orgflow-ui").layout.buildDirectory.dir("kotlin-webpack/wasmJs/productionExecutable")) + from(project(":modules:orgflow-ui").layout.buildDirectory.dir("processedResources/wasmJs/main")) { + include("index.html") + } archiveFileName.set("kukuri-wasm-web-${project.version}.zip") } diff --git a/modules/orgflow-ui/build.gradle.kts b/modules/orgflow-ui/build.gradle.kts index 4c66f03..9ad30f3 100644 --- a/modules/orgflow-ui/build.gradle.kts +++ b/modules/orgflow-ui/build.gradle.kts @@ -12,6 +12,9 @@ version = "0.1.0" kotlin { jvm() + @OptIn(org.jetbrains.kotlin.gradle.targets.js.dsl.ExperimentalWasmDsl::class) + wasmJs { browser(); binaries.executable() } + sourceSets { commonMain.dependencies { implementation(compose.runtime) diff --git a/modules/orgflow-ui/src/wasmJsMain/kotlin/jp/orgflow/ui/Main.kt b/modules/orgflow-ui/src/wasmJsMain/kotlin/jp/orgflow/ui/Main.kt new file mode 100644 index 0000000..790cd78 --- /dev/null +++ b/modules/orgflow-ui/src/wasmJsMain/kotlin/jp/orgflow/ui/Main.kt @@ -0,0 +1,10 @@ +package jp.orgflow.ui + +import androidx.compose.ui.window.CanvasBasedWindow + +@OptIn(androidx.compose.ui.ExperimentalComposeUiApi::class) +fun main() { + CanvasBasedWindow(title = "kukuri OrgFlow") { + OrgFlowApp() + } +} diff --git a/modules/orgflow-ui/src/wasmJsMain/resources/index.html b/modules/orgflow-ui/src/wasmJsMain/resources/index.html new file mode 100644 index 0000000..ea7248c --- /dev/null +++ b/modules/orgflow-ui/src/wasmJsMain/resources/index.html @@ -0,0 +1,20 @@ +<!doctype html> +<html lang="en"> +<head> +<meta charset="utf-8"> +<title>kukuri OrgFlow</title> +<style> +html, body { margin: 0; height: 100%; overflow: hidden; background: #fff; } +#ComposeTarget { width: 100%; height: 100%; display: block; } +#loading { position: absolute; top: 45%; width: 100%; text-align: center; font-family: system-ui, sans-serif; color: #6750a4; } +</style> +</head> +<body> +<canvas id="ComposeTarget"></canvas> +<div id="loading">loading kukuri OrgFlow (Compose/Wasm)…</div> +<script> + window.addEventListener("load", () => document.getElementById("loading")?.remove()); +</script> +<script src="orgflow-ui.js"></script> +</body> +</html> |
