Транспилация — преобразуване на изходния код от един език за програмиране в друг на същото ниво на абстракция. За разлика от компилирането в машинен код, транспилацията превежда код между езици на високо ниво: TypeScript в JavaScript, Kotlin в Java, Dart в JavaScript. Според Babel Documentation, Babel е най-популярният транспилатор с над 35 милиона изтегляния на седмица и поддръжка на стотици плъгини.
Основни моменти
Транспилация (source-to-source компилация) — процес на превод на програма от един език за програмиране на друг, запазващ нивото на абстракция. Транспилаторът приема изходен код на език А и генерира еквивалентен код на език Б, който може да се изпълни в целевата среда. Типични примери: TypeScript в JavaScript, SASS в CSS, Haxe в няколко целеви езика.
Транспилацията се различава от компилацията по това, че изходният код остава на високо ниво и може да бъде прочетен от човек (въпреки че не е предназначен за това). Компилаторът (GCC, LLVM, javac) превежда код в машинен код или байт код — нечетим формат. Транспилаторът генерира код, който може да бъде допълнително компилиран или минифициран.
Защо е необходима транспилация. Основната причина е съвместимостта. Разработчиците искат да използват модерни езици (TypeScript с типове, Kotlin с null safety), но целевата платформа поддържа само JavaScript или Java. Транспилацията позволява писане на модерен език и внедряване на код, разбираем за целевата среда.
| Транспилатор | Източник → Цел | Приложение |
|---|---|---|
| Babel | ES6+/TypeScript → ES5 | Уеб разработка, React, Vue |
| tsc (TypeScript Compiler) | TypeScript → JavaScript | Всякакви TypeScript приложения |
| kotlinc-js | Kotlin → JavaScript | Kotlin/JS, React Kotlin Wrappers |
| dart2js | Dart → JavaScript | Flutter Web, AngularDart |
| SWC | TypeScript/JS → ES5 | Next.js, изграждане на Rust |
Ниво на абстракция — основната разлика. Транспилаторът превежда код между езици на едно и също ниво (високо ниво → високо ниво). Компилаторът превежда от високо ниво на ниско (машинен код, байт код). LLVM IR е междинно представяне, но все пак на по-ниско ниво от изходния C++ или Rust.
Четимост на резултата — втората разлика. Резултатът от транспилация (JavaScript от TypeScript) е четим и може да бъде дебъгнат в браузъра. Резултатът от компилация (машинен код от C++) не е предназначен за четене — анализът му изисква дезасемблер. Source maps помагат за дебъгване на транспилиран код, свързвайки го с изходния код.
В CI/CD пайплайни транспилацията се изпълнява на етапа на изграждане (build stage). За TypeScript проекти, tsc или Babel се стартират в Docker контейнер, генерират JavaScript и source maps, които след това се минифицират и внедряват на сървъра или в магазина за приложения. Важно е да се конфигурира кеширане на резултатите от транспилация — tsc --incremental запазва графа на зависимостите между стартиранията, намалявайки времето за изграждане с 30–50%.
За мобилни проекти (React Native) транспилацията чрез Metro Bundler се изпълнява на CI сървъра при всяко публикуване. За ускоряване се използват кеш директории (tmp/metro-cache) и паралелно изграждане чрез --workers. GitHub Actions и GitLab CI поддържат кеширане на node_modules и .cache директории между стартиранията, което е критично за намаляване на времето на пайплайна.
Скорост на изпълнение също се различава. Компилацията в машинен код дава максимална производителност. Транспилацията запазва overhead на нивото на абстракция: JavaScript от TypeScript се изпълнява със същата скорост като обикновен JavaScript. Оптимизациите (TypeScript --strict) работят на етапа на анализ, а не на етапа на изпълнение.
Сценарий 1: TypeScript → JavaScript — най-масовият сценарий. Разработчикът пише на TypeScript с типове, компилаторът tsc или Babel премахва анотациите на типовете и генерира чист JavaScript. Всички Angular проекти и повечето React проекти (2026) използват TypeScript транспилация. Според статистиката на State of JS 2025, 79% от анкетираните разработчици използват TypeScript в основните си проекти.
Сценарий 2: Kotlin → JavaScript — използва се в Kotlin/JS за Full-Stack разработка. Kotlin кодът се компилира в JavaScript чрез Kotlin Compiler с IR (Intermediate Representation). Kotlin/JS поддържа TypeScript-типизирани декларации (.d.ts) за интеграция с външни JS библиотеки. JetBrains използва Kotlin/JS в своите продукти за уеб интерфейси.
Сценарий 3: SASS/SCSS → CSS — транспилация на CSS препроцесори. Dart Sass (препоръчителна имплементация) транспилира .scss в .css, разгръщайки миксини, променливи, вложени правила и функции. Това не е компилация (CSS остава CSS), а транспилация със синтактично разширение.
| Параметър | Транспилация | Компилация | Интерпретация |
|---|---|---|---|
| Вход → Изход | Високо ниво → Високо ниво | Високо ниво → Машинен код | Код → Незабавно изпълнение |
| Пример | TypeScript → JavaScript | C++ → ARM/x86 | Python → CPython runtime |
| Изходният код четим | Да | Не | Н/П |
| Производителност | Като целевия език | Максимална | По-ниска от компилация |
| Изисква runtime | Не (чист целеви код) | Не | Да |
Babel — най-разпространеният JavaScript транспилатор, който преобразува ES6+/ESNext код в ES5-съвместим JavaScript. Babel работи чрез система от плъгини и пресети: всеки плъгин отговаря за една трансформация (arrow functions, async/await, optional chaining). @babel/preset-env автоматично определя необходимите плъгини въз основа на целевите браузъри (browserslist).
Архитектурата на Babel се състои от три етапа: парсване (parsing) → трансформация (transformation) → генериране (generation). Парсерът (Babylon/@babel/parser) преобразува изходния код в AST (Abstract Syntax Tree). Трансформаторите (плъгините) модифицират AST. Генераторът (@babel/generator) създава изходен код от модифицирания AST.
// Изходен 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;// След 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 преобразува: стрелковата функция във function expression, параметъра по подразбиране (name = „World“) в проверка void 0, template string в конкатенация, класа в конструктор функция и optional chaining (?.) във верига от тернарни оператори. const беше заменен с var за съвместимост с ES5 среди.
TypeScript — строго типизиран език, транспилиран до JavaScript. Компилаторът tsc (TypeScript Compiler) изпълнява две задачи: проверка на типове (type checking) и транспилация (emit). Важно е да се разбере: проверката на типове и транспилацията са независими етапи. Възможно е да се извърши транспилация без проверка на типове (--noEmitOnError false) или проверка без генериране на код (--noEmit true).
Транспилация на TypeScript премахва всички анотации на типове, интерфейси, type алиаси и генерични параметри — в JavaScript те не съществуват. Enum-ите се преобразуват в обекти, декораторите — в извиквания на функции, async/await — в генератори (ако target е под ES2017). tsconfig.json управлява target (версия на JavaScript), module (модулна система), strict (степен на проверка на типове) и outDir (изходна папка).
{
"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“ инструктира tsc да генерира JavaScript с ES6 синтаксис (стрелкови функции, класове, let/const). module: „esnext“ запазва ES модулите (import/export) за последващо Tree Shaking в Webpack. strict: true включва всички проверки на типове (strictNullChecks, noImplicitAny, strictFunctionTypes). declaration: true генерира .d.ts файлове за TypeScript потребители на библиотеката.
React Native използва Babel и Metro за транспилация на JavaScript/TypeScript в код, изпълняван от JavaScriptCore (iOS) или Hermes (Android). Babel плъгините добавят JSX трансформация, Flow/TypeScript анотации и оптимизации, специфични за React Native. Metro Bundler допълнително обединява модулите и изпълнява Hot Module Replacement за разработка.
Flutter използва Dart транспилация. За Flutter Web, dart2js транспилира Dart в оптимизиран JavaScript. За Flutter Mobile, dart2native компилира Dart в нативен ARM код. Flutter също поддържа Dart DevCompiler (dartdevc) за разработка — той транспилира Dart в JavaScript по-бързо, но с по-малко оптимизации.
// babel.config.js — 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 включва всички необходими плъгини за React Native: JSX, Flow/TypeScript, модулната система на Metro, async/await, class properties и декоратори. Плъгинът module-resolver добавя alias-и за кратки импорти (@/components/Button вместо ../../components/Button). В производствен режим transform-remove-console премахва всички console.log от кода.
Често задавани въпроси
Транспилация превежда код от един език на друг на същото ниво (напр. TypeScript → JavaScript). Компилация превежда от високо ниво на ниско (C++ → машинен код). Резултатът от транспилация е четим, резултатът от компилация — не.
React Native изисква транспилация по подразбиране — Metro Bundler използва Babel за преобразуване на JSX, TypeScript и модерен JavaScript в код, съвместим с JavaScriptCore и Hermes. Без Babel React Native не може да изпълни JSX синтаксиса на компонентите.
Може: Babel с @babel/preset-typescript и SWC поддържат транспилация на TypeScript. Това е по-бързо от tsc, но Babel не извършва проверка на типове — само премахва анотациите на типове. За проверка на типове tsc --noEmit трябва да се стартира като отделна команда или чрез fork-ts-checker-webpack-plugin.
Source maps — файлове, които свързват транспилирания код с изходния код. Позволяват дебъгване на TypeScript в браузъра: точките на прекъсване се поставят в .ts файлове, stack trace-овете показват редове .ts, а не .js. Без source maps дебъгването на транспилиран код е практически невъзможно.
Самата транспилация не влияе на производителността на приложението — изходният код се изпълнява със същата скорост като нативно написан код на целевия език. Overhead възниква само ако транспилаторът генерира неоптимален код (напр. Babel може да създава обемисти полифили за методи на масиви).
Резюме
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също