Skip to content

Alfa do Transformer Oxc


Temos o prazer de anunciar o primeiro release em alfa da camada de transformação do Oxc (também chamada de transpilação).

Neste lançamento há três recursos principais:

  1. TypeScript compilado para ESNext.
  2. JSX do React compilado para ESNext com React Refresh embutido.
  3. Geração de .d.ts via isolated declarations do TypeScript sem o compilador tsc.

Nesta fase alfa recomendamos experimentar essas capacidades para acelerar os builds.

O nosso benchmark mostra:

  • Transformação: Oxc ~3–5× mais rápido que SWC, ~20% menos memória e pacote menor (2 MB frente a ~37 MB do SWC).
  • Transformação: Oxc ~20–50× mais rápido que Babel, ~70% menos memória e 19 MB a menos — bastam 2 pacotes npm em vez de ~170 do Babel.
  • React em modo dev + Refresh: Oxc ~5× mais rápido que SWC e ~50× mais rápido que Babel.
  • Isolated declarations .d.ts: nos arquivos típicos, Oxc ~40× mais rápido que TSC; nos maiores ~20×.

Casos de uso

Pacote npm oxc-transform

O Vue.js está experimentandooxc-transform para isolated declarations no pipeline:

javascript
import { isolatedDeclaration } from "oxc-transform";
const dts = isolatedDeclaration(filename, ts);

@lukeed e @maraisr usam oxc-transform nos pacotes empathic e dldr para transformar e gerar .d.ts num único passe.

Segue exemplo de .js e .d.ts num único passo:

javascript
import { transform } from "oxc-transform";
const transformed = transform(filePath, sourceCode, {
  typescript: {
    onlyRemoveTypeImports: true,
    declaration: { stripInternal: true },
  },
});
await fs.writeFile("out.js", transformed.code);
await fs.writeFile("out.d.ts", transformed.declaration);

unplugin-isolated-decl

O vue-macros usa unplugin-isolated-decl como integração ao plugin esbuild.

@sxzz relatou que o tempo para gerar .d.ts caiu de 76 s para 16 s.

Build Bazel na Airtable

@michaelm da Airtable integra a geração de isolated declarations com Oxc no CI dentro do pipeline Bazel.

Crate Rust oxc_transformer

O bundler Rolldown usa o crate oxc_transformer diretamente.

Resultados de benchmark

A configuração está em oxc-project/bench-transformer; gráficos em GitHub Actions.

(Ajustes na config são bem-vindos se algo estiver incorreto.)

No ubuntu-latest medimos diferentes volumes:

Transformação

Linhasoxcswcbabel
~1000,14 ms0,7 ms (5×)11,5 ms (82×)
~10000,9 ms5,7 ms (6,3×)38,7 ms (43×)
~1000014,9 ms35,9 ms (2,4×)492 ms (33×)

Isolated declarations

Linhasoxctsc
~1000,1 ms23,1 ms (231×)
~10003,1 ms26,8 ms (8,6×)
~100003,5 ms115,2 ms (33×)

Tamanho do pacote

O Oxc só puxa 2 pacotes npm, ~2 MB no total.

PacoteTamanho
@oxc-transform/binding-darwin-arm642,0 MB
@swc/core-darwin-arm6437,5 MB
@babel/core + @babel/preset-env + @babel/preset-react + @babel/preset-typescript21 MB e 170 pacotes

Memória

O Oxc consome menos memória.

Medição ao transformar parser.ts (10 777 linhas) com /usr/bin/time -alh node:

Max RSS
oxc51 MB
swc67 MB
babel172 MB

Próximo release

Esperamos abaixar alvo até ES6 e incluir @babel/plugin-transform-modules-commonjs.

Agradecimentos

Obrigado @Dunqing e @overlookmotel pelo trabalho enorme neste lançamento.

Obrigado snyder.tech, schoolhouse.world, @lukeed e @maraisr pelo apoio financeiro.