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:
- TypeScript compilado para ESNext.
- JSX do React compilado para ESNext com React Refresh embutido.
- Geração de
.d.tsvia isolated declarations do TypeScript sem o compiladortsc.
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:
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:
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
| Linhas | oxc | swc | babel |
|---|---|---|---|
| ~100 | 0,14 ms | 0,7 ms (5×) | 11,5 ms (82×) |
| ~1000 | 0,9 ms | 5,7 ms (6,3×) | 38,7 ms (43×) |
| ~10000 | 14,9 ms | 35,9 ms (2,4×) | 492 ms (33×) |
Isolated declarations
| Linhas | oxc | tsc |
|---|---|---|
| ~100 | 0,1 ms | 23,1 ms (231×) |
| ~1000 | 3,1 ms | 26,8 ms (8,6×) |
| ~10000 | 3,5 ms | 115,2 ms (33×) |
Tamanho do pacote
O Oxc só puxa 2 pacotes npm, ~2 MB no total.
| Pacote | Tamanho |
|---|---|
@oxc-transform/binding-darwin-arm64 | 2,0 MB |
@swc/core-darwin-arm64 | 37,5 MB |
@babel/core + @babel/preset-env + @babel/preset-react + @babel/preset-typescript | 21 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 | |
|---|---|
| oxc | 51 MB |
| swc | 67 MB |
| babel | 172 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.


