Differences in writing Kotlin/JVM and Kotlin/JS?

2.1k views Asked by At

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.

2

There are 2 answers

0
Yogesh Nachnani On BEST ANSWER

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!
0
CryptoFool On

Kotlin/JS compiles Kotlin code, including its own standard library, into Javascript code. At the end, that's all you have is Javascript. What you don't have is any connection to the Java Virtual Machine. Kotlin's standard library provides no magic to bridge Javascript code to the JVM so that it can utilize Java classes. So NO, you can't utilize Java classes in standard Kotlin/JS.