Skip to content

Oxc Transformer Alpha


我们很高兴宣布 Oxc 转换(又名 transpile)的 Alpha 版本发布。

此版本包含三大主要功能:

  1. 将 TypeScript 转换为 ESNext。
  2. 将 React JSX 转换为 ESNext,内置 React Refresh 支持。
  3. TypeScript 隔离声明 DTS 输出,无需使用 TypeScript 编译器。

在当前 Alpha 阶段,我们建议您尝试这些功能,以加速构建速度。

我们的基准测试 显示:

  • 转换:Oxc 比 SWC 快 3x 至 5x,内存占用减少 20%,包体积更小(2 MB vs SWC 的 37 MB)。
  • 转换:Oxc 比 Babel 快 20x 至 50x,内存占用减少 70%,包体积小 19 MB,仅需安装 2 个 npm 包,而 Babel 需要 170 个。
  • React 开发 + React Refresh:Oxc 比 SWC 快 5x,比 Babel 快 50x。
  • TS 隔离声明 .d.ts 输出:在典型文件上,Oxc 比 TSC 快 40x;在较大文件上快 20x。

使用示例

oxc-transform npm 包

Vue.js 当前正在 实验 在其构建流程中使用 oxc-transform npm 包来处理隔离声明:

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

@lukeed@maraisr 正在使用 oxc-transform 来处理其项目 empathicdldr,实现将代码转换并生成 .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 秒。

Airtable 的 Bazel 构建

来自 Airtable@michaelm 已在其 CI 流水线中集成了 Oxc 的隔离声明 .d.ts 输出功能,用于 Bazel 构建

Rust oxc_transformer crate

Rolldown 打包器直接使用 oxc_transformer Rust crate 进行调用

基准测试结果

基准测试配置位于 oxc-project/bench-transformer,相关基准测试可在其 GitHub Actions 中查看。

(如发现任何配置错误,欢迎提出修正。)

ubuntu-latest 环境下,测量了不同行数代码的表现:

转换

行数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)

隔离声明

行数oxctsc
~1000.1 ms23.1 ms (231x)
~10003.1 ms26.8 ms (8.6x)
~100003.5 ms115.2 ms (33x)

包大小

Oxc 仅需下载 2 个 npm 包,总计 2 MB。

大小
@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 与 170 个包

内存使用量

Oxc 占用更少的内存。

使用 /usr/bin/time -alh node 测量 parser.ts(10777 行)的转换内存使用情况:

最大 RSS
oxc51 MB
swc67 MB
babel172 MB

下一版本

下一版本将包含目标降级至 ES6 以及 @babel/plugin-transform-modules-commonjs 功能。

致谢

感谢 @Dunqing@overlookmotel 在本次发布中付出的所有辛勤努力。

感谢 snyder.techschoolhouse.world@lukeed@maraisr 对本项目的慷慨 赞助