JS 写声明式组件、Compose Multiplatform 渲染的 UI 框架,引擎为 QuickJS(经 quickjs-kmp 接入)。Android / iOS 双端。
早期阶段。关键选型已定,M1 Counter 与 M2 列表页已在双端跑通(TSX → 模块字节码 → 引擎 → patch → Compose);进度见 docs/roadmap.md。
docs/ 设计文档、ADR、roadmap
packages/ npm 包:tinyui-core · tinyui-native · tinyui-cli
compose/ KMP 库 app.tinyui:tinyui(Compose Multiplatform 侧)
updates/ KMP 库 app.tinyui:tinyui-updates(热下发:校验、落盘、选择、回退,见 docs/updates.md)
schema/ 内置组件 schema(TS DSL),两侧契约的唯一真值,`pnpm schema` 生成
sample/ 示例 App(sample/js 与 sample/js-extra 是两个包的页面源码,Gradle 构建时经 CLI 编成字节码打进资源)
bench/ 响应式模型与引擎 benchmark
build-logic/ Gradle convention plugins
目录与命名依据见 docs/README.md。
- Kotlin:
implementation("app.tinyui:tinyui:<version>")(Maven Central;自带wang.harlon:quickjs-kmp);热下发另加app.tinyui:tinyui-updates,同版本号 - JS:
pnpm add tinyui-core tinyui-native与pnpm add -D tinyui-cli,三包同版本号;tinyui build用的 quickjs-kmp 宿主工具qjsc-kmp随tinyui-cli的依赖装好(macOS、Linux 预编译版)
版本号与 git tag 一致,不带 v 前缀,Maven 与 npm 三包同号同 tag 发:推 tag 触发 publish.yml,Maven 走 Sonatype,npm 走 trusted publishing(OIDC,无 token)。
版本号的真源是 packages/core/package.json:Kotlin 库的 TinyUI.version 由它生成,页面包的 tinyui 下限由它写入,所以源码构建与 Maven 产物报同一个数(docs/updates.md §1.1)。它另有四处镜像(native、cli 的 package.json,core 与 native 的 VERSION 导出),而 core 的 VERSION 会编进库内嵌的运行时字节码,所以改版本号一定伴随 RuntimeBytecode.kt 的重生成。只用脚本改:
pnpm version:set <x.y.z>:改五处并重生成字节码,连同改动一起进 PR;build.yml的pnpm version:check与pnpm runtime:check保证一致- 合入 main 后打同号 tag 推送。
publish.yml先跑versionsjob 核对五处等于 tag、字节码是最新的,不符则 Maven 与 npm 都不发 - 想先看 npm 会发什么:Actions 里手动跑
publish.yml,只做--dry-run
pnpm install # Node 22+,pnpm 10
./gradlew build # compose 库 + 测试(Android host / iOS simulator)+ sample APK + iOS framework;需要 JDK 25、Android SDK、Xcode
pnpm build && pnpm test # 三个 npm 包
pnpm schema # 改了 schema/ 之后重新生成两侧代码
pnpm runtime # 改了 packages/core、packages/native 或升了 quickjs-kmp 之后,重新生成库内置的运行时字节码sample 的 Gradle 构建会调 tinyui build 把 sample/js 编成字节码,qjsc-kmp 来自 pnpm install 装好的 npm 包;Android host 测试还需要宿主 JNI 库。两种来源:
- 本地联调:
local.properties加quickjs-kmp.dir=<quickjs-kmp 仓路径>,SDK 从源码构建(composite build),qjsc-kmp与 JNI 库都由该仓的任务自动编出,零配置 - 否则:
TINYUI_QUICKJS_HOST_JNI指向含libquickjs_kmp的目录(CI 的做法见.github/workflows/build.yml);没有预编译qjsc-kmp的平台再用TINYUI_QJSC指向自己编的那份