Kotlin/JS — vad är det, kompilator till JavaScript och funktioner

Författare: IT Sectr Publicerad: 2026-06-05 Lästid: 7 min

Kotlin/JS — är en kompilator av Kotlin-kod till JavaScript, som gör det möjligt att skapa frontend-applikationer och webbgränssnitt i språket Kotlin. Till skillnad från TypeScript erbjuder Kotlin/JS strikt statisk typning, stöd för korutiner och sömlös integration med Kotlin Multiplatform. Från och med Kotlin 1.8 använder kompilatorn en IR-baserad backend för att generera optimerad JavaScript-kod. Enligt uppgifter från JetBrains, 2025, stöder Kotlin/JS integration med NPM-ekosystemet och TypeScript genom automatisk generering av .d.ts-filer.

Huvudpunkter

  • Kotlin/JS — kompilator av Kotlin-kod till JavaScript för frontend-utveckling och webbgränssnitt.
  • IR-backend — mellanliggande representation som används för att generera optimerad JavaScript-kod.
  • NPM-integration — möjlighet att ansluta JavaScript-bibliotek via npm-beroenden i build.gradle.kts.
  • TypeScript-kompatibilitet — generering av .d.ts-filer för säker samverkan mellan TypeScript-projekt och Kotlin-kod.
  • KMM-integration — återanvändning av gemensam Kotlin-kod mellan mobila och webbapplikationer.

Vad är Kotlin/JS?

Kotlin/JS — är en av tre backends i Kotlin-kompilatorn (tillsammans med JVM och Native), avsedd för att översätta Kotlin-kod till JavaScript. Utvecklad av JetBrains, gör Kotlin/JS det möjligt att skriva webbapplikationer på ett språk med strikt statisk typning, samtidigt som tillgången till det enorma ekosystemet av JavaScript-bibliotek bevaras genom mekanismen med externa deklarationer. Sedan den första stabila versionen i Kotlin 1.3 har kompilatorn gått från en experimentell backend till ett produktionsklart verktyg som används i industriella projekt.

Huvudsyftet med Kotlin/JS — frontend-utveckling med Kotlin istället för JavaScript eller TypeScript. Utvecklare får alla funktioner i Kotlin-språket: null safety, extensionsfunktioner, dataklasser, korutiner och sealed-klasser. Den genererade JavaScript-koden kan köras i vilken modern webbläsare som helst eller i Node.js-miljön. Kotlin/JS är särskilt efterfrågat i Kotlin Multiplatform-projekt, där den gemensamma modulen (commonMain) är tillgänglig för både mobila och webbapplikationer.

Kotlin/JS-ekosystemet inkluderar ramverk för att skapa användargränssnitt. Compose Multiplatform för webben använder Kotlin/JS som målbackend, vilket gör det möjligt att skapa deklarativa UI-komponenter som fungerar i webbläsaren. Alternativa lösningar inkluderar wrappers för React — Kotlin Wrappers, som tillhandahåller ett type-safe API för React, React Router och Redux.

Hur Kotlin/JS-kompilatorn fungerar

Kompilering Kotlin/JS går igenom flera transformationssteg. Källkoden Kotlin kompileras först till en mellanliggande representation (IR), optimeras sedan och JavaScript-kod genereras. Från och med Kotlin 1.8 har den gamla backend (JsBackend baserad på AST) helt ersatts av IR-backend, som ger bättre optimering, mindre utdatakod och TypeScript-kompatibilitet.

Tidigare använde Kotlin/JS JsBackend, som arbetade direkt med AST-trädet (Abstract Syntax Tree). Detta tillvägagångssätt hade begränsningar: komplexiteten i att stödja plattformsoptimeringar, avsaknad av enhetlig IR för alla backends och oförmåga att generera TypeScript-deklarationer. Övergången till IR-backend löste dessa problem, enhetliggjorde kompileringen av alla tre Kotlin-backends och öppnade vägen för tvärbackend-optimeringar.

Kotlin/JS kompileringslägen

Kotlin/JS stöder två kompileringslägen som bestämmer format och optimering av utdatakoden. Produktionsläget använder Webpack för kompilering, minifiering och tree-shaking. Utvecklingsläget stöder Hot Module Replacement för snabb utvecklingsiteration. Läsvalet konfigureras i build.gradle.kts via js.target-konfigurationen.

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

Integration med NPM och JavaScript-bibliotek

Integration av Kotlin/JS med NPM-ekosystemet implementeras via ett speciellt DSL i build.gradle.kts. Utvecklaren deklarerar npm-beroenden i kotlin-konfigurationen, med angivande av paketnamn och version. Kotlin/JS hämtar automatiskt paket via pakethanteraren npm eller yarn. För att säkerställa type-safe åtkomst till JavaScript-bibliotek används externa deklarationer, som beskriver bibliotekets typer och funktioner för Kotlin-kompilatorn.

Externa deklarationer — Kotlin-deklarationer märkta med nyckelordet external. De informerar kompilatorn om att implementeringen av funktionen eller klassen finns i JavaScript-kod, inte i Kotlin. JetBrains tillhandahåller färdiga uppsättningar wrappers för populära bibliotek inom Kotlin Wrappers, inklusive React, React Router, Redux, Emotion och MUI. För bibliotek som saknar färdiga wrappers kan utvecklaren skriva externa deklarationer manuellt eller använda Dukat TypeScript-bindningsgeneratorn.

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

// Extern deklaration för JavaScript-bibliotek
@JsModule("date-fns")
external fun formatDistance(
    date: Date, baseDate: Date
): String

Arbete med TypeScript-kompatibilitet

TypeScript — en integrerad del av den moderna webben, och Kotlin/JS säkerställer kompatibilitet med det genom generering av .d.ts-filer. När js.generateTsDeclarations = true ställs in, skapar kompilatorn TypeScript-deklarationer för alla publika Kotlin-funktioner och klasser. Detta gör att TypeScript-projekt kan importera Kotlin-moduler med full typstöd. Generering av TypeScript-deklarationer fungerar bara med IR-backend och är en av de viktigaste orsakerna till migrering från den gamla backend.

Kotlin/JS IR-backend och fördelar

IR-backend (Intermediate Representation) — en enhetlig backend för alla tre Kotlin-plattformar: JVM, JS och Native. Den använder en gemensam mellanliggande representation som går igenom flera optimeringssteg innan målkoden genereras. För Kotlin/JS blev IR-backend obligatorisk från och med Kotlin 1.8.0 och ersatte den gamla AST-baserade backend som markerats som deprecated.

Fördelarna med IR-backend för Kotlin/JS inkluderar förbättrad kodoptimering på IR-nivå, minskning av bundle-storleken genom dead code elimination och inline-optimeringar, samt stöd för TypeScript-deklarationer. IR-backend säkerställer också korrekt bearbetning av inline-funktioner, reified generics och suspend-funktioner vid översättning till JavaScript, vilket var problematiskt i den gamla backend.

EgenskapGammal backend (AST)IR-backend
TypeScript-deklarationerStöddes inteGenereras automatiskt
Dead code eliminationBegränsadFullständig, på IR-nivå
Inline-funktionerKorrekthetsproblemKorrekt bearbetning
Reified genericsStöddes inteStöds
Bundle-storlekGrundläggande20–30% mindre

Kodexempel: konfiguration och utveckling

Ett fullfjädrat Kotlin/JS-projekt börjar med konfigurationen av build.gradle.kts. Kotlin multiplatform-plugin gör det möjligt att konfigurera Kotlin/JS som en av målplattformarna. Låt oss titta på ett konfigurationsexempel för en webbapplikation med 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))
}

Efter konfiguration kan React-komponenter skrivas i Kotlin. Kotlin Wrappers tillhandahåller type-safe API för React, inklusive funktionella komponenter, hooks och JSX-liknande syntax genom DSL-byggare. Exemplet med Counter-komponenten demonstrerar arbete med useState och händelsehanterare.

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

Bygg och distribution

Bygget av Kotlin/JS-projektet utförs via Gradle-uppgifter. jsDevelopmentRun startar Webpack-utvecklingsservern med HMR för utveckling. jsProductionExecutableCompileSync genererar en produktions-bundle med minifiering och tree-shaking. Den slutgiltiga HTML-filen som kopplar samman den kompilerade JavaScript-koden genereras av webpack-pluginen och finns i build/dist.

kotlin
// Starta utvecklingsserver med HMR
./gradlew jsDevelopmentRun

// Produktionsbygge med minifiering
./gradlew jsProductionExecutableCompileSync

// Utdata i build/dist/productionExecutable/

Kotlin/JS vs TypeScript: jämförelse

TypeScript — den främsta konkurrenten till Kotlin/JS inom området typad JavaScript. Båda språken kompileras till JavaScript och lägger till statisk typning ovanpå dynamisk JS. Kotlin/JS erbjuder dock flera fördelar: null safety som standard, sealed-klasser, korutiner och sömlös integration med Kotlin Multiplatform. TypeScript har å sin sida en större community, fler färdiga bibliotek med typer och ett mer moget ekosystem.

Utvecklingsproduktiviteten med Kotlin/JS kan vara högre för team som redan använder Kotlin i andra delar av projektet, eftersom det inte kräver växling mellan språk. TypeScript förblir det populärare valet för rena webbprojekt där Kotlin Multiplatform inte används. Men med den växande populariteten för Compose Multiplatform för webben vinner Kotlin/JS mark som ett alternativ till React och Angular.

EgenskapKotlin/JSTypeScript
Null safetyStandardstrictNullChecks valfritt
Sealed-klasserStödsGenom union types
KorutinerNativeGenom async/await
KMM-integrationFullständigSaknas
Community-storlekLitenEnorm
Färdiga typer för bibliotekBegränsade (DefinitelyTyped via Dukat)DefinitelyTyped (tusentals bibliotek)

Valet mellan Kotlin/JS och TypeScript beror på projektets sammanhang. Om teamet redan använder Kotlin Multiplatform eller planerar att börja, är Kotlin/JS ett logiskt val för frontend-delen. För ett isolerat webbprojekt förblir TypeScript en mer pragmatisk lösning tack vare tillgången på färdiga typer för JavaScript-bibliotek och fler utvecklare på marknaden.

Vanliga frågor

Kan Kotlin/JS användas med React?

Ja, JetBrains tillhandahåller Kotlin Wrappers — type-safe Kotlin-wrappers för React, React Router och Redux. De gör det möjligt att skriva React-komponenter i Kotlin med fullt stöd för hooks och JSX-liknande DSL.

Hur fungerar Kotlin/JS med TypeScript-projekt?

När generateTsDeclarations = true aktiveras genererar Kotlin/JS .d.ts-filer för alla publika API:er. TypeScript-projekt kan importera Kotlin-moduler med full typning som vanliga npm-paket.

Vad är bundle-storleken för en Kotlin/JS-applikation?

Bundle-storleken beror på vilka bibliotek som används. En minimal Hello World-applikation tar cirka 300 KB inklusive Kotlin stdlib. Med React och Kotlin Wrappers ökar storleken till 400–600 KB.

Stöder Kotlin/JS Node.js-miljön?

Ja, Kotlin/JS kan användas för att utveckla serverless-funktioner och konsolverktyg under Node.js. För detta måste js.nodejs anges i konfigurationen istället för js.browser.

Vad skiljer Kotlin/JS från Kotlin/Wasm?

Kotlin/Wasm — är en experimentell backend för WebAssembly, medan Kotlin/JS genererar JavaScript-kod. Wasm ger högre prestanda men har begränsad åtkomst till webbläsarens DOM.

Sammanfattning

  • Kotlin/JS — Kotlin-till-JavaScript-kompilator för frontend-utveckling med stöd för korutiner, sealed-klasser och null safety.
  • IR-backend ersatte den gamla AST-baserade backend och gav TypeScript-deklarationsgenerering och 20–30% mindre bundle.
  • NPM-integration gör det möjligt att ansluta alla JavaScript-bibliotek genom externa deklarationer och Kotlin Wrappers.
  • TypeScript-kompatibilitet implementeras genom automatisk generering av .d.ts-filer när generateTsDeclarations = true.
  • KMM-integration — den främsta fördelen med Kotlin/JS framför TypeScript, vilket möjliggör återanvändning av gemensam kod med mobila applikationer.
  • För isolerade webbprojekt förblir TypeScript det mer pragmatiska valet på grund av community-storleken och tillgången på typer.
  • Använd Kotlin/JS för frontend-delen av KMM-projekt eller vid utveckling med Compose Multiplatform för webben.

Vi utvecklar en mobil applikation nyckelfärdigt

IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.

Diskutera projektet

Läs också