Search code examples
kotlinkotlin-multiplatformkotlin-jskotlin-interop

Differences in writing Kotlin/JVM and Kotlin/JS?


I read the Big Nerd Ranch guide to Kotlin and it talked in several places about Kotlin/Java interop, but never JS or native. I already had a solid background in Java, so I have gotten used to using Java classes in my Kotlin code. I am trying to write a Kotlin program which will be run on a site where most - if not all - functionality is written in JavaScript, and I am trying to understand how to write my code to make sure that it is interoperable. Will I be able to continue using Java classes in my Kotlin/JS code? What are the differences between writing Kotlin/JVM code and Kotlin/JS code? What should a (ex-) java programmer know when learning to interop with JS using Kotlin? If there are a few chapters on this in any good books written in the recent past, that would be helpful also.


Solution

  • As Steve already mentioned, you can't utilise java classes in Kotlin/JS.

    Think of Kotlin/JS as Typescript. It provides a different syntax to write code that ultimately compiles to JS.

    Here are the notable differences of writing Kotlin/JS code vs Kotlin/JVM code

    • Kotlin/JS internally uses yarn for dependency management. This enables you to depend on any javascript module available on npmjs etc (see note below)
    • In addition to standard library, you can also leverage other kotlin-first frameworks such as kotlinx-serialization, ktor etc
    • Testing libraries will be JS specific. So instead of mockito / mockk / junit family, you'll need to get familiar with karma / mocha family.
    • There will be a difference in Coroutine capabilities - both in terms of the way one writes code and performance expectations.

    I found reading about Kotlin Multiplatform helped clarify a lot about the capabilities of kotlin.

    I know this was not specifically asked, but giving my 2cents to people considering Kotlin/JS (as of Sep'20)

    • Great if you're familiar with Kotlin and don't foresee too many third party dependencies apart from http i/o (ktor) , React ( kotlin-react) and basic html / css (covered by kotlin-styled).
    • Using JS modules as dependencies is not as straight forward as using JVM dependencies since there is no ready-made interop. One has to define javascript functions/classes in kotlin before using them (see here). So if you foresee leveraging a lot of existing javascript modules, it won't be an ideal way forward.
    • Great if you have a typical backend-frontend model where backend compiles to JVM and Frontend compiles to JS. You can leverage a common data model and http i/o framework across Backend and Frontend code (via Kotlin Multiplatform). I've found this to be a tremendous productivity boost!