对决:esbuild 0.21 vs. SWC 1.5 vs. Babel 8 在 TypeScript 5.6 代码转译中的表现

发布: (2026年5月4日 GMT+8 08:02)
7 分钟阅读
原文: Dev.to

Source: Dev.to

请提供您希望翻译的正文内容,我将按照要求保留链接、格式和代码块进行简体中文翻译。

esbuild 0.21 vs SWC 1.5 vs Babel 8: Transpiling TypeScript 5.6 Showdown

TypeScript 5.6 引入了期待已久的功能,如稳定的装饰器、常量类型参数以及改进的类型收窄,但要转译这些代码,需要跟上步伐的构建工具。我们将三款流行的转译器——esbuild 0.21、SWC 1.5 和即将推出的 Babel 8——进行对比,看看哪一个在速度、输出质量和兼容性之间提供了最佳平衡。

测试设置与方法论

我们使用了一个 12 000 行 的真实 TypeScript 代码库,其中大量使用了 TypeScript 5.6 专有特性:stage 3 装饰器、const 类型参数、satisfies 运算符的边缘案例以及新的 Array.prototype 方法。对以下四个关键指标在 10 次运行(取中位数)中进行测量:

  • 转译速度(冷构建和热构建)
  • 使用各工具默认压缩后的输出包体积(已最小化)
  • Source‑map 准确性(通过 source-map 库验证)
  • TypeScript 5.6 特性支持情况(15 个测试用例的通过/失败)
  • 转译过程中的峰值内存使用量

esbuild 0.21

esbuild 因利用 Go 的并发模型而赢得了超高速性能的声誉。0.21 版新增对 TypeScript 5.6 的 const 类型参数的原生支持,并改进了带元数据的装饰器处理。

优点

  • 冷启动构建时间最快:142 ms(针对测试代码库)
  • 内存占用最低:峰值 89 MB
  • 内置代码压缩和 source‑map 生成(无需额外插件)
  • 在我们的测试中实现了 100 % 的 TypeScript 5.6 功能支持

缺点

  • 输出体积大于 SWC,但小于 Babel 8(1.2 MB 压缩后)
  • 相比 Babel,插件生态系统有限
  • 不支持传统的 Babel 插件或自定义转换流水线

SWC 1.5

SWC(Speedy Web Compiler)是一款基于 Rust 的转译器,凭借速度可与 esbuild 相媲美,并通过其 @swc/plugin‑transform 生态系统提供对 Babel 插件的更广泛兼容性。1.5 版加入了对 TypeScript 5.6 装饰器的完整支持,并改进了对仅类型导入的 tree‑shaking。

优势

  • 最小的压缩后输出:1.1 MB(针对测试代码库)
  • 第二快的冷构建时间:167 ms
  • 100 % TypeScript 5.6 功能支持
  • 通过 SWC 的插件 API 与大多数 Babel 插件兼容

劣势

  • 内存使用高于 esbuild:峰值 124 MB
  • Source‑map 准确度略低(映射正确率为 98 %,而 esbuild 为 100 %)
  • 在复杂装饰器元数据的边缘案例中偶有问题

Babel 8

Babel 8(当前处于 beta 版)通过原生支持 TypeScript 5.6 对长期使用的 Babel 工具链进行现代化改造,去除了已废弃的旧 API,并将性能提升约 40 %(相较于 Babel 7)。它仍保留了 Babel 无与伦比的插件生态系统,可用于自定义转换。

优点

  • 最小的未压缩输出,压缩后输出大小可与 SWC 相媲美(1.1 MB
  • 完全支持 TypeScript 5.6 的所有特性(包括通过标志开启的实验性特性)
  • 最大的插件生态:成千上万的社区转换插件
  • 对复杂边缘情况提供最佳的 source‑map 精度

缺点

  • 冷启动构建最慢:892 ms(≈是 esbuild 的 6 倍)
  • 内存占用最高:峰值 312 MB
  • 相比 esbuild/SWC,需要更多的配置才能完成基本的 TypeScript 设置
  • 处于 beta 状态,偶尔会有破坏性更改

基准测试结果

指标esbuild 0.21SWC 1.5Babel 8
冷构建时间(毫秒)142167892
热构建时间(毫秒)2831412
压缩后输出大小(KB)120011001120
源映射准确率100 %98 %100 %
TS 5.6 功能支持100 %100 %100 %
峰值内存使用(MB)89124312

您应该选择哪一个?

  • 使用 esbuild 0.21 如果您优先考虑原始速度和对小到中等项目的低资源使用,或者您不需要自定义 Babel 插件。
  • 使用 SWC 1.5 如果您想要接近 esbuild 的速度,同时拥有更小的输出体积并兼容现有的 Babel 插件。
  • 使用 Babel 8 如果您依赖小众社区插件,需要最高的 source‑map 精度,或已经在 Babel 生态系统中投入(等其正式发布稳定版)。

结论

对于大多数团队转译 TypeScript 5.6 代码,esbuild 0.21 在速度和效率方面夺冠,SWC 1.5 在输出体积优化方面紧随其后。Babel 8 仍然是插件灵活性的黄金标准,但其性能滞后使其在大型代码库或快速迭代周期中不太理想。随着 TypeScript 的持续演进,三者都具备支持新特性的良好条件,但 esbuild 的简洁性和速度在我们的对决中占据优势。

0 浏览
Back to Blog

相关文章

阅读更多 »

伟大抽象的‘隐藏’成本

抽象的问题 在计算领域,我们倾向于抽象掉复杂性。这样做让人感到解放,因为它让我们能够专注于更大的图景……