Oxc Transformer Alpha
We are excited to announce an alpha release for Oxc transform (a.k.a transpile).
This release contains three major features:
- Transforming TypeScript to ESNext.
- Transforming React JSX to ESNext, with built-in React Refresh.
- TypeScript Isolated Declarations DTS Emit without using the TypeScript compiler.
In this alpha stage, we recommend to experiment with these features to speed up build times.
Our benchmark shows:
- Transform: Oxc is 3x - 5x faster than SWC, uses 20% less memory, and has smaller package size (2 MB vs SWC's 37 MB).
- Transform: Oxc is 20x - 50x faster than Babel, uses 70% less memory, and is 19 MB smaller, with only 2 npm packages to install vs Babel's 170.
- React development + React Refresh: Oxc is 5x faster than SWC, 50x faster than Babel.
- TS isolated declarations
.d.tsemit: Oxc is 40x faster than TSC on typical files, 20x faster on larger files.
Usage Examples
oxc-transform npm package
Vue.js is currently experimenting the oxc-transform npm package for isolated declarations in its build pipeline:
import { isolatedDeclaration } from "oxc-transform";
const dts = isolatedDeclaration(filename, ts);@lukeed and @maraisr are utilizing oxc-transform for their packages empathic and dldr to transform and generate .d.ts in a single step.
The following example demonstrates emitting .js and .d.ts in a single transformation step:
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
vue-macros uses unplugin-isolated-decl as the integration tool for its esbuild plugin.
@sxzz reports their .d.ts generation time is reduced from 76s to 16s.
Bazel build at Airtable
@michaelm from Airtable is integrating Oxc's isolated declarations .d.ts emit in their CI pipeline within their Bazel build.
Rust oxc_transformer crate
The Rolldown bundler uses the oxc_transformer Rust crate directly.
Benchmark Results
The benchmark setup is located at oxc-project/bench-transformer and the benchmarks are shown in its GitHub Actions.
(Corrections are welcome for any misconfigurations.)
On ubuntu-latest, an example of different lines of code are measured:
Transform
| Lines | oxc | swc | babel |
|---|---|---|---|
| ~100 | 0.14 ms | 0.7 ms (5x) | 11.5 ms (82x) |
| ~1000 | 0.9 ms | 5.7 ms (6.3x) | 38.7 ms (43x) |
| ~10000 | 14.9 ms | 35.9 ms(2.4x) | 492 ms (33x) |
Isolated Declarations
| Lines | oxc | tsc |
|---|---|---|
| ~100 | 0.1 ms | 23.1 ms (231x) |
| ~1000 | 3.1 ms | 26.8 ms (8.6x) |
| ~10000 | 3.5 ms | 115.2 ms (33x) |
Package size
Oxc downloads only 2 npm packages, a total of 2 MB.
| Package | Size |
|---|---|
@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 and 170 packages |
Memory Usage
Oxc uses less memory.
Memory usage transforming parser.ts (10777 lines) - measured using /usr/bin/time -alh node:
| Max RSS | |
|---|---|
| oxc | 51 MB |
| swc | 67 MB |
| babel | 172 MB |
Next Release
Our next release will include target lowering to ES6 and @babel/plugin-transform-modules-commonjs.
Acknowledgements
Thank you @Dunqing and @overlookmotel for all the hard work involved in this release.
Thank you snyder.tech, schoolhouse.world, @lukeed and @maraisr for the generous sponsorship.


