Kotlin/JS — is een compiler van Kotlin-code naar JavaScript, waarmee frontend-applicaties en webinterfaces in de Kotlin-taal kunnen worden gemaakt. In tegenstelling tot TypeScript biedt Kotlin/JS strikte statische typering, ondersteuning voor coroutines en naadloze integratie met Kotlin Multiplatform. Sinds Kotlin 1.8 gebruikt de compiler een IR-backend voor het genereren van geoptimaliseerde JavaScript-code. Volgens gegevens van JetBrains, 2025, ondersteunt Kotlin/JS integratie met het NPM-ecosysteem en TypeScript via automatische generatie van .d.ts-bestanden.
Belangrijkste punten
Kotlin/JS — is een van de drie backends van de Kotlin-compiler (naast JVM en Native), bedoeld voor het vertalen van Kotlin-code naar JavaScript. Ontwikkeld door JetBrains, stelt Kotlin/JS in staat om webapplicaties te schrijven in een taal met strikte statische typering, met behoud van toegang tot het enorme ecosysteem van JavaScript-bibliotheken via het mechanisme van externe declaraties. Sinds de eerste stabiele release in Kotlin 1.3 is de compiler geëvolueerd van een experimentele backend naar een productieklaar hulpmiddel dat wordt gebruikt in industriële projecten.
Het hoofddoel van Kotlin/JS — frontend-ontwikkeling met Kotlin in plaats van JavaScript of TypeScript. Ontwikkelaars krijgen alle mogelijkheden van de Kotlin-taal: null safety, extensiefuncties, dataklassen, coroutines en sealed klassen. De gegenereerde JavaScript-code kan in elke moderne browser of in de Node.js-omgeving worden uitgevoerd. Kotlin/JS is vooral gewild in Kotlin Multiplatform-projecten, waar de gemeenschappelijke module (commonMain) beschikbaar is voor zowel mobiele als webapplicaties.
Het Kotlin/JS-ecosysteem omvat frameworks voor het maken van gebruikersinterfaces. Compose Multiplatform voor het web gebruikt Kotlin/JS als doelbackend, wat het mogelijk maakt om declaratieve UI-componenten te maken die in de browser werken. Alternatieve oplossingen omvatten wrappers voor React — Kotlin Wrappers, die een type-safe API bieden voor React, React Router en Redux.
Compilatie Kotlin/JS doorloopt verschillende transformatiefasen. De bron-Kotlin-code wordt eerst gecompileerd naar een tussenliggende representatie (IR), vervolgens geoptimaliseerd en wordt JavaScript-code gegenereerd. Sinds Kotlin 1.8 is de oude backend (JsBackend gebaseerd op AST) volledig vervangen door de IR-backend, die betere optimalisatie, kleinere uitvoercode en TypeScript-compatibiliteit biedt.
Voorheen gebruikte Kotlin/JS JsBackend, die direct met de AST-boom (Abstract Syntax Tree) werkte. Deze aanpak had beperkingen: complexiteit van ondersteuning voor platformoptimalisaties, gebrek aan één IR voor alle backends en onvermogen om TypeScript-declaraties te genereren. De overstap naar de IR-backend loste deze problemen op, verenigde de compilatie van alle drie Kotlin-backends en opende de weg voor cross-backend optimalisaties.
Kotlin/JS ondersteunt twee compilatiemodi die het formaat en de optimalisatie van de uitvoercode bepalen. De productiemodus gebruikt Webpack voor compilatie, minificatie en tree-shaking. De ontwikkelmodus ondersteunt Hot Module Replacement voor snelle ontwikkeliteratie. De moduskeuze wordt geconfigureerd in build.gradle.kts via de js.target-configuratie.
kotlin {
js {
browser {
webpackTask {
outputFileName = "app.js"
}
}
binaries.executable()
}
}
Integratie van Kotlin/JS met het NPM-ecosysteem is geïmplementeerd via een speciale DSL in build.gradle.kts. De ontwikkelaar declareert npm-afhankelijkheden in de kotlin-configuratie, met vermelding van pakketnaam en versie. Kotlin/JS haalt automatisch pakketten op via de pakketbeheerder npm of yarn. Voor type-safe toegang tot JavaScript-bibliotheken worden externe declaraties gebruikt, die de typen en functies van de bibliotheek beschrijven voor de Kotlin-compiler.
Externe declaraties — Kotlin-declaraties gemarkeerd met het sleutelwoord external. Ze vertellen de compiler dat de implementatie van de functie of klasse zich in JavaScript-code bevindt, niet in Kotlin. JetBrains bied kant-en-klare sets wrappers voor populaire bibliotheken als onderdeel van Kotlin Wrappers, waaronder React, React Router, Redux, Emotion en MUI. Voor bibliotheken zonder kant-en-klare wrappers kan de ontwikkelaar handmatig externe declaraties schrijven of de Dukat TypeScript-bindingenerator gebruiken.
kotlin {
js {
browser { }
npm {
dependency("react", "18.3.1")
dependency("react-dom", "18.3.1")
devDependency("webpack", "5.92.0")
}
}
}
// Externe declaratie voor JavaScript-bibliotheek
@JsModule("date-fns")
external fun formatDistance(
date: Date, baseDate: Date
): String
TypeScript — een integraal onderdeel van het moderne web, en Kotlin/JS zorgt voor compatibiliteit ermee door het genereren van .d.ts-bestanden. Bij het instellen van js.generateTsDeclarations = true maakt de compiler TypeScript-declaraties voor alle openbare Kotlin-functies en -klassen. Dit stelt TypeScript-projecten in staat om Kotlin-modules te importeren met volledige typeondersteuning. Het genereren van TypeScript-declaraties werkt alleen met de IR-backend en is een van de belangrijkste redenen voor migratie van de oude backend.
IR-backend (Intermediate Representation) — een uniforme backend voor alle drie Kotlin-platforms: JVM, JS en Native. Het gebruikt een gemeenschappelijke tussenliggende representatie die door verschillende optimalisatiefasen gaat voordat de doelcode wordt gegenereerd. Voor Kotlin/JS werd de IR-backend verplicht vanaf Kotlin 1.8.0, ter vervanging van de oude AST-gebaseerde backend die als deprecated was gemarkeerd.
Voordelen van de IR-backend voor Kotlin/JS omvatten verbeterde codeoptimalisatie op IR-niveau, vermindering van de bundelgrootte door dead code elimination en inline-optimalisaties, en ondersteuning voor TypeScript-declaraties. De IR-backend zorgt ook voor correcte verwerking van inline-functies, reified generics en suspend-functies bij vertaling naar JavaScript, wat problematisch was in de oude backend.
| Kenmerk | Oude backend (AST) | IR-backend |
|---|---|---|
| TypeScript-declaraties | Niet ondersteund | Automatisch gegenereerd |
| Dead code elimination | Beperkt | Volledig, op IR-niveau |
| Inline-functies | Correctheidsproblemen | Correcte verwerking |
| Reified generics | Niet ondersteund | Ondersteund |
| Bundelgrootte | Basis | 20–30% kleiner |
Een volwaardig Kotlin/JS-project begint met de configuratie van build.gradle.kts. De kotlin multiplatform-plugin maakt het mogelijk om Kotlin/JS in te stellen als een van de doelplatforms. Laten we een configuratievoorbeeld bekijken voor een webapplicatie met React.
plugins {
kotlin("multiplatform") version "2.0.21"
id("org.jetbrains.kotlin-wrappers") version "1.0.0-pre.775"
}
kotlin {
js {
browser { }
binaries.executable()
generateTsDeclarations = true
}
}
dependencies {
implementation(enwraps(react, reactDom))
}
Na configuratie kunnen React-componenten in Kotlin worden geschreven. Kotlin Wrappers bieden een type-safe API voor React, inclusief functionele componenten, hooks en JSX-achtige syntax via DSL-builders. Het voorbeeld van de Counter-component demonstreert het werken met useState en gebeurtenisafhandeling.
@OptIn(ExperimentalWrapperApi::class)
val Counter = FC<Props> {
var count = useState(0)
div {
+"Counter value: ${count.component1()}"
button {
onClick = { count.component2()(count.component1() + 1) }
+"Increment"
}
}
}
fun main() {
createRoot(document.getElementById("root")!!).render(
createElement(Counter)
)
}
Het bouwen van een Kotlin/JS-project gebeurt via Gradle-taken. jsDevelopmentRun start de Webpack-dev-server met HMR voor ontwikkeling. jsProductionExecutableCompileSync genereert een productiebundel met minificatie en tree-shaking. Het uiteindelijke HTML-bestand dat de gecompileerde JavaScript koppelt, wordt gegenereerd door de webpack-plugin en bevindt zich in build/dist.
// Start dev-server met HMR
./gradlew jsDevelopmentRun
// Productiebuild met minificatie
./gradlew jsProductionExecutableCompileSync
// Uitvoer in build/dist/productionExecutable/
TypeScript — de belangrijkste concurrent van Kotlin/JS op het gebied van getypeerd JavaScript. Beide talen compileren naar JavaScript en voegen statische typering toe bovenop dynamische JS. Kotlin/JS biedt echter een aantal voordelen: null safety standaard, sealed klassen, coroutines en naadloze integratie met Kotlin Multiplatform. TypeScript heeft op zijn beurt een grotere community, meer kant-en-klare bibliotheken met typen en een volwassener ecosysteem.
De ontwikkelproductiviteit met Kotlin/JS kan hoger zijn voor teams die Kotlin al in andere delen van het project gebruiken, omdat er geen omschakeling tussen talen nodig is. TypeScript blijft de populaire keuze voor pure webprojecten waar Kotlin Multiplatform niet wordt gebruikt. Met de groeiende populariteit van Compose Multiplatform voor het web wint Kotlin/JS echter terrein als alternatief voor React en Angular.
| Kenmerk | Kotlin/JS | TypeScript |
|---|---|---|
| Null safety | Standaard | strictNullChecks optioneel |
| Sealed klassen | Ondersteund | Via union types |
| Coroutines | Native | Via async/await |
| KMM-integratie | Volledig | Afwezig |
| Communitygrootte | Klein | Enorm |
| Kant-en-klare typen voor bibliotheken | Beperkt (DefinitelyTyped via Dukat) | DefinitelyTyped (duizenden bibliotheken) |
De keuze tussen Kotlin/JS en TypeScript hangt af van de projectcontext. Als het team al Kotlin Multiplatform gebruikt of van plan is te beginnen, is Kotlin/JS een logische keuze voor het frontend-gedeelte. Voor een geïsoleerd webproject blijft TypeScript een pragmatischere oplossing vanwege de beschikbaarheid van kant-en-klare typen voor JavaScript-bibliotheken en het grotere aantal ontwikkelaars op de markt.
Veelgestelde vragen
Ja, JetBrains biedt Kotlin Wrappers — type-safe Kotlin-wrappers voor React, React Router en Redux. Ze maken het mogelijk om React-componenten in Kotlin te schrijven met volledige ondersteuning voor hooks en JSX-achtige DSL.
Bij het inschakelen van generateTsDeclarations = true genereert Kotlin/JS .d.ts-bestanden voor alle openbare API's. TypeScript-projecten kunnen Kotlin-modules importeren met volledige typering als gewone npm-pakketten.
De bundelgrootte hangt af van de gebruikte bibliotheken. Een minimale Hello World-applicatie neemt ongeveer 300 KB in beslag inclusief Kotlin stdlib. Met React en Kotlin Wrappers neemt de grootte toe tot 400–600 KB.
Ja, Kotlin/JS kan worden gebruikt voor het ontwikkelen van serverless-functies en console-hulpprogramma's onder Node.js. Hiervoor moet in de configuratie js.nodejs worden opgegeven in plaats van js.browser.
Kotlin/Wasm — is een experimentele backend voor WebAssembly, terwijl Kotlin/JS JavaScript-code genereert. Wasm biedt hogere prestaties, maar heeft beperkte toegang tot de browser-DOM.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook