Transpilação: o que é, processo e ferramentas de transformação de código

Autor: IT Sectr Publicado: 2026-05-19 Tempo de leitura: 8 min

Transpilação é a conversão de código fonte de uma linguagem de programação para outra no mesmo nível de abstração. Ao contrário da compilação para código de máquina, a transpilação traduz código entre linguagens de alto nível: TypeScript para JavaScript, Kotlin para Java, Dart para JavaScript. De acordo com Babel Documentation, o Babel é o transpilador mais popular com mais de 35 milhões de downloads semanais e suporte a centenas de plugins.

Pontos principais

  • Transpilação é a tradução de código entre linguagens do mesmo nível de abstração (compilação fonte-a-fonte)
  • Babel transpila JavaScript moderno (ES6+) para ES5 compatível para navegadores antigos
  • TypeScript compila para JavaScript via tsc — um transpilador que remove tipos e converte para ES
  • Kotlin/Native e Kotlin/JS transpilam Kotlin para código nativo e JavaScript para desenvolvimento multiplataforma
  • Dart compila para JavaScript (dart2js) para web e para código nativo (dart2native) para plataformas móveis

O que é transpilação?

Transpilação (compilação fonte-a-fonte) é o processo de traduzir um programa de uma linguagem de programação para outra mantendo o mesmo nível de abstração. Um transpilador pega o código fonte na linguagem A e gera código equivalente na linguagem B que pode ser executado no ambiente de destino. Exemplos típicos: TypeScript para JavaScript, SASS para CSS, Haxe para múltiplas linguagens de destino.

A transpilação difere da compilação porque o código de saída permanece em um nível alto e pode ser lido por humanos (embora não seja destinado a isso). Um compilador (GCC, LLVM, javac) traduz código para código de máquina ou bytecode — um formato ilegível. Um transpilador gera código que pode ser posteriormente compilado ou minificado.

Por que a transpilação é necessária. A principal razão é a compatibilidade. Os desenvolvedores querem usar linguagens modernas (TypeScript com tipos, Kotlin com null safety), mas a plataforma de destino só suporta JavaScript ou Java. A transpilação permite escrever em uma linguagem moderna enquanto implanta código compreensível para o ambiente de destino.

Transpiladores populares

TranspiladorOrigem → DestinoAplicação
BabelES6+/TypeScript → ES5Desenvolvimento web, React, Vue
tsc (TypeScript Compiler)TypeScript → JavaScriptQualquer aplicação TypeScript
kotlinc-jsKotlin → JavaScriptKotlin/JS, React Kotlin Wrappers
dart2jsDart → JavaScriptFlutter Web, AngularDart
SWCTypeScript/JS → ES5Next.js, empacotamento com Rust

Transpilação vs compilação: diferenças principais

Nível de abstração é a principal diferença. Um transpilador traduz código entre linguagens do mesmo nível (alto nível → alto nível). Um compilador traduz de alto nível para baixo nível (código de máquina, bytecode). LLVM IR é uma representação intermediária, mas ainda está em nível inferior ao C++ ou Rust original.

Legibilidade do resultado é a segunda diferença. O resultado da transpilação (JavaScript a partir de TypeScript) é legível e pode ser depurado no navegador. O resultado da compilação (código de máquina a partir de C++) não foi feito para leitura — sua análise requer um desmontador. Os source maps ajudam a depurar o código transpilado vinculando-o ao código original.

Transpilação no contexto de CI/CD

Em pipelines de CI/CD, a transpilação é executada na etapa de build. Para projetos TypeScript, tsc ou Babel são executados em um contêiner Docker, geram JavaScript e source maps, que são então minificados e implantados em um servidor ou loja de aplicativos. É importante configurar o cache dos resultados da transpilação — tsc --incremental salva o grafo de dependências entre execuções, reduzindo o tempo de build em 30–50%.

Para projetos móveis (React Native), a transpilação via Metro Bundler é executada no servidor CI a cada publicação. Diretórios de cache (tmp/metro-cache) e builds paralelos via --workers aceleram o processo. GitHub Actions e GitLab CI suportam cache de node_modules e diretórios .cache entre execuções, o que é crítico para reduzir o tempo do pipeline.

Velocidade de execução também difere. A compilação para código de máquina fornece desempenho máximo. A transpilação preserva a sobrecarga do nível de abstração: JavaScript a partir de TypeScript executa na mesma velocidade que JavaScript comum. As otimizações (TypeScript —strict) funcionam na fase de análise, não em tempo de execução.

Cenários populares de transpilação

Cenário 1: TypeScript → JavaScript — o cenário mais comum. O desenvolvedor escreve TypeScript com tipos, o compilador tsc ou Babel remove as anotações de tipo e gera JavaScript puro. Todos os projetos Angular e a maioria dos projetos React (2026) usam transpilação TypeScript. De acordo com o State of JS 2025, 79% dos desenvolvedores pesquisados usam TypeScript em seus projetos principais.

Cenário 2: Kotlin → JavaScript — usado em Kotlin/JS para desenvolvimento full-stack. O código Kotlin compila para JavaScript através do Compilador Kotlin com IR (Intermediate Representation). Kotlin/JS suporta declarações tipadas do TypeScript (.d.ts) para integração com bibliotecas JS externas. A JetBrains usa Kotlin/JS em seus próprios produtos para interfaces web.

Cenário 3: SASS/SCSS → CSS — transpilação de pré-processadores CSS. Dart Sass (a implementação recomendada) transpila .scss para .css, expandindo mixins, variáveis, regras aninhadas e funções. Isso não é compilação (CSS continua sendo CSS), mas transpilação com extensão sintática.

Comparação: Transpilação vs Compilação vs Interpretação

ParâmetroTranspilaçãoCompilaçãoInterpretação
Entrada → SaídaAlto nível → Alto nívelAlto nível → Código de máquinaCódigo → Execução imediata
ExemploTypeScript → JavaScriptC++ → ARM/x86Python → runtime CPython
Código de saída legívelSimNãoN/A
DesempenhoIgual à linguagem destinoMáximoInferior à compilação
Requer runtimeNão (código destino puro)NãoSim

Babel: transpilação de JavaScript moderno

Babel é o transpilador JavaScript mais popular, convertendo código ES6+/ESNext em JavaScript compatível com ES5. O Babel funciona através de um sistema de plugins e presets: cada plugin é responsável por uma transformação (arrow functions, async/await, optional chaining). @babel/preset-env determina automaticamente os plugins necessários com base nos navegadores de destino (browserslist).

A arquitetura do Babel consiste em três etapas: parsing → transformação → geração. O parser (Babylon/@babel/parser) converte o código fonte em uma AST (Abstract Syntax Tree). Os transformadores (plugins) modificam a AST. O gerador (@babel/generator) produz o código de saída a partir da AST modificada.

Exemplo: transpilação com Babel

js
// Código ES6+ original
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;
js
// Após 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 transformou: a arrow function em uma function expression, o parâmetro padrão (name = "World") em uma verificação void 0, a template string em concatenação, a classe em uma função construtora e o optional chaining (?.) em uma cadeia de operadores ternários. const foi substituído por var para compatibilidade com ES5.

TypeScript: transpilação com sistema de tipos

TypeScript é uma linguagem fortemente tipada que transpila para JavaScript. O compilador tsc (TypeScript Compiler) realiza duas tarefas: verificação de tipos (type checking) e transpilação (emit). É importante entender: a verificação de tipos e a transpilação são etapas independentes. Você pode executar a transpilação sem verificação de tipos (--noEmitOnError false) ou verificar tipos sem gerar código (--noEmit true).

Transpilação TypeScript remove todas as anotações de tipo, interfaces, type aliases e parâmetros genéricos — eles não existem em JavaScript. Enums são convertidos em objetos, decoradores em chamadas de função, async/await em geradores (se target for inferior a ES2017). tsconfig.json controla target (versão do JavaScript), module (sistema de módulos), strict (rigor da verificação de tipos) e outDir (pasta de saída).

Configuração do TypeScript para transpilação

json
{
  "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" instrui o tsc a gerar JavaScript com sintaxe ES6 (arrow functions, classes, let/const). module: "esnext" preserva os módulos ES (import/export) para posterior Tree Shaking no Webpack. strict: true ativa todas as verificações de tipo (strictNullChecks, noImplicitAny, strictFunctionTypes). declaration: true gera arquivos .d.ts para consumidores TypeScript da biblioteca.

Transpilação no desenvolvimento móvel

React Native usa Babel e Metro para transpilar JavaScript/TypeScript em código executável pelo JavaScriptCore (iOS) ou Hermes (Android). Os plugins do Babel adicionam transformação JSX, anotações Flow/TypeScript e otimizações específicas do React Native. O Metro Bundler adicionalmente agrupa os módulos e realiza Hot Module Replacement para desenvolvimento.

Flutter usa transpilação Dart. Para Flutter Web, dart2js transpila Dart em JavaScript otimizado. Para Flutter Mobile, dart2native compila Dart em código ARM nativo. Flutter também suporta o Dart DevCompiler (dartdevc) para desenvolvimento — ele transpila Dart para JavaScript mais rápido, mas com menos otimização.

Exemplo: Configuração do Babel para React Native

js
// babel.config.js — Transpilação 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 inclui todos os plugins necessários para React Native: JSX, Flow/TypeScript, o sistema de módulos Metro, async/await, class properties e decoradores. O plugin module-resolver adiciona aliases para imports curtos (@/components/Button em vez de ../../components/Button). Em modo de produção, transform-remove-console remove todos os console.log do código.

Perguntas frequentes

Como a transpilação difere da compilação em termos simples?

Transpilação traduz código de uma linguagem para outra no mesmo nível (exemplo: TypeScript → JavaScript). Compilação traduz de alto nível para baixo nível (C++ → código de máquina). O resultado da transpilação é legível; o da compilação não.

A transpilação é necessária para React Native?

React Native requer transpilação por padrão — o Metro Bundler usa Babel para converter JSX, TypeScript e JavaScript moderno em código compatível com JavaScriptCore e Hermes. Sem Babel, o React Native não consegue executar a sintaxe JSX dos componentes.

Posso usar TypeScript sem tsc?

Sim: Babel com @babel/preset-typescript e SWC suportam transpilação TypeScript. É mais rápido que tsc, mas o Babel não realiza verificação de tipos — apenas remove anotações de tipo. Para verificação de tipos, você precisa executar tsc --noEmit separadamente ou via fork-ts-checker-webpack-plugin.

O que são source maps no contexto da transpilação?

Source maps são arquivos que vinculam o código transpilado ao código original. Eles permitem depurar TypeScript no navegador: os pontos de interrupção são definidos em arquivos .ts, os stack traces mostram linhas .ts em vez de .js. Sem source maps, depurar código transpilado é praticamente impossível.

Como a transpilação afeta o desempenho?

A transpilação em si não afeta o desempenho da aplicação — o código de saída executa na mesma velocidade que o código nativamente escrito na linguagem de destino. A sobrecarga ocorre apenas se o transpilador gerar código subótimo (por exemplo, o Babel pode criar polyfills volumosos para métodos de array).

Resumo

  • Transpilação é a conversão de código entre linguagens do mesmo nível de abstração (compilação fonte-a-fonte)
  • Babel é o principal transpilador JavaScript com um sistema de plugins e @babel/preset-env para configuração automática
  • TypeScript transpila para JavaScript via tsc, que remove anotações de tipo e converte sintaxe moderna
  • React Native usa Babel e Metro para transpilar JSX, TypeScript e ES6+ em código compatível
  • Transpilação vs compilação: a transpilação preserva um alto nível de abstração, a compilação traduz para código de máquina
  • Source maps são essenciais para depurar código transpilado e vinculam o código gerado ao código original

Vamos desenvolver um aplicativo móvel chave na mão

A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.

Discutir o projeto

Leia também