Skip to content

Альфа трансформера Oxc


Мы рады объявить об альфа-релизе трансформации Oxc (он же транспиляция).

В этом релизе три ключевые возможности:

  1. Преобразование TypeScript в ESNext.
  2. Преобразование React JSX в ESNext со встроенным React Refresh.
  3. генерация 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 в пайплайне сборки:

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

@lukeed и @maraisr используют oxc-transform в своих пакетах empathic и dldr, чтобы трансформировать и генерировать .d.ts за один проход.

Ниже пример генерации .js и .d.ts за один шаг трансформации:

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

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

Строкиoxcswcbabel
~1000.14 ms0.7 ms (5x)11.5 ms (82x)
~10000.9 ms5.7 ms (6.3x)38.7 ms (43x)
~1000014.9 ms35.9 ms(2.4x)492 ms (33x)

Isolated Declarations

Строкиoxctsc
~1000.1 ms23.1 ms (231x)
~10003.1 ms26.8 ms (8.6x)
~100003.5 ms115.2 ms (33x)

Размер пакета

Oxc подтягивает только 2 npm-пакета суммарно ~2 МБ.

PackageSize
@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 and 170 packages

Память

Oxc потребляет меньше памяти.

Использование памяти при трансформации parser.ts (10777 строк) — измерено через /usr/bin/time -alh node:

Max RSS
oxc51 MB
swc67 MB
babel172 MB

Следующий релиз

В следующем релизе ожидаются понижение цели до ES6 и @babel/plugin-transform-modules-commonjs.

Благодарности

Спасибо @Dunqing и @overlookmotel за огромную работу над этим релизом.

Спасибо snyder.tech, schoolhouse.world, @lukeed и @maraisr за щедрое спонсорство.