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