Альфа трансформера Oxc
Мы рады объявить об альфа-релизе трансформации Oxc (он же транспиляция).
В этом релизе три ключевые возможности:
- Преобразование TypeScript в ESNext.
- Преобразование React JSX в ESNext со встроенным React Refresh.
- генерация DTS из isolated declarations TypeScript без компилятора TypeScript.
На этой альфа-стадии мы рекомендуем экспериментировать с этими возможностями, чтобы ускорить сборки.
Наш бенчмарк показывает:
- Transform: Oxc примерно в 3–5 раз быстрее SWC, использует на ~20% меньше памяти и меньший размер пакета (2 МБ против ~37 МБ у SWC).
- Transform: Oxc примерно в 20–50 раз быстрее Babel, использует на ~70% меньше памяти и на 19 МБ меньше, при этом нужно установить только 2 npm-пакета против ~170 у Babel.
- React development + React Refresh: Oxc примерно в 5 раз быстрее SWC и в ~50 раз быстрее Babel.
- Изолированные декларации
.d.ts: на типичных файлах Oxc примерно в 40 раз быстрее TSC, на более крупных — примерно в 20 раз.
Примеры использования
npm-пакет oxc-transform
Vue.js сейчас экспериментирует с пакетом oxc-transform для isolated declarations в пайплайне сборки:
import { isolatedDeclaration } from "oxc-transform";
const dts = isolatedDeclaration(filename, ts);@lukeed и @maraisr используют oxc-transform в своих пакетах empathic и dldr, чтобы трансформировать и генерировать .d.ts за один проход.
Ниже пример генерации .js и .d.ts за один шаг трансформации:
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 использует unplugin-isolated-decl как интеграцию для esbuild-плагина.
@sxzz сообщает, что время генерации .d.ts сократилось с 76 с до 16 с.
Сборка Bazel в Airtable
@michaelm из Airtable интегрирует генерацию isolated declarations .d.ts из Oxc в CI в рамках сборки Bazel.
Rust-крейт oxc_transformer
Бандлер Rolldown использует Rust-крейт oxc_transformer напрямую.
Результаты бенчмарков
Настройка бенчмарка находится в oxc-project/bench-transformer, графики — в GitHub Actions.
(Исправления по возможным ошибкам конфигурации приветствуются.)
На ubuntu-latest замерены разные объёмы кода:
Transform
| Строки | 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
| Строки | 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) |
Размер пакета
Oxc подтягивает только 2 npm-пакета суммарно ~2 МБ.
| 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 |
Память
Oxc потребляет меньше памяти.
Использование памяти при трансформации parser.ts (10777 строк) — измерено через /usr/bin/time -alh node:
| Max RSS | |
|---|---|
| oxc | 51 MB |
| swc | 67 MB |
| babel | 172 MB |
Следующий релиз
В следующем релизе ожидаются понижение цели до ES6 и @babel/plugin-transform-modules-commonjs.
Благодарности
Спасибо @Dunqing и @overlookmotel за огромную работу над этим релизом.
Спасибо snyder.tech, schoolhouse.world, @lukeed и @maraisr за щедрое спонсорство.


