Transpilarea — transformarea codului sursă dintr-un limbaj de programare în altul la același nivel de abstractizare. Spre deosebire de compilarea în cod mașină, transpilarea traduce codul între limbaje de nivel înalt: TypeScript în JavaScript, Kotlin în Java, Dart în JavaScript. Conform Babel Documentation, Babel este cel mai popular transpilator cu peste 35 de milioane de descărcări pe săptămână și suport pentru sute de pluginuri.
Principalele puncte
Transpilarea (compilare sursă-la-sursă) — procesul de traducere a unui program dintr-un limbaj de programare în altul, păstrând nivelul de abstractizare. Transpilatorul primește cod sursă în limbajul A și generează cod echivalent în limbajul B, care poate fi executat în mediul țintă. Exemple tipice: TypeScript în JavaScript, SASS în CSS, Haxe în mai multe limbaje țintă.
Transpilarea diferă de compilare prin faptul că codul de ieșire rămâne la nivel înalt și poate fi citit de om (deși nu este destinat acestui scop). Compilatorul (GCC, LLVM, javac) traduce codul în cod mașină sau bytecod — format ilizibil. Transpilatorul generează cod care poate fi compilat sau minificat suplimentar.
De ce este necesară transpilarea. Motivul principal este compatibilitatea. Dezvoltatorii doresc să folosească limbaje moderne (TypeScript cu tipuri, Kotlin cu null safety), dar platforma țintă suportă doar JavaScript sau Java. Transpilarea permite scrierea într-un limbaj modern și implementarea codului înțeles de mediul țintă.
| Transpilator | Sursă → Țintă | Utilizare |
|---|---|---|
| Babel | ES6+/TypeScript → ES5 | Dezvoltare web, React, Vue |
| tsc (TypeScript Compiler) | TypeScript → JavaScript | Orice aplicații TypeScript |
| kotlinc-js | Kotlin → JavaScript | Kotlin/JS, React Kotlin Wrappers |
| dart2js | Dart → JavaScript | Flutter Web, AngularDart |
| SWC | TypeScript/JS → ES5 | Next.js, construcție pe Rust |
Nivelul de abstractizare — diferența principală. Transpilatorul traduce codul între limbaje de același nivel (nivel înalt → nivel înalt). Compilatorul traduce de la nivel înalt la nivel jos (cod mașină, bytecod). LLVM IR este o reprezentare intermediară, dar totuși de nivel mai jos decât C++ sau Rust sursă.
Lizibilitatea rezultatului — a doua diferență. Rezultatul transpilării (JavaScript din TypeScript) este lizibil și poate fi depanat în browser. Rezultatul compilării (cod mașină din C++) nu este destinat citirii — analiza lui necesită un dezasamblor. Source maps ajută la depanarea codului transpilat, conectându-l cu codul sursă.
În pipe-line-urile CI/CD transpilarea se execută în etapa de construire (build stage). Pentru proiectele TypeScript, tsc sau Babel rulează într-un container Docker, generează JavaScript și source maps, care apoi sunt minificate și implementate pe server sau în magazinul de aplicații. Este important să configurați cache-ul rezultatelor transpilării — tsc --incremental salvează graful de dependențe între rulări, reducând timpul de construire cu 30–50%.
Pentru proiecte mobile (React Native) transpilarea prin Metro Bundler se execută pe serverul CI la fiecare publicare. Pentru accelerare se utilizează directoare cache (tmp/metro-cache) și construire paralelă prin --workers. GitHub Actions și GitLab CI suportă cache-ul node_modules și directoarelor .cache între rulări, ceea ce este critic pentru reducerea timpului pipe-line-ului.
Viteza de execuție diferă de asemenea. Compilarea în cod mașină oferă performanță maximă. Transpilarea păstrează overhead-ul nivelului de abstractizare: JavaScript din TypeScript se execută cu aceeași viteză ca JavaScript obișnuit. Optimizările (TypeScript --strict) funcționează în etapa de analiză, nu în etapa de execuție.
Scenariul 1: TypeScript → JavaScript — cel mai răspândit scenariu. Dezvoltatorul scrie în TypeScript cu tipuri, compilatorul tsc sau Babel elimină adnotările de tipuri și generează JavaScript pur. Toate proiectele Angular și majoritatea proiectelor React (2026) folosesc transpilarea TypeScript. Conform statisticii State of JS 2025, 79% dintre dezvoltatorii chestionați folosesc TypeScript în proiectele principale.
Scenariul 2: Kotlin → JavaScript — utilizat în Kotlin/JS pentru dezvoltare Full-Stack. Codul Kotlin se compilează în JavaScript prin Kotlin Compiler cu IR (Intermediate Representation). Kotlin/JS suportă declarații tipizate TypeScript (.d.ts) pentru integrarea cu biblioteci JS externe. JetBrains folosește Kotlin/JS în produsele sale pentru interfețe web.
Scenariul 3: SASS/SCSS → CSS — transpilarea procesoarelor CSS. Dart Sass (implementarea recomandată) transpilează .scss în .css, expandând mixinuri, variabile, reguli imbricate și funcții. Aceasta nu este compilare (CSS rămâne CSS), ci transpilare cu extindere sintactică.
| Parametru | Transpilare | Compilare | Interpretare |
|---|---|---|---|
| Intrare → Ieșire | Nivel înalt → Nivel înalt | Nivel înalt → Cod mașină | Cod → Execuție pe loc |
| Exemplu | TypeScript → JavaScript | C++ → ARM/x86 | Python → CPython runtime |
| Cod de ieșire lizibil | Da | Nu | N/A |
| Performanță | Ca limbajul țintă | Maximă | Mai mică decât compilarea |
| Necesită runtime | Nu (cod țintă pur) | Nu | Da |
Babel — cel mai răspândit transpilator JavaScript, care transformă codul ES6+/ESNext în JavaScript compatibil ES5. Babel funcționează printr-un sistem de pluginuri și preseturi: fiecare plugin este responsabil pentru o transformare (arrow functions, async/await, optional chaining). @babel/preset-env determină automat pluginurile necesare pe baza browserelor țintă (browserslist).
Arhitectura Babel constă din trei etape: parsare (parsing) → transformare (transformation) → generare (generation). Parserul (Babylon/@babel/parser) transformă codul sursă în AST (Abstract Syntax Tree). Transformatoarele (pluginurile) modifică AST. Generatorul (@babel/generator) creează codul de ieșire din AST-ul modificat.
// Cod sursă 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;// După 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 a transformat: funcția săgeată în function expression, parametrul implicit (name = „World”) în verificare void 0, șablonul string în concatenare, clasa în funcție-constructor și optional chaining (?.) în lanț de operatori ternari. const a fost înlocuit cu var pentru compatibilitate cu medii ES5.
TypeScript — un limbaj puternic tipizat, transpilat în JavaScript. Compilatorul tsc (TypeScript Compiler) îndeplinește două sarcini: verificarea tipurilor (type checking) și transpilarea (emit). Este important de înțeles: verificarea tipurilor și transpilarea sunt etape independente. Se poate efectua transpilarea fără verificarea tipurilor (--noEmitOnError false) sau verificarea fără generare de cod (--noEmit true).
Transpilarea TypeScript elimină toate adnotările de tipuri, interfețele, aliasurile de tip și parametrii generici — în JavaScript nu există. Enum-urile sunt transformate în obiecte, decoratorii — în apeluri de funcții, async/await — în generatoare (dacă target este sub ES2017). tsconfig.json gestionează target (versiunea JavaScript), module (sistemul de module), strict (gradul de verificare a tipurilor) și outDir (dosarul de ieșire).
{
"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” indică tsc să genereze JavaScript cu sintaxa ES6 (funcții săgeată, clase, let/const). module: „esnext” păstrează modulele ES (import/export) pentru Tree Shaking ulterior în Webpack. strict: true activează toate verificările de tipuri (strictNullChecks, noImplicitAny, strictFunctionTypes). declaration: true generează fișiere .d.ts pentru consumatorii bibliotecii în TypeScript.
React Native folosește Babel și Metro pentru transpilarea JavaScript/TypeScript în cod executat de JavaScriptCore (iOS) sau Hermes (Android). Pluginurile Babel adaugă transformarea JSX, adnotările Flow/TypeScript și optimizări specifice React Native. Metro Bundler suplimentar combină modulele și execută Hot Module Replacement pentru dezvoltare.
Flutter folosește transpilarea Dart. Pentru Flutter Web, dart2js transpilează Dart în JavaScript optimizat. Pentru Flutter Mobile, dart2native compilează Dart în cod nativ ARM. Flutter suportă de asemenea Dart DevCompiler (dartdevc) pentru dezvoltare — transpilează Dart în JavaScript mai rapid, dar cu mai puțină optimizare.
// babel.config.js — transpilare 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 include toate pluginurile necesare pentru React Native: JSX, Flow/TypeScript, sistemul de module Metro, async/await, class properties și decoratori. Pluginul module-resolver adaugă aliasuri pentru importuri scurte (@/components/Button în loc de ../../components/Button). În modul producție, transform-remove-console elimină toate console.log din cod.
Întrebări frecvente
Transpilarea traduce codul dintr-un limbaj în altul la același nivel (de exemplu, TypeScript → JavaScript). Compilarea traduce de la nivel înalt la nivel jos (C++ → cod mașină). Rezultatul transpilării este lizibil, rezultatul compilării — nu.
React Native necesită transpilare implicit — Metro Bundler folosește Babel pentru a transforma JSX, TypeScript și JavaScript modern în cod compatibil cu JavaScriptCore și Hermes. Fără Babel, React Native nu poate executa sintaxa JSX a componentelor.
Se poate: Babel cu @babel/preset-typescript și SWC suportă transpilarea TypeScript. Este mai rapid decât tsc, dar Babel nu efectuează verificarea tipurilor — doar elimină adnotările de tipuri. Pentru verificarea tipurilor trebuie rulat tsc --noEmit ca o comandă separată sau prin fork-ts-checker-webpack-plugin.
Source maps — fișiere care conectează codul transpilat cu codul sursă. Permit depanarea TypeScript în browser: punctele de întrerupere se plasează în fișierele .ts, stack trace-urile arată liniile .ts, nu .js. Fără source maps, depanarea codului transpilat este practic imposibilă.
Transpilarea în sine nu afectează performanța aplicației — codul de ieșire se execută cu aceeași viteză ca codul scris nativ în limbajul țintă. Overhead-ul apare doar dacă transpilatorul generează cod neoptim (de exemplu, Babel poate crea polyfill-uri voluminoase pentru metode de array).
Rezumat
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și