官网发声:Kotlin For Web 的现在与未来

222 阅读10分钟

原文
Present and Future of Kotlin for Web

1.jpg

Kotlin 始终致力于为开发者提供强大且无缝的支持,助力开发者在多平台技术中进行网页开发。为实现这一目标,Kotlin 正工作在几个关键点上:

  • 改进 IDE 对网页目标平台的支持。
  • Kotlin/Wasm 以及用于网页开发的 Compose 多平台技术推广到测试版(Beta)阶段。
  • 为旧版浏览器中的 Compose 多平台技术提供兼容模式。
  • 消除 Kotlin/JS 中互操作性的大部分限制。
  • 使 Kotlin/JS 面向最新的 JavaScript 标准。

Kotlin Multiplatform (KMP) 旨在帮助开发者在不同平台间共享代码,从而显著减少开发时间与精力。网页在这个生态系统中至关重要,因为它是使用最为广泛的客户端平台。

尽管有一段时间没有发布更新消息,但在此期间我们工作进展不断。现在,我们准备好分享最新的进展情况。

当下:JavaScript 和 WebAssembly(Wasm)

2.png

Kotlin Multiplatform 是一项可用于生产环境的技术,它通过四个编译器后端(Kotlin/JVMKotlin/JSKotlin/NativeKotlin/Wasm)来支持多个平台。

在网页开发方面,KMP 提供了两种不同的解决方案:编译为 JavaScriptKotlin/JS)和 WebAssemblyKotlin/Wasm)。

SO,为什么要有两个网页目标平台?

Kotlin Multiplatform 提供了一种独特的代码共享方法,其核心在于其灵活性。根据项目需求的不同,你可能会有以下需求:

  • 仅共享业务逻辑,同时保持用户界面(UI)为原生。
  • 在所有平台上共享业务逻辑和用户界面。

这两种情况有着不同的技术要求,而 Kotlin/JSKotlin/Wasm 这两个目标平台则分别满足了这些需求。

业务逻辑共享

如果你的目标是在网页上共享业务逻辑,你可能会有一些要求,比如能够:

  • 向主要基于 JavaScript 的原生用户界面提供复杂的业务逻辑。
  • 仅加载特定网页所需的业务逻辑,以减少网络负载。
  • JavaScriptKotlin 代码之间进行交互,同时不产生额外的性能开销。

在这种情况下,Kotlin/JS 更合适,因为它提供了更好的互操作性体验。

共享逻辑与用户界面

如果你想在多个平台上共享整个应用程序,包括用户界面,这就是 Compose Multiplatform (CMP) 发挥作用的地方。使用它时,你对网页渲染和性能的要求自然会发生变化:

  • 你希望同一用户界面在包括网页在内的每个平台上都能一致渲染。
  • 流畅的动画和响应式过渡变得至关重要。

在这种情况下,Kotlin/Wasm 就表现出色了。根据我们的基准测试,在共享用户界面的场景中,WebAssembly性能要好得多(速度几乎快3倍)。

请查看我们关于为你的应用程序选择哪个目标平台的详细建议

计划中:近期会有哪些更新?

3.jpg

在接下来的部分,我们将带您了解最重要的更新和计划,从集成开发环境(IDE)工具和互操作性的改进,到适用于网页的 Compose Multiplatform 的发展。

来吧,更深入地了解这些方面吧!

对网页目标平台更好的IDE支持

作为提供出色 Kotlin 多平台开发体验这一广泛努力的一部分,我们正在积极致力于在 IntelliJ IDEAAndroid Studio 中提供更好的 KMP 支持。

这也包括提升针对 JavaScriptWebAssemblyWasm)目标平台的体验。虽然这两款 IDE 都具备代码功能,但某些特性,如对 JavaScriptWasm 目标平台的调试功能,目前仅在 IntelliJ IDEA 中可用。

我们已通过以下步骤开启这一进程:

  • 添加一个向导,用于创建针对网页平台的新 KMP 项目。

  • 集成平台调试器,以便在两个网页目标平台上轻松调试您的 KMP 项目。

  • 为应用程序入口点和测试添加侧边栏图标,以便轻松运行它们,而无需考虑应运行哪个 Gradle 任务。

推动 Wasm 目标平台和 Compose Multiplatform For Web 进入测试版

我们深知,对于许多 Compose Multiplatform 用户来说,网页是一个重要的平台,我们致力于提升针对该平台的开发体验。

Compose Multiplatform For Web 的持续改进

自进入 Alpha 阶段以来,Compose Multiplatform For Web 已经历了重大更新,缩小了与其他平台的功能差距。例如,文本输入处理功能得到了显著改进,在移动设备上尤其如此。我们接下来重点开发的是可访问性以及与原生 HTML 元素的互操作性。

Kotlin/Wasm:现已在所有主流浏览器的最新版本中运行

WebAssemblyWasm)也已经成熟。截至2024年12月11日,包括 Safari 在内的所有主流浏览器都支持 WebAssembly 垃圾回收(WasmGC)。这意味着 Kotlin/Wasm 应用程序现在可以在所有主流现代浏览器上运行。

提升 WebAssembly(Wasm)开发体验

在过去几年中,提升针对 Wasm 目标平台的开发体验一直是我们的首要任务。为此,我们采取了以下措施:

在接下来的几个月里,我们将更加专注于提高稳定性,确保在 KMP 项目中使用 Wasm 尽可能顺利,并避免未来出现破坏性更改。

总体而言,我们致力于使这两项技术的功能尽可能完善,并在今年将它们推进到测试版。

为 Compose Multiplatform 提供兼容模式

正如我们之前提到的,当你想要一个具有多平台用户界面的应用程序时,我们建议使用 Wasm 作为目标平台。然而,有一些局限性需要考虑。Wasm 目标平台依赖于浏览器对 Wasm 垃圾回收(WasmGC)的支持,这可能会导致以 Wasm 为目标的 Kotlin 应用程序与不支持此功能的旧版浏览器不兼容——更多详细信息请参阅本指南

为了解决这个问题,我们将在 Compose Multiplatform 中引入一种兼容模式。

  • 添加名为 webMain 的新公共源集,现在,对于 JavaScriptWasm 这两个目标平台,你可以用同一个来源来进行 “实际” 声明。
  • 利用 CMP Gradle 插件中的一种特殊DSL,应用程序将被编译成能在现代浏览器中运行的 Wasm 版本,以充分利用 Wasm 目标平台的性能优势。对于旧版浏览器,JavaScript 版本将自动运行,避免出现空白屏幕并保持可用性。

注意:Compose Multiplatform 在渲染引擎方面仍然依赖于 WebAssembly。不过,这部分使用的 WebAssembly 功能自2017年起便在所有主流浏览器中可用

消除 Kotlin/JS 中大部分的互操作限制

如今,在 Kotlin 中与 JavaScript 进行互操作的方法是基于实验性的 @JsExport 注解,该注解存在一些限制,使其在企业应用中使用起来颇具挑战 。

我们正在努力消除这些限制,以提供与 JavaScript 更无缝的互操作体验。这项工作完成后,大多数 Kotlin 声明都可以使用 @JsExport 注解进行标记,并且该注解会成为稳定的功能。

对于无法使用此注解标记声明的情况,例如,当你使用的库的源码不由你控制,但仍希望将其中的一些声明导出到 JavaScript 时,在多平台 Gradle 插件中将提供 DSL 功能,帮助你从这些库中导出所有需要的声明 。

在 Kotlin/JS 中支持最新的 JavaScript 标准

过去,Kotlin 多平台项目(KMP)唯一可用的 JavaScript 目标版本是 ES5,如今这已经相当过时了 。在过去两年中,我们致力于引入对使用现代 JavaScript 特性(如类、生成器和箭头函数)进行编译的实验性支持。

这种新的支持在某些情况下可以减小打包文件的大小并提高性能,这就是为什么我们打算将其稳定化,并添加更多现代特性,如 BigInt 和动态导入(dynamic import)。

我们旨在仅针对 JavaScript 规范的最新版本,从而进一步减小打包文件的大小并提高性能。如果你需要支持旧版浏览器,我们正在 Gradle 插件中集成 Babel。它将降低生成的 JavaScript 版本,以确保与旧版浏览器兼容,这样你仍然可以支持广泛的平台。

未来:Kotlin For Web

4.jpg

这些并非 Kotlin 针对 Web 平台所计划的全部改进。

目前已有几项重要举措正在推进中。以下是接下来的发展计划:

  • Wasm目标平台的多线程支持:为了充分利用现代多核处理器并实现最佳性能,我们将为 Kotlin/Wasm 编译器打造多线程支持的原型。我们的目标是让 Web 上的多线程开发像在JVM上一样轻松,从而将高性能 Web 应用的开发提升到一个新高度。
  • Wasm目标平台的按模块编译:为了缩短开发的编译周期并提高程序的模块化程度,我们正在致力于生成多个 WebAssembly 模块。这种方法通过仅重新编译发生变化的 Kotlin 模块,完善了最近引入的增量编译功能。它还支持按需加载程序部件,这可以显著缩短应用的启动时间并减轻网络负载。此外,对于支持以 Wasm 为目标的 Kotlin 应用中的插件系统而言,它也是一个重要的基础功能。
  • 集成现代JavaScript工具:为了加快编译周期,我们希望在 Gradle 插件中增加一种替代当前 Webpack 集成的方式。我们的目标是将 Webpack 集成解耦,以便能与任何现代 JavaScrip t打包工具集成,如 esbuildrepackVitebun
  • 根据TypeScript类型定义自动生成Kotlin包装器:为了解决在使用 JavaScript/TypeScript 库时编写 Kotlin 包装器所带来的麻烦,我们重新着手为多平台 Gradle 插件集成自动外部声明生成器。对于项目中声明的每个 NPM 依赖项,你都将自动获得用于描述该库可用 API 的、可直接使用的 Kotlin 声明。

总结

5.jpg

感谢近期通过各项渠道收到的调查问卷、YouTrack 问题工单、提问和建议,我们收集到了大量宝贵的反馈,为 KotlinWeb 领域明确了发展方向。没有大家的支持我们不可能做到这一切!

如果你想分享更多反馈或提问,请加入我们的 Slack 社区。在那里,你会找到与各种你可能感兴趣的主题相关的特定频道,如 #webassembly#compose-web#javascript#multiplatform

感谢大家的支持,我们承诺将在大家跨平台使用 Kotlin 进行开发时,为大家提供出色的体验。