【问题标题】:Differences in writing Kotlin/JVM and Kotlin/JS?编写 Kotlin/JVM 和 Kotlin/JS 的区别?
【发布时间】:2021-01-05 12:46:50
【问题描述】:
我阅读了 Big Nerd Ranch 的 Kotlin 指南,它在多个地方都谈到了 Kotlin/Java 互操作,但从来没有 JS 或原生。我已经拥有扎实的 Java 背景,所以我已经习惯在我的 Kotlin 代码中使用 Java 类。我正在尝试编写一个 Kotlin 程序,该程序将在大多数(如果不是全部)功能都是用 JavaScript 编写的站点上运行,并且我正在尝试了解如何编写我的代码以确保它是可互操作的。我能否继续在我的 Kotlin/JS 代码中使用 Java 类?编写 Kotlin/JVM 代码和编写 Kotlin/JS 代码有什么区别? (前)Java 程序员在学习使用 Kotlin 与 JS 互操作时应该知道什么?如果在最近写的任何好书中有几章关于这方面的内容,那也会有所帮助。
【问题讨论】:
标签:
kotlin
kotlin-multiplatform
kotlin-js
kotlin-interop
【解决方案1】:
正如史蒂夫已经提到的,你不能在 Kotlin/JS 中使用 java 类。
将 Kotlin/JS 视为 Typescript。
它提供了不同的语法来编写最终编译为 JS 的代码。
以下是编写 Kotlin/JS 代码与编写 Kotlin/JVM 代码的显着差异
- Kotlin/JS 内部使用 yarn 进行依赖管理。这使您能够依赖 npmjs 等上可用的任何 javascript 模块(请参阅下面的注释)
- 除了标准库之外,您还可以利用其他 kotlin-first 框架,例如 kotlinx-serialization、ktor 等
- 测试库将是 JS 特定的。因此,您需要熟悉 karma / mocha 家族,而不是 mockito / mockk / junit 系列。
- 协程功能会有所不同——无论是在编写代码的方式还是性能预期方面。
我发现阅读有关 Kotlin Multiplatform 的文章有助于阐明很多关于 kotlin 的功能。
我知道这不是特别要求的,但把我的 2cents 给考虑 Kotlin/JS 的人(截至 20 年 9 月)
- 如果您熟悉 Kotlin 并且除了 http i/o (ktor) 、React ( kotlin-react) 和基本的 html / css(由 kotlin-styled 覆盖)之外,没有预见到太多第三方依赖项,那就太好了。
- 使用 JS 模块作为依赖项不像使用 JVM 依赖项那样直接,因为没有现成的互操作。在使用它们之前,必须在 kotlin 中
define javascript 函数/类(参见 here)。因此,如果您预见到要利用大量现有的 javascript 模块,这将不是一个理想的前进方向。
- 如果您有一个典型的后端-前端模型,其中后端编译为 JVM,前端编译为 JS,那就太好了。您可以跨后端和前端代码(通过 Kotlin Multiplatform)利用通用数据模型和 http i/o 框架。我发现这极大地提高了生产力!
【解决方案2】:
Kotlin/JS 将 Kotlin 代码(包括它自己的标准库)编译成 Javascript 代码。最后,您所拥有的就是 Javascript。您没有与 Java 虚拟机的任何连接。 Kotlin 的标准库没有提供将 Javascript 代码桥接到 JVM 以便它可以利用 Java 类的魔法。所以不,你不能在标准 Kotlin/JS 中使用 Java 类。