Transpilacja — przekształcanie kodu źródłowego z jednego języka programowania na inny na tym samym poziomie abstrakcji. W przeciwieństwie do kompilacji do kodu maszynowego, transpilacja tłumaczy kod między językami wysokiego poziomu: TypeScript na JavaScript, Kotlin na Java, Dart na JavaScript. Według Babel Documentation, Babel jest najpopularniejszym transpilatorem z 35+ milionami pobrań tygodniowo i obsługą setek wtyczek.
Najważniejsze
Transpilacja (kompilacja source-to-source) — proces tłumaczenia programu z jednego języka programowania na inny, zachowujący poziom abstrakcji. Transpilator przyjmuje kod źródłowy w języku A i generuje równoważny kod w języku B, który może być wykonany w docelowym środowisku. Typowe przykłady: TypeScript na JavaScript, SASS na CSS, Haxe na kilka języków docelowych.
Transpilacja różni się od kompilacji tym, że kod wyjściowy pozostaje na wysokim poziomie i może być odczytany przez człowieka (choć nie jest do tego przeznaczony). Kompilator (GCC, LLVM, javac) tłumaczy kod na kod maszynowy lub bajtowy — format nieczytelny. Transpilator generuje kod, który może być dodatkowo skompilowany lub zminifikowany.
Po co potrzebna jest transpilacja. Głównym powodem jest zgodność. Deweloperzy chcą używać nowoczesnych języków (TypeScript z typami, Kotlin z null safety), ale docelowa platforma obsługuje tylko JavaScript lub Java. Transpilacja pozwala pisać w nowoczesnym języku, a wdrażać kod zrozumiały dla docelowego środowiska.
| Transpilator | Źródło → Cel | Zastosowanie |
|---|---|---|
| Babel | ES6+/TypeScript → ES5 | Tworzenie stron, React, Vue |
| tsc (TypeScript Compiler) | TypeScript → JavaScript | Dowolne aplikacje w TypeScript |
| kotlinc-js | Kotlin → JavaScript | Kotlin/JS, React Kotlin Wrappers |
| dart2js | Dart → JavaScript | Flutter Web, AngularDart |
| SWC | TypeScript/JS → ES5 | Next.js, budowanie na Rust |
Poziom abstrakcji — główna różnica. Transpilator tłumaczy kod między językami tego samego poziomu (wysokopoziomowy → wysokopoziomowy). Kompilator tłumaczy z wysokiego poziomu na niski (kod maszynowy, bajtowy). LLVM IR jest reprezentacją pośrednią, ale wciąż niższego poziomu niż źródłowy C++ czy Rust.
Czytelność wyniku — druga różnica. Wynik transpilacji (JavaScript z TypeScript) jest czytelny i może być debugowany w przeglądarce. Wynik kompilacji (kod maszynowy z C++) nie jest przeznaczony do czytania — jego analiza wymaga dezasemblera. Source maps pomagają debugować transpilowany kod, łącząc go z kodem źródłowym.
W pipeline'ach CI/CD transpilacja wykonywana jest na etapie budowania (build stage). Dla projektów TypeScript tsc lub Babel uruchamiane są w kontenerze Docker, generują JavaScript i source maps, które następnie są minifikowane i wdrażane na serwer lub do sklepu z aplikacjami. Ważne jest skonfigurowanie cache'owania wyników transpilacji — tsc --incremental zapisuje graf zależności między uruchomieniami, skracając czas budowania o 30–50%.
Dla projektów mobilnych (React Native) transpilacja przez Metro Bundler wykonywana jest na serwerze CI przy każdej publikacji. Dla przyspieszenia używane są katalogi cache (tmp/metro-cache) i równoległe budowanie przez --workers. GitHub Actions i GitLab CI obsługują cache'owanie node_modules i katalogów .cache między uruchomieniami, co jest krytyczne dla skrócenia czasu pipeline'a.
Szybkość wykonania również się różni. Kompilacja do kodu maszynowego daje maksymalną wydajność. Transpilacja zachowuje narzut poziomu abstrakcji: JavaScript z TypeScript wykonuje się z tą samą prędkością co zwykły JavaScript. Optymalizacje (TypeScript --strict) działają na etapie analizy, a nie na etapie wykonania.
Scenariusz 1: TypeScript → JavaScript — najpopularniejszy scenariusz. Deweloper pisze w TypeScript z typami, kompilator tsc lub Babel usuwa adnotacje typów i generuje czysty JavaScript. Wszystkie projekty Angular i większość projektów React (2026) używa transpilacji TypeScript. Według State of JS 2025, 79% ankietowanych deweloperów używa TypeScript w głównych projektach.
Scenariusz 2: Kotlin → JavaScript — używany w Kotlin/JS do rozwoju Full-Stack. Kod Kotlin kompiluje się do JavaScript przez Kotlin Compiler z IR (Intermediate Representation). Kotlin/JS obsługuje deklaracje typowane TypeScript (.d.ts) do integracji z zewnętrznymi bibliotekami JS. JetBrains używa Kotlin/JS w swoich produktach dla interfejsów webowych.
Scenariusz 3: SASS/SCSS → CSS — transpilacja preprocesorów CSS. Dart Sass (zalecana implementacja) transpiluje .scss na .css, rozwijając miksiny, zmienne, zagnieżdżone reguły i funkcje. To nie jest kompilacja (CSS pozostaje CSS), a transpilacja z rozszerzeniem składniowym.
| Parametr | Transpilacja | Kompilacja | Interpretacja |
|---|---|---|---|
| Wejście → Wyjście | Wysokopoziomowy → Wysokopoziomowy | Wysokopoziomowy → Kod maszynowy | Kod → Wykonanie na bieżąco |
| Przykład | TypeScript → JavaScript | C++ → ARM/x86 | Python → CPython runtime |
| Kod wyjściowy czytelny | Tak | Nie | N/D |
| Wydajność | Jak języka docelowego | Maksymalna | Niższa niż kompilacja |
| Wymaga runtime | Nie (czysty kod docelowy) | Nie | Tak |
Babel — najpopularniejszy transpilator JavaScript, przekształcający kod ES6+/ESNext w JavaScript zgodny z ES5. Babel działa poprzez system wtyczek i presetów: każda wtyczka odpowiada za jedną transformację (arrow functions, async/await, optional chaining). @babel/preset-env automatycznie określa niezbędne wtyczki na podstawie docelowych przeglądarek (browserslist).
Architektura Babel składa się z trzech etapów: parsowanie (parsing) → transformacja (transformation) → generacja (generation). Parser (Babylon/@babel/parser) przekształca kod źródłowy w AST (Abstract Syntax Tree). Transformery (wtyczki) modyfikują AST. Generator (@babel/generator) tworzy kod wyjściowy z zmodyfikowanego AST.
// Kod źródłowy ES6+
const greet = (name = "World") => {
return `Hello, ${name}!`;
};
class User {
constructor(name) {
this.name = name;
}
}
const data = { user: { address: { city: "Moscow" } } };
const city = data?.user?.address?.city;// Po Babel (target: > 0.25%, not dead)
"use strict";
var greet = function (name) {
if (name === void 0) { name = "World"; }
return "Hello, " + name + "!";
};
var User = function (name) {
this.name = name;
};
var data = { user: { address: { city: "Moscow" } } };
var city = data != null
? data.user != null
? data.user.address != null
? data.user.address.city
: void 0
: void 0
: void 0;Babel przekształcił: funkcję strzałkową w function expression, parametr domyślny (name = „World“) w sprawdzenie void 0, template string w konkatenację, klasę w funkcję-konstruktor i optional chaining (?.) w łańcuch operatorów trójargumentowych. const został zastąpiony przez var dla zgodności ze środowiskami ES5.
TypeScript — silnie typowany język, transpilowany do JavaScript. Kompilator tsc (TypeScript Compiler) wykonuje dwa zadania: sprawdzanie typów (type checking) i transpilację (emit). Ważne jest zrozumienie: sprawdzanie typów i transpilacja to niezależne etapy. Można wykonać transpilację bez sprawdzania typów (--noEmitOnError false) lub sprawdzanie bez generowania kodu (--noEmit true).
Transpilacja TypeScript usuwa wszystkie adnotacje typów, interfejsy, aliasy typów i parametry generyczne — w JavaScript ich nie ma. Enum-y przekształcane są w obiekty, dekoratory — w wywołania funkcji, async/await — w generatory (jeśli target jest poniżej ES2017). tsconfig.json zarządza target (wersją JavaScript), module (systemem modułów), strict (stopniem sprawdzania typów) i outDir (folderem wyjściowym).
{
"compilerOptions": {
"target": "es2015",
"module": "esnext",
"lib": ["es2015", "dom"],
"strict": true,
"outDir": "./dist",
"rootDir": "./src",
"esModuleInterop": true,
"sourceMap": true,
"declaration": true
},
"include": ["src/**/*"],
"exclude": ["node_modules"]
}target: „es2015“ wskazuje tsc generować JavaScript ze składnią ES6 (funkcje strzałkowe, klasy, let/const). module: „esnext“ zachowuje moduły ES (import/export) do późniejszego Tree Shaking w Webpack. strict: true włącza wszystkie sprawdzania typów (strictNullChecks, noImplicitAny, strictFunctionTypes). declaration: true generuje pliki .d.ts dla konsumentów biblioteki w TypeScript.
React Native używa Babel i Metro do transpilacji JavaScript/TypeScript w kod wykonywany przez JavaScriptCore (iOS) lub Hermes (Android). Wtyczki Babel dodają transformację JSX, adnotacje Flow/TypeScript i optymalizacje specyficzne dla React Native. Metro Bundler dodatkowo łączy moduły i wykonuje Hot Module Replacement podczas rozwoju.
Flutter używa transpilacji Dart. Dla Flutter Web dart2js transpiluje Dart w zoptymalizowany JavaScript. Dla Flutter Mobile dart2native kompiluje Dart w natywny kod ARM. Flutter obsługuje również Dart DevCompiler (dartdevc) podczas rozwoju — transpiluje Dart w JavaScript szybciej, ale z mniejszą optymalizacją.
// babel.config.js — transpilacja React Native
module.exports = {
presets: [
["module:metro-react-native-babel-preset"],
],
plugins: [
["module-resolver", {
root: ["."],
alias: {
"@": "./src",
"@components": "./src/components",
},
}],
"react-native-reanimated/plugin",
],
env: {
production: {
plugins: ["transform-remove-console"],
},
},
};metro-react-native-babel-preset zawiera wszystkie niezbędne wtyczki dla React Native: JSX, Flow/TypeScript, system modułów Metro, async/await, class properties i dekoratory. Wtyczka module-resolver dodaje aliasy dla krótkich importów (@/components/Button zamiast ../../components/Button). W trybie produkcyjnym transform-remove-console usuwa wszystkie console.log z kodu.
Często zadawane pytania
Transpilacja tłumaczy kod z jednego języka na inny na tym samym poziomie (np. TypeScript → JavaScript). Kompilacja tłumaczy z wysokiego poziomu na niski (C++ → kod maszynowy). Wynik transpilacji jest czytelny, wynik kompilacji — nie.
React Native wymaga transpilacji domyślnie — Metro Bundler używa Babel do przekształcania JSX, TypeScript i nowoczesnego JavaScript w kod zgodny z JavaScriptCore i Hermes. Bez Babel React Native nie będzie mógł wykonać składni JSX komponentów.
Można: Babel z @babel/preset-typescript i SWC obsługują transpilację TypeScript. Jest to szybsze niż tsc, ale Babel nie wykonuje sprawdzania typów — tylko usuwa adnotacje typów. Do sprawdzania typów trzeba uruchomić tsc --noEmit osobnym poleceniem lub przez fork-ts-checker-webpack-plugin.
Source maps — pliki łączące transpilowany kod z kodem źródłowym. Pozwalają debugować TypeScript w przeglądarce: punkty zatrzymania ustawia się w plikach .ts, stack trace'y pokazują linie .ts, a nie .js. Bez source maps debugowanie transpilowanego kodu jest praktycznie niemożliwe.
Sama transpilacja nie wpływa na wydajność aplikacji — kod wyjściowy wykonuje się z tą samą prędkością co natywnie napisany w języku docelowym. Narzut powstaje tylko wtedy, gdy transpilator generuje nieoptymalny kod (np. Babel może tworzyć obszerne polifile dla metod tablic).
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również