Kotlin/JS — was es ist, Compiler zu JavaScript und Funktionen

Autor: IT Sectr Veröffentlicht: 2026-06-05 Lesezeit: 7 Min.

Kotlin/JS ist ein Kotlin-zu-JavaScript-Compiler, mit dem Sie Frontend-Anwendungen und Weboberflächen in der Sprache Kotlin erstellen können. Im Gegensatz zu TypeScript bietet Kotlin/JS strenge statische Typisierung, Coroutine-Unterstützung und eine nahtlose Integration mit Kotlin Multiplatform. Seit Kotlin 1.8 verwendet der Compiler ein IR-basiertes Backend zur Generierung von optimiertem JavaScript-Code. Laut JetBrains, 2025 unterstützt Kotlin/JS die Integration mit dem NPM-Ökosystem und TypeScript durch automatische Generierung von .d.ts-Dateien.

Wichtige Punkte

  • Kotlin/JS — ein Kotlin-zu-JavaScript-Compiler für Frontend-Entwicklung und Weboberflächen.
  • IR-Backend — eine Zwischendarstellung zur Generierung von optimiertem JavaScript-Code.
  • NPM-Integration — die Möglichkeit, JavaScript-Bibliotheken über npm-Abhängigkeiten in build.gradle.kts einzubinden.
  • TypeScript-Kompatibilität — Generierung von .d.ts-Dateien für die sichere Interaktion von TypeScript-Projekten mit Kotlin-Code.
  • KMM-Integration — Wiederverwendung von gemeinsamem Kotlin-Code zwischen mobilen und Web-Anwendungen.

Was ist Kotlin/JS?

Kotlin/JS ist eines der drei Compiler-Backends von Kotlin (neben JVM und Native), das zum Übersetzen von Kotlin-Code in JavaScript entwickelt wurde. Kotlin/JS wurde von JetBrains entwickelt und ermöglicht das Schreiben von Webanwendungen in einer Sprache mit strenger statischer Typisierung, wobei der Zugriff auf das riesige Ökosystem der JavaScript-Bibliotheken über externe Deklarationen erhalten bleibt. Seit der ersten stabilen Version in Kotlin 1.3 hat sich der Compiler von einem experimentellen Backend zu einem produktionsreifen Werkzeug entwickelt, das in industriellen Projekten eingesetzt wird.

Der Hauptzweck von Kotlin/JS ist die Frontend-Entwicklung mit Kotlin anstelle von JavaScript oder TypeScript. Entwickler erhalten alle Funktionen der Kotlin-Sprache: Null-Sicherheit, Erweiterungsfunktionen, Datenklassen, Coroutinen und versiegelte Klassen. Der generierte JavaScript-Code kann in jedem modernen Browser oder in einer Node.js-Umgebung ausgeführt werden. Kotlin/JS ist besonders wertvoll in Kotlin Multiplatform-Projekten, bei denen das gemeinsame Modul (commonMain) sowohl für mobile als auch für Webanwendungen verfügbar ist.

Das Kotlin/JS-Ökosystem umfasst Frameworks zur Erstellung von Benutzeroberflächen. Compose Multiplatform für das Web verwendet Kotlin/JS als Ziel-Backend und ermöglicht deklarative UI-Komponenten, die im Browser ausgeführt werden. Alternative Lösungen umfassen Wrapper für React — Kotlin Wrappers, die eine typsichere API für React, React Router und Redux bereitstellen.

Wie der Kotlin/JS-Compiler funktioniert

Die Kompilierung in Kotlin/JS durchläuft mehrere Transformationsstufen. Der Kotlin-Quellcode wird zunächst in eine Zwischendarstellung (IR) kompiliert, dann optimiert und schließlich wird JavaScript-Code generiert. Seit Kotlin 1.8 wurde das alte Backend (JsBackend basierend auf AST) vollständig durch das IR-Backend ersetzt, das eine bessere Optimierung, kleinere Ausgabecodegröße und TypeScript-Kompatibilität bietet.

Früher verwendete Kotlin/JS JsBackend, das direkt mit dem AST (Abstrakter Syntaxbaum) arbeitete. Dieser Ansatz hatte Einschränkungen: Schwierigkeiten bei der Unterstützung von Plattformoptimierungen, Fehlen eines einheitlichen IR für alle Backends und Unfähigkeit, TypeScript-Deklarationen zu generieren. Der Übergang zum IR-Backend löste diese Probleme, vereinheitlichte die Kompilierung über alle drei Kotlin-Backends hinweg und eröffnete den Weg für Backend-übergreifende Optimierungen.

Kotlin/JS-Kompilierungsmodi

Kotlin/JS unterstützt zwei Build-Modi, die das Format und die Optimierung des Ausgabecodes bestimmen. Der Produktionsmodus verwendet Webpack zum Bündeln, Minifizieren und Tree-Shaking. Der Entwicklungsmodus unterstützt Hot Module Replacement für schnelle Entwicklungsiterationen. Die Modusauswahl wird in build.gradle.kts über die Konfiguration js.target konfiguriert.

kotlin
kotlin {
    js {
        browser {
            webpackTask {
                outputFileName = "app.js"
            }
        }
        binaries.executable()
    }
}

Integration mit NPM und JavaScript-Bibliotheken

Die Integration von Kotlin/JS mit dem NPM-Ökosystem wird über ein spezielles DSL in build.gradle.kts implementiert. Der Entwickler deklariert npm-Abhängigkeiten in der Kotlin-Konfiguration und gibt Paketnamen und Version an. Kotlin/JS holt Pakete automatisch über den npm- oder yarn-Paketmanager ab. Um einen typsicheren Zugriff auf JavaScript-Bibliotheken zu gewährleisten, werden externe Deklarationen verwendet, die die Typen und Funktionen der Bibliothek für den Kotlin-Compiler beschreiben.

Externe Deklarationen sind Kotlin-Deklarationen, die mit dem Schlüsselwort external markiert sind. Sie teilen dem Compiler mit, dass die Implementierung der Funktion oder Klasse in JavaScript-Code und nicht in Kotlin liegt. JetBrains bietet vorgefertigte Wrapper-Sets für beliebte Bibliotheken im Rahmen von Kotlin Wrappers an, darunter React, React Router, Redux, Emotion und MUI. Für Bibliotheken ohne vorgefertigte Wrapper kann der Entwickler externe Deklarationen manuell schreiben oder den Dukat TypeScript-Bindungsgenerator verwenden.

kotlin
kotlin {
    js {
        browser { }
        npm {
            dependency("react", "18.3.1")
            dependency("react-dom", "18.3.1")
            devDependency("webpack", "5.92.0")
        }
    }
}

// Externe Deklaration für JavaScript-Bibliothek
@JsModule("date-fns")
external fun formatDistance(
    date: Date, baseDate: Date
): String

Arbeiten mit TypeScript-Kompatibilität

TypeScript ist ein integraler Bestandteil des modernen Webs, und Kotlin/JS gewährleistet die Kompatibilität mit TypeScript durch die Generierung von .d.ts-Dateien. Wenn js.generateTsDeclarations = true gesetzt ist, erstellt der Compiler TypeScript-Deklarationen für alle öffentlichen Kotlin-Funktionen und -Klassen. Dadurch können TypeScript-Projekte Kotlin-Module mit vollständiger Typunterstützung importieren. Die Generierung von TypeScript-Deklarationen funktioniert nur mit dem IR-Backend und ist einer der Hauptgründe für die Migration vom alten Backend.

Kotlin/JS IR-Backend und Vorteile

Das IR-Backend (Intermediate Representation) ist ein einheitliches Backend für alle drei Kotlin-Plattformen: JVM, JS und Native. Es verwendet eine gemeinsame Zwischendarstellung, die vor der Generierung des Zielcodes mehrere Optimierungsstufen durchläuft. Für Kotlin/JS wurde das IR-Backend ab Kotlin 1.8.0 obligatorisch und ersetzte das alte AST-basierte Backend, das als veraltet markiert wurde.

Die Vorteile des IR-Backends für Kotlin/JS umfassen verbesserte Code-Optimierung auf IR-Ebene, Reduzierung der Bündelgröße durch Dead-Code-Eliminierung und Inline-Optimierungen sowie Unterstützung für TypeScript-Deklarationen. Das IR-Backend gewährleistet auch die korrekte Behandlung von Inline-Funktionen, reified Generics und Suspend-Funktionen bei der Übersetzung nach JavaScript, was im alten Backend problematisch war.

MerkmalAltes Backend (AST)IR-Backend
TypeScript-DeklarationenNicht unterstütztAutomatisch generiert
Dead-Code-EliminierungEingeschränktVollständig, auf IR-Ebene
Inline-FunktionenKorrektheitsproblemeKorrekte Behandlung
Reified GenericsNicht unterstütztUnterstützt
BündelgrößeBasis20–30 % kleiner

Codebeispiele: Einrichtung und Entwicklung

Ein vollständiges Kotlin/JS-Projekt beginnt mit der Konfiguration von build.gradle.kts. Das Kotlin-Multiplatform-Plugin ermöglicht die Einrichtung von Kotlin/JS als eine der Zielplattformen. Betrachten wir ein Beispiel für die Einrichtung einer Webanwendung mit React.

kotlin
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))
}

Nach der Konfiguration können React-Komponenten in Kotlin geschrieben werden. Kotlin Wrappers bieten eine typsichere API für React, einschließlich funktionaler Komponenten, Hooks und JSX-ähnlicher Syntax durch DSL-Builder. Das Counter-Komponentenbeispiel demonstriert die Arbeit mit useState und Ereignisbehandlern.

kotlin
@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)
    )
}

Build und Bereitstellung

Der Build eines Kotlin/JS-Projekts erfolgt über Gradle-Aufgaben. jsDevelopmentRun startet den Webpack-Entwicklungsserver mit HMR für die Entwicklung. jsProductionExecutableCompileSync generiert ein Produktions-Bundle mit Minifizierung und Tree-Shaking. Die endgültige HTML-Datei, die das kompilierte JavaScript enthält, wird vom Webpack-Plugin generiert und in build/dist abgelegt.

kotlin
// Entwicklungsserver mit HMR starten
./gradlew jsDevelopmentRun

// Produktions-Build mit Minifizierung
./gradlew jsProductionExecutableCompileSync

// Ausgabe in build/dist/productionExecutable/

Kotlin/JS vs TypeScript: Vergleich

TypeScript ist der Hauptkonkurrent von Kotlin/JS im Bereich typisiertes JavaScript. Beide Sprachen werden nach JavaScript kompiliert und fügen statische Typisierung über dynamisches JS hinzu. Kotlin/JS bietet jedoch mehrere Vorteile: standardmäßige Null-Sicherheit, versiegelte Klassen, Coroutinen und nahtlose Integration mit Kotlin Multiplatform. TypeScript hingegen hat eine größere Community, mehr fertige Bibliotheken mit Typen und ein ausgereifteres Ökosystem.

Die Entwicklungsproduktivität mit Kotlin/JS kann für Teams höher sein, die Kotlin bereits in anderen Teilen des Projekts verwenden, da kein Sprachwechsel erforderlich ist. TypeScript bleibt die beliebtere Wahl für reine Webprojekte, bei denen Kotlin Multiplatform nicht verwendet wird. Mit der wachsenden Beliebtheit von Compose Multiplatform für das Web gewinnt Kotlin/JS jedoch als Alternative zu React und Angular an Boden.

MerkmalKotlin/JSTypeScript
Null-SicherheitStandardmäßigstrictNullChecks optional
Versiegelte KlassenUnterstütztÜber Union-Typen
CoroutinenNativÜber async/await
KMM-IntegrationVollständigKeine
Community-GrößeKleinRiesig
Fertige Typen für BibliothekenBegrenzt (DefinitelyTyped über Dukat)DefinitelyTyped (Tausende von Bibliotheken)

Die Wahl zwischen Kotlin/JS und TypeScript hängt vom Projektkontext ab. Wenn das Team bereits Kotlin Multiplatform verwendet oder damit beginnen möchte, ist Kotlin/JS eine logische Wahl für den Frontend-Teil. Für ein isoliertes Webprojekt bleibt TypeScript aufgrund der Verfügbarkeit fertiger Typen für JavaScript-Bibliotheken und der größeren Anzahl von Entwicklern auf dem Markt die pragmatischere Lösung.

Häufig gestellte Fragen

Kann Kotlin/JS mit React verwendet werden?

Ja, JetBrains bietet Kotlin Wrappers — typsichere Kotlin-Wrapper für React, React Router und Redux. Sie ermöglichen das Schreiben von React-Komponenten in Kotlin mit vollständiger Unterstützung für Hooks und JSX-ähnliches DSL.

Wie funktioniert Kotlin/JS mit TypeScript-Projekten?

Wenn generateTsDeclarations = true aktiviert ist, generiert Kotlin/JS .d.ts-Dateien für alle öffentlichen APIs. TypeScript-Projekte können Kotlin-Module mit vollständiger Typisierung als normale npm-Pakete importieren.

Wie groß ist die Bündelgröße einer Kotlin/JS-Anwendung?

Die Bündelgröße hängt von den verwendeten Bibliotheken ab. Eine minimale Hello World-Anwendung benötigt etwa 300 KB einschließlich der Kotlin-Standardbibliothek. Mit React und Kotlin Wrappers erhöht sich die Größe auf 400–600 KB.

Unterstützt Kotlin/JS die Node.js-Umgebung?

Ja, Kotlin/JS kann für die Entwicklung von Serverless-Funktionen und Konsolen-Dienstprogrammen unter Node.js verwendet werden. Dazu geben Sie in der Konfiguration js.nodejs anstelle von js.browser an.

Was ist der Unterschied zwischen Kotlin/JS und Kotlin/Wasm?

Kotlin/Wasm ist ein experimentelles Backend für WebAssembly, während Kotlin/JS JavaScript-Code generiert. Wasm bietet eine höhere Leistung, hat jedoch eingeschränkten Zugriff auf das Browser-DOM.

Zusammenfassung

  • Kotlin/JS — ein Kotlin-zu-JavaScript-Compiler für die Frontend-Entwicklung mit Unterstützung für Coroutinen, versiegelte Klassen und Null-Sicherheit.
  • IR-Backend ersetzte das alte AST-basierte Backend und ermöglicht die Generierung von TypeScript-Deklarationen sowie eine 20–30 % kleinere Bündelgröße.
  • NPM-Integration ermöglicht die Einbindung beliebiger JavaScript-Bibliotheken über externe Deklarationen und Kotlin Wrappers.
  • TypeScript-Kompatibilität wird durch automatische .d.ts-Dateigenerierung bei generateTsDeclarations = true implementiert.
  • KMM-Integration ist der Hauptvorteil von Kotlin/JS gegenüber TypeScript und ermöglicht die gemeinsame Nutzung von Code mit mobilen Anwendungen.
  • Für isolierte Webprojekte bleibt TypeScript aufgrund der Community-Größe und Typverfügbarkeit die pragmatischere Wahl.
  • Verwenden Sie Kotlin/JS für den Frontend-Teil von KMM-Projekten oder bei der Entwicklung mit Compose Multiplatform für das Web.

Wir entwickeln eine mobile Applikation schlüsselfertig

IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.

Projekt besprechen

Lesen Sie auch