跳转至正文

Oxc Transformer Alpha


我们很高兴为 Oxc transform(又名 transpile)发布一个 Alpha 版本。

此版本包含三大重要功能

  1. 将 TypeScript 转换为 ESNext。
  2. 将 React JSX 转换为 ESNext,并内置 React Refresh。
  3. TypeScript Isolated Declarations DTS 发射,无需使用 TypeScript 编译器。

在 alpha 阶段,我们建议使用这些功能进行实验以加快构建速度。

我们的基准测试表明

  • Transform:Oxc 的速度比 SWC 快 3 到 5 倍,使用的内存减少 20%,且包大小更小(2 MB,而 SWC 为 37 MB)。
  • Transform:Oxc 的速度比 Babel 快 20 到 50 倍,使用的内存减少 70%,并且小了 19 MB,只需安装 2 个 npm 包,而 Babel 需要 170 个。
  • React 开发 + React Refresh:Oxc 的速度比 SWC 快 5 倍,比 Babel 快 50 倍。
  • TS isolated declarations .d.ts 发射:在典型文件上 Oxc 比 TSC 的速度快 40 倍,在较大的文件上快 20 倍。

使用示例

oxc-transform npm 包

Vue.js 目前在构建管道中试验oxc-transform npm 包,用于实现 isolated declarations

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 构建

@michaelm 来自 Airtable 正在对其 Bazel 构建的 CI 管道中集成 Oxc 的隔离声明 .d.ts 导出。

Rust oxc_transformer crate

Rolldown bundler 直接使用 oxc_transformer Rust crate。

基准测试结果

基准测试设置位于 oxc-project/bench-transformer,而基准测试显示在其 GitHub Actions 中。

(对于不正确的配置欢迎进行更正。)

ubuntu-latest 上,测量了不同代码行的示例

Transform

oxcswcbabel
~1000.14 毫秒0.7 毫秒(5 倍)11.5 毫秒(82 倍)
~10000.9 毫秒5.7 毫秒(6.3 倍)38.7 毫秒(43 倍)
~1000014.9 毫秒35.9 毫秒(2.4 倍)492 毫秒(33 倍)

Isolated Declarations

oxctsc
~1000.1 毫秒23.1 毫秒 (231x)
~10003.1 毫秒26.8 毫秒 (8.6x)
~100003.5 毫秒115.2 毫秒 (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 使用的内存更少。

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

最大 RSS
oxc51 MB
swc67 MB
babel172 MB

下一个版本

我们的下一个版本将包含目标降低到 ES6 和 @babel/plugin-transform-modules-commonjs

鸣谢

感谢 @Dunqing@overlookmotel 为此版本所付出的辛勤工作。

感谢 snyder.tech, schoolhouse.world, @lukeed@maraisr 提供的慷慨的 赞助

根据 MIT 许可证发布。