SWC:Rust 驱动的 Web 编译革命 ⚡🦀

如果你在 2026 年还在用纯 JavaScript 写的转译工具,那么每次保存文件后的那几秒停顿,可能已经让你在无数杯咖啡中怀疑人生。曾经有位同事开玩笑说:“CI 管道里,Babel 和 Terser 的耗时都快赶上单元测试了。” 而今天,我们用 Rust 写了一个更快的东西,它就是 SWC

SWC 是什么?它凭什么快?

SWC (Speedy Web Compiler) 定位为 “Rust-based platform for the Web”。它不是一个简单的 Babel 替代品,而是一个完整的可扩展编译平台,涵盖 JavaScript/TypeScript 转译、代码压缩、打包(spack),甚至支持 CSS 处理和插件系统。其核心亮点在于:用 Rust 实现,单次解析,多任务输出,性能碾压传统工具。

拿一个包含 2000 多个 .tsx 文件的中型项目测试:SWC 转译只需 2.3 秒,而 Babel + TSC 的组合要 19.8 秒,差距近 9 倍。压缩方面,swc minify 比 Terser 快 7 倍以上,且输出体积更小。这个速度来自于 Rust 的零成本抽象和并行处理能力,以及对 SIMD 优化。

“SWC 的速度就像把法拉利引擎装进了你的构建管道。” —— 某位被解放的开发者

实际场景:从 Next.js 到你的个人项目

或许你已经用过 SWC,只是没意识到。Next.js 12 起将 SWC 作为默认编译器,替换了 Babel 和 Terser,使得热更新和构建速度大幅提升。Vercel 的工程团队甚至专门为此优化了 SWC 的内存占用。此外,Deno 的许多官方插件也直接基于 SWC;ParceJS 2 也集成了 SWC 作为可选的转译后端。这些“代言人”级别项目都在用 SWC,足以说明其生产可靠性。

但 SWC 并不是大项目的专属玩具。即使你只是在维护一个简单的个人博客,试试把 package.json 里的 @babel/core 换成 @swc/core,配合 swc-loader,你会发现 npm run dev 的开始时间缩短了近一半。而且配置方式和 Babel 几乎一致,迁移成本为零。

核心功能速览 🧰

JavaScript 与 TypeScript 转译

SWC 能把最新的 ES2026 语法(装饰器、管道操作符、Record & Tuple 等)轻松降级到 ES5,并可选地注入 polyfill。内置对 JSX、TypeScript 的支持,无需额外安装插件。


// .swcrc
{
  "jsc": {
    "parser": {
      "syntax": "typescript",
      "tsx": true,
      "decorators": true
    },
    "target": "es2015"
  },
  "module": {
    "type": "commonjs"
  }
}

是的,这就是 SWC 的全部配置。没有几十个 preset 和 plugin 需要排列组合。

代码压缩

通过 swc minify 命令或 API,可对 JavaScript 进行高级压缩,支持死代码删除、标识符混淆、常量折叠,甚至能内联部分函数。与 Terser 相比,输出质量一致甚至更好,但速度快得离谱。

实验性打包工具 spack

SWC 也在打造自己的打包器 spack,类似 esbuild 的打包模式,支持 tree shaking、代码分割和文件监听。虽然尚未达到 Webpack 的功能完整度,但对于库打包和简单应用已经够用。配置借鉴了 Webpack 的思想,学习成本低:


// spack.config.js
const { config } = require('@swc/core/spack');

module.exports = config({
  entry: {
    web: __dirname + '/src/index.ts'
  },
  output: {
    path: __dirname + '/dist'
  },
  module: {}
});

强大的插件系统 🔌

SWC 的插件系统是其真正迈向“平台”的关键。你可以用 JavaScript/TypeScript 编写插件,借助 SWC 提供的 AST 节点类型实现自定义转译逻辑,比如自动注入埋点代码、移除调试语句、国际化文案替换等。插件在 Rust 宿主中执行,性能依然可观。

5 分钟快速接入 🚀

在你的 Node.js 项目中安装 @swc/core


npm install --save-dev @swc/core @swc/cli

然后就可以直接跑:


npx swc src -d dist

如果你使用 Webpack,只需安装 swc-loader 并替换 babel-loader


// webpack.config.js
module: {
  rules: [
    {
      test: /\.(ts|tsx|js|jsx)$/,
      exclude: /node_modules/,
      use: {
        loader: 'swc-loader',
        options: {
          jsc: {
            parser: { syntax: 'typescript', tsx: true },
            target: 'es2015'
          }
        }
      }
    }
  ]
}

重启开发服务器,相信我,你会回来赞的。

进阶技巧:释放 SWC 的最大潜力

1. 利用 env 配置多目标:SWC 的 .swcrc 可以通过 env 字段根据 process.env.NODE_ENV 切换配置,比如开发环境关闭压缩,生产环境开启。这比 Babel 的 env 方案更直观。

2. 与 Jest 集成:使用 @swc/jest 替换默认的 Babel 转换,测试启动时间可减少 60% 以上。只需在 jest.config 中设置 transform:


transform: {
  '^.+\\.(t|j)sx?$': '@swc/jest'
}

3. 自定义插件开发:如果你是框架/工具作者,可以编写 SWC 插件来实现自动化代码转换。例如,自动为 React 组件添加 displayName,或自动处理特有的宏语法。SWC 提供丰富的测试工具,让你能在 Rust-free 的环境下验证插件逻辑。

4. 使用 SWC 直接替代 Babel-node:通过 @swc-node/register 可以让 Node.js 直接运行 TypeScript 文件,无需预编译,速度极快。对于脚本和 CLI 工具开发非常有帮助。

走向平台化:不止于编译

SWC 的目标早已超出“替代 Babel”。它正朝着多功能的 Web 基础平台发展。SWC 的作者 kdy1 和社区正在积极推进 CSS 压缩和打包(swc_css)、HTML 压缩WASM 编译,甚至实验性地支持 GraphQLMarkdown 转换。想象一下,未来的前端构建可能只需要一个二进制文件,由 Rust 驱动所有语言的处理,彻底告别 Node.js 生态中漫长工具链的启动延迟。

目前 SWC 已支持 CSS 的 minify 和 prefix,速度比 cssnano 快 10 倍以上。通过在 .swcrc 中启用 CSS 处理,你可以得到一个全能的资源处理管道:


{
  "jsc": { /* ... */ },
  "minify": true,
  "css": {
    "minify": true,
    "modules": true
  }
}

总结:你应该在 2026 年拥抱 SWC 吗?

答案是肯定的,并且理由非常充分:

  • 开发体验质的飞跃:极速编译意味着更快的反馈循环,编码时几乎感觉不到工具的存在。
  • 🔄 现有生态无缝衔接:与 Webpack、Next.js、Jest、Vite 等主流工具完美集成。
  • 📦 统一工具链:用一套配置管理 JS、TS、JSX、CSS 的编译、压缩、打包,减少依赖混乱。
  • 🦀 Rust 的未来潜力:安全、并发、高性能,SWC 站在了下一个十年的技术潮流前沿。

就算你暂时不需要迁移整个项目,也可以从某个局部(比如测试 runner 或 CI 压缩)开始尝试。一次尝试,你就再也回不去了。 正如 SWC 的口号:“Build with rust, run for web.”,它让 Web 构建真正跑在了 Rust 的轨道上。

今天 GitHub Trending 再次将 SWC 推上榜首,或许正是时候让你的工具链也跟上这次演进。点击 swc-project/swc 去看看,给项目一颗星,加入这场 Rust 驱动的 Web 效率革命吧!🌟