Kotlin/Wasm¶
Kotlin/Wasm 把 Kotlin 代码编译为 WebAssembly。Wasm 是一种面向栈式虚拟机的二进制指令格式,可以在浏览器和其他支持 Wasm 的运行时中执行。它为 Kotlin 提供了 JVM、JS、Native 之外的另一个重要编译目标。
Wasm 解决什么问题¶
Wasm 的目标是让多种语言以接近原生的形式运行在统一虚拟机上。对 Kotlin 来说,Kotlin/Wasm 常见价值包括:
- 在浏览器中运行 Kotlin 应用。
- 配合 Compose Multiplatform 构建 Web UI。
- 通过 WASI 在浏览器外运行 Wasm 程序。
- 在未来 Web 平台上获得比传统 JS 编译目标更好的性能潜力。
Java 对比:Java Applet 曾试图把 JVM 带进浏览器,但早已退出历史。Kotlin/Wasm 不是在浏览器里运行 JVM,而是编译到 WebAssembly 这一现代 Web 标准目标。
浏览器目标¶
Kotlin/Wasm 可以在浏览器中运行,但浏览器需要支持 WebAssembly GC 和旧版异常处理 proposal 等能力。实际项目上线前要确认目标用户的浏览器支持情况。
Web 目标通常使用 wasm-js:
kotlin {
wasmJs {
browser()
binaries.executable()
}
}
Compose Multiplatform for Web 也以 Kotlin/Wasm 作为重要目标。
与 Compose Multiplatform¶
官方文档强调 Kotlin/Wasm 与 Compose Multiplatform 的组合:使用声明式 Kotlin UI,在 Android、桌面、iOS 和 Web 等目标之间复用 UI 或 UI 架构。
浏览器中的 Compose Multiplatform 应用通常:
- 使用 Kotlin/Wasm 编译。
- 运行在支持 Wasm GC 的浏览器。
- 通过 Gradle 任务生成可发布的静态网站产物。
示例构建任务:
./gradlew wasmJsBrowserDistribution
产物通常位于类似:
webApp/build/dist/wasmJs/productionExecutable
WASI:浏览器外 Wasm¶
WASI 是 WebAssembly System Interface,用于让 Wasm 程序在浏览器之外访问标准化平台能力。
Kotlin/Wasm + WASI 的方向适合:
- Wasm 运行时中的后端组件。
- 插件系统。
- 沙箱执行。
- 可移植命令行/服务组件。
目前这仍是快速发展的生态。生产使用前要确认运行时、API、部署平台和依赖库支持。
Browser API 支持¶
Kotlin/Wasm 标准库提供部分浏览器 API 声明,包括 DOM API。你可以从 Kotlin 中操作 DOM、调用 fetch 等 Web 能力。
但与 Kotlin/JS 类似,Web API 边界仍需要谨慎封装:
- 不要让浏览器类型泄漏进 common 业务层。
- 将 DOM、fetch、storage 等能力隔离在 Web source set。
- 对外暴露稳定的 Kotlin 接口。
Kotlin/Wasm 与 Kotlin/JS 对比¶
| 维度 | Kotlin/Wasm | Kotlin/JS |
|---|---|---|
| 编译目标 | WebAssembly | JavaScript |
| 生态集成 | Wasm 与 Compose Web 方向 | JS/npm/React 生态更成熟 |
| 浏览器要求 | 需要较新的 Wasm 特性 | 老浏览器支持更好 |
| 类型边界 | 更偏 Kotlin/Wasm 运行时 | 更容易直接接 JS API |
| 适用场景 | Compose Web、性能潜力、WASI | JS 生态集成、前端框架互操作 |
如果项目深度依赖现有 TypeScript/React/npm 生态,Kotlin/JS 可能更直接。如果项目目标是 Compose Multiplatform Web 或未来 Wasm 运行时,Kotlin/Wasm 更值得关注。
当前状态¶
官方页面标注 Kotlin/Wasm 仍处于 Beta。Beta 不代表不能试用,但意味着:
- API 和工具链可能继续变化。
- 浏览器支持仍需确认。
- 生产项目要有升级和兼容预案。
- 依赖库支持程度需要逐项验证。
实践建议¶
- Web UI 优先从官方 Kotlin/Wasm + Compose 模板开始。
- 发布前检查目标浏览器 Wasm GC 支持。
- Web API 调用放在 Web source set,避免污染 commonMain。
- 与 npm/JS 生态深度集成时评估 Kotlin/JS 是否更合适。
- 生产系统使用 WASI 前确认运行时和依赖库成熟度。
参考¶
- 官方 Kotlin/Wasm:https://kotlinlang.org/docs/wasm-overview.html
- 官方 Wasm + Compose 入门:https://kotlinlang.org/docs/wasm-get-started.html