SWC
基于 Rust 实现的超高性能 JavaScript/TypeScript 编译器,速度比 Babel 快 20-70 倍,是 Next.js 的默认编译器。
SWC 是使用 Rust 编写的新一代 JavaScript/TypeScript 编译器,单线程比 Babel 快约 20 倍、多线程快约 70 倍。作为 Next.js、Parcel、Deno 的默认编译器,npm 周下载量约 4000 万。
SWC — 高性能 Rust 转译器
基于 Rust 实现的超高性能 JavaScript/TypeScript 编译器,速度比 Babel 快 20-70 倍,是 Next.js 的默认编译器。
技术简介说明
SWC(Speedy Web Compiler)是使用 Rust 语言编写的新一代 JavaScript/TypeScript 编译器。它的目标是在保持与 Babel 功能兼容的前提下,提供数量级的性能提升。SWC 通过 Rust 的零成本抽象、内存安全和优秀的并发模型,实现了单线程下约 20 倍、多线程下约 70 倍于 Babel 的编译速度,同时通过了几乎所有 TC39 官方的 test262 兼容性测试。
SWC 的核心定位是编译转译器——负责将 JavaScript/TypeScript/JSX 等源代码转换为兼容的目标 JavaScript 输出。与 Babel 类似,SWC 不做模块打包,而是专注于文件级别的语法转换和代码压缩。它的架构设计高度模块化,解析器、转换器、压缩器、代码生成器均为独立的 Rust crate,可以被其他工具集成使用。
2026 年,SWC 已从"新兴工具"转型为"成熟基础设施"。它是 Next.js 12+ 的默认编译器,被 Parcel、Deno、Rspack 等主流工具采用,npm 周下载量约 4000 万。SWC 的 Wasm 插件系统在 2025 年实现了向后兼容,解决了每次 swc_core 更新都需要重新编译插件的痛点。面对 OXC 等新竞争者(解析速度快 3 倍),SWC 聚焦编译核心能力的深化和框架集成的巩固。
基本信息
| 项目 | 详情 |
|---|---|
| 官网 | https://swc.rs |
| GitHub | https://github.com/swc-project/swc |
| License | Apache-2.0 |
| 最新版本 | v1.15.43(2026 年 6 月 22 日) |
| 主要维护者 | Donny / 강동윤(DongYoon Kang,@kdy1) |
| 核心团队成员 | OJ Kwon、magic-akari、Austaras、CPunisher |
| 公司支持 | 社区驱动开源项目,OpenCollective 赞助 |
| GitHub Stars | ~34,100 |
| npm 周下载量 | ~3,950 万 |
| 累计 Releases | 809+ |
快速上手
安装
# 安装核心编译器
npm install --save-dev @swc/core
# 安装 CLI 工具
npm install --save-dev @swc/cli
# 或全局安装 CLI
npm install -g @swc/cli @swc/core基础配置
创建 .swcrc 配置文件:
{
"jsc": {
"parser": {
"syntax": "typescript",
"tsx": true,
"decorators": true
},
"target": "es2022",
"loose": false,
"minify": {
"compress": false,
"mangle": false
}
},
"module": {
"type": "es6"
},
"minify": false,
"isModule": true
}最小示例
# CLI 编译单个文件
npx swc src/index.tsx -o dist/index.js
# 编译整个目录
npx swc src -d dist
# 带 source map
npx swc src -d dist --source-maps通过 JavaScript API 使用:
import { transform } from '@swc/core';
const result = await transform(
'const x: number = 1; console.log(x);',
{
jsc: {
parser: { syntax: 'typescript' },
target: 'es2022'
}
}
);
console.log(result.code);
// 输出: const x = 1;
// console.log(x);核心概念与架构
四层架构
┌──────────────────────────────────────────────────────────┐
│ JavaScript API Layer (@swc/core) │ ← JS/TS 调用入口
├──────────────────────────────────────────────────────────┤
│ Native Bindings (napi-rs / Wasm) │ ← Rust ↔ JS 桥接
├──────────────────────────────────────────────────────────┤
│ Core Rust Engine │
│ ├── swc_ecma_parser — 词法分析 + 语法分析 │
│ ├── swc_ecma_ast — AST 定义 │
│ ├── swc_ecma_visit — AST 遍历(Visitor 模式) │
│ ├── swc_ecma_transforms — 转换器集合 │
│ ├── swc_ecma_codegen — 代码生成 │
│ └── swc_atoms — 字符串 Intern(池化) │
├──────────────────────────────────────────────────────────┤
│ Distribution Packages │ ← 平台特定二进制 / Wasm
└──────────────────────────────────────────────────────────┘
处理流程
源代码 (JS/TS/JSX)
│
▼
swc_ecma_parser(词法分析 + 语法分析)
│
▼
swc_ecma_ast(内存 AST + swc_atoms 字符串池化)
│
▼
swc_ecma_visit + swc_ecma_transforms(Visitor 模式,Fold/Visit traits)
│
▼
swc_ecma_codegen(代码生成,输出 JS)
关键设计特点
- 字符串 Interning:
swc_atoms模块通过字符串池化,将标识符按指针比较而非值比较,大幅提升比较效率 - 完全模块化:parser、transformer、resolver、minifier、codegen 均为独立 crate,可单独使用
- test262 兼容:解析器通过几乎所有 TC39 官方测试套件
- Wasm 插件:通过
swc_plugin_runner支持 Wasm 插件扩展转换逻辑
核心特性
- 极致性能:单线程比 Babel 快约 20 倍,多线程(Promise.all)快约 70-253 倍
- 完整的 TypeScript 支持:解析和转换所有 TypeScript 语法(类型剥离,不做类型检查)
- JSX/TSX 支持:支持经典和自动运行时 JSX 转换
- 代码压缩:内置 minifier,可替代 Terser
- Source Map:完整的 source map 生成能力
- Wasm 插件系统:支持通过 Rust 编写 Wasm 插件扩展转换逻辑
- 框架深度集成:Next.js 默认编译器,Parcel/Deno/Rspack 内置支持
- tc39/test262 兼容:解析器通过几乎所有 TC39 官方兼容性测试
- React Fast Refresh:内置支持 React 快速刷新
- 模块化 crate 设计:每个组件可独立使用(如单独使用解析器)
生态图
SWC 生态系统
┌──────────────────────────────────────────────────────────────┐
│ SWC 生态系统 │
├──────────────────────────────────────────────────────────────┤
│ │
│ 核心包 │
│ ├── @swc/core — 核心编译器(JS/TS 转换、压缩) │
│ ├── @swc/cli — 命令行工具(新版命令 swcx) │
│ ├── @swc/helpers — 运行时 helpers(类似 @babel/helpers)│
│ ├── @swc/types — TypeScript 类型定义 │
│ └── @swc/wasm — Wasm 构建(浏览器/非 Node 环境) │
│ │
│ 构建集成 │
│ ├── swc-loader — Webpack loader │
│ ├── @swc/register — Node.js require hook │
│ └── @next/swc-* — Next.js 内置 SWC 平台包 │
│ │
│ 独立集成 │
│ ├── @swc-node/core — Node.js 集成(独立维护) │
│ ├── @swc-node/register — Node.js require hook(独立维护) │
│ └── swc_plugin_runner — Wasm 插件运行时 │
│ │
│ 框架采用 │
│ ├── Next.js — 默认编译器(替代 Babel) │
│ ├── Parcel — 默认转换器 │
│ ├── Deno — JS/TS 转换 │
│ ├── Rspack — 内置 builtin:swc-loader │
│ └── NestJS — 可选加速编译 │
│ │
│ 插件生态 │
│ ├── SWC Plugin Registry — 集中化插件发现平台 │
│ ├── swc-plugin-* — 社区 Wasm 插件 │
│ └── @swc/plugin-* — 官方插件(emotion、styled-components 等)│
│ │
└──────────────────────────────────────────────────────────────┘
适用场景
- 大型项目的快速编译:替代 Babel 获得 20-70 倍的编译速度提升
- Next.js 项目:Next.js 12+ 默认使用 SWC,无需额外配置
- 开发模式加速:HMR 和增量编译场景下,SWC 的速度优势尤为明显
- Deno 运行时:Deno 使用 SWC 进行 JS/TS 转译
- 代码压缩替代 Terser:SWC 内置 minifier 速度更快
- Rust 工具链集成:需要高性能 JS 解析/转换的 Rust 项目可使用 SWC 的独立 crate
- Wasm 插件开发:通过 Wasm 插件实现自定义转换逻辑
开发与工程化
Webpack 集成
// webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.(ts|tsx|js|jsx)$/,
use: {
loader: 'swc-loader',
options: {
jsc: {
parser: {
syntax: 'typescript',
tsx: true
},
target: 'es2022'
}
}
}
}
]
}
};Next.js 配置
Next.js 12+ 默认使用 SWC,可通过 next.config.js 自定义:
// next.config.js
module.exports = {
swcMinify: true, // 启用 SWC 压缩(替代 Terser)
jsc: {
experimental: {
plugins: [
// SWC Wasm 插件
['@swc/plugin-emotion', {}]
]
}
}
};CI/CD 集成
# 使用 SWC 编译
- name: Build with SWC
run: npx swc src -d dist --source-maps
# 缓存 SWC 依赖
- name: Cache SWC
uses: actions/cache@v4
with:
path: node_modules/.cache/swc-loader
key: ${{ runner.os }}-swc-${{ hashFiles('.swcrc') }}性能与安全
性能数据
单线程同步 Benchmark
| 配置 | ops/sec | 相对 Babel 倍数 |
|---|---|---|
| babel (es5) | 34.05 | 基准 (1x) |
| swc (es3) | 616 | ~18x |
| swc (es2015) | 677 | ~20x |
| swc (es2018) | 2,555 | ~75x |
多线程异步 Benchmark(Promise.all)
| 场景 | SWC ops/sec | Babel ops/sec | 倍数 |
|---|---|---|---|
| 4 并行 promises (es2018) | 4,884 | 27.28 | ~179x |
| 100 并行 promises (es3) | 2,199 | 32 | ~69x |
| 100 并行 promises (es2018) | 8,108 | 32 | ~253x |
性能优化建议
- 多线程编译:对于多文件项目,使用
Promise.all并行编译可获最大加速 - 启用 minifier:SWC 内置 minifier 比 Terser 快得多
- 平台特定二进制:
@swc/core自动选择最优的平台特定 native binding - 减少插件开销:Wasm 插件有一定开销,评估是否真正需要
- target 设置:设置较高的
jsc.target(如es2022)减少不必要的转换
安全注意事项
- Wasm 插件隔离:Wasm 插件在沙箱中运行,安全性有保障
- 依赖审计:
@swc/core通过 napi-rs 桥接 Rust 和 Node.js,需关注 native binding 的安全更新 - 输入验证:确保编译输入来源可信
技术对比
与同类工具的详细对比
| 维度 | SWC | Babel | esbuild | OXC | Sucrase |
|---|---|---|---|---|---|
| 实现语言 | Rust | JavaScript | Go | Rust | JavaScript |
| 定位 | 编译器(类 Babel) | 编译器 | 编译器 + 打包器 | 工具链 | 快速转换器 |
| vs Babel 速度 | 20-253x | 基准 | 定位不同 | 20x+ | ~20x |
| TypeScript | ✅ 剥离类型 | ✅ 剥离类型 | ✅ 剥离类型 | ✅ 剥离类型 | ✅ 剥离类型 |
| 类型检查 | ❌ | ❌ | ❌ | ❌ | ❌ |
| JSX | ✅ | ✅ | ✅ | ✅ | ✅ |
| 打包能力 | ❌ | ❌ | ✅ | ✅(Rolldown) | ❌ |
| 插件系统 | Wasm 插件 | JS 插件(最丰富) | JS 插件(有限) | 发展中 | 不支持 |
| 代码压缩 | ✅ 内置 | ❌(需外部) | ✅ 内置 | ✅ 内置 | ❌ |
| 框架集成 | Next.js、Parcel、Deno | Webpack、Rollup、Jest | Vite、Angular 17+ | Vite 8、Rolldown | Sandpack、Jest |
| npm 周下载量 | ~3950 万 | ~6.5 亿 | ~2.37 亿 | ~1000 万 | ~数百万 |
| 成熟度 | 成熟(v1.15+) | 最成熟(10+ 年) | 成熟(仍 0.x) | 快速成长 | 维护模式 |
| 维护模式 | 核心团队 + 社区赞助 | 3 人志愿者 + 机构赞助 | 单人 BDFL | VoidZero/Cloudflare | 单人维护 |
与 OXC 的对比(2026 新竞争者)
| 指标 | SWC | OXC |
|---|---|---|
| 解析器速度 | 快 | ~3x 更快 |
| 整体转换 | 成熟稳定 | 仍在追赶 |
| Linter | 无第一方 | Oxlint(50x faster than ESLint) |
| 框架集成 | Next.js 核心 | Vite/Rolldown 核心 |
| 插件生态 | 成熟(Wasm) | 发展中 |
何时选择 SWC
- Next.js 项目(默认集成)
- 需要替代 Babel 获得显著速度提升
- 需要 Wasm 插件扩展能力
- 需要内置代码压缩替代 Terser
何时考虑替代方案
- 需要丰富的插件生态 → Babel
- 需要打包能力 → esbuild 或 Rolldown
- 追求极致解析速度 → OXC
最佳实践
生产环境配置
{
"jsc": {
"parser": {
"syntax": "typescript",
"tsx": true,
"dynamicImport": true
},
"target": "es2022",
"loose": false,
"externalHelpers": true,
"minify": {
"compress": {
"unused": true,
"dead_code": true
},
"mangle": true
}
},
"module": {
"type": "es6"
},
"minify": true
}常见陷阱
- AST 差异:SWC 的 AST 与 Babel AST 存在细微差异,迁移自定义 Babel 插件时需注意
- 插件版本耦合:Wasm 插件与
swc_core版本关联,升级 SWC 可能需要更新插件(2025 年后已改善向后兼容) - Decorator 差异:SWC 的 Decorator 实现与 Babel 存在细微差异
- Minifier 成熟度:SWC 内置 minifier 在极端场景下可能不如 Terser 成熟
- TypeScript 类型检查:SWC 仅剥离类型,不做类型检查——需独立运行
tsc --noEmit
从 Babel 迁移到 SWC
- 评估现有 Babel 插件是否都有 SWC 等价方案
- 配置
.swcrc替代babel.config.json - 替换
babel-loader为swc-loader - 独立运行
tsc --noEmit做类型检查 - 验证 React Fast Refresh、CSS-in-JS 等场景的兼容性
技术局限与边界
已知限制
- 不做类型检查:仅剥离 TypeScript 类型,需配合
tsc - 插件生态仍在发展中:Wasm 插件数量和成熟度不及 Babel
- AST 兼容性:与 Babel AST 的差异可能影响工具链迁移
- TC39 提案跟进速度:略慢于 Babel(Babel 最快支持新提案)
- 社区规模:相比 Babel 6.5 亿/周的下载量,SWC 4000 万/周仍有差距
不适用场景
- 深度依赖特定 Babel 插件的项目(需确认 SWC 有等价方案)
- 需要最早支持 TC39 Stage 1 提案的项目 → Babel
- 需要浏览器端编译能力 → Babel standalone
SWC 路线图
| 优先级 | 方向 |
|---|---|
| P0 | AST 与 Babel/typescript-eslint 对齐,减少破坏性变更 |
| P1 | 插件生态改进,提升兼容性和开发者体验 |
| P2 | Minifier 改进,作为 Terser 的更好替代品 |
学习资源
- 官方文档:https://swc.rs/docs/installation
- SWC 博客:https://blog.swc.rs
- SWC Plugin Registry:https://plugins.swc.rs
- GitHub 仓库:https://github.com/swc-project/swc
- RFC 和投票:https://github.com/swc-project/vote
- OpenCollective:https://opencollective.com/swc
- SWC Playground:https://play.swc.rs
- Discord:https://discord.gg/swc
2026 年现状
最新版本
- v1.15.43(2026 年 6 月 22 日)—— 持续迭代,聚焦 bug 修复、性能优化和规范合规
发展趋势
- 从新兴工具到成熟基础设施:SWC 已完成这一转变,成为前端编译领域的核心工具之一
- Wasm 插件向后兼容:2025 年 11 月实现,解决了插件生态最大的痛点
- OXC 竞争加剧:OXC 的解析器速度约为 SWC 的 3 倍,但 SWC 在转换和框架集成方面仍占优势
- 框架集成深化:Next.js、Parcel、Deno、Rspack 等持续深化 SWC 集成
- 资金可持续性:OpenCollective 年度预算约 $21K,主要依赖 Discord、GitHub Sponsors、Cybozu 等赞助
未来路线图
- AST 对齐:与 Babel/typescript-eslint AST 深度对齐
- 插件生态完善:提升 Wasm 插件开发体验和兼容性
- Minifier 改进:持续优化内置压缩器
- 聚焦核心:不扩展到 linting/formatting,持续深化编译核心能力
社区活跃度
| 指标 | 数值 |
|---|---|
| GitHub Stars | ~34,100 |
| Open Issues | 363 |
| Open PRs | 47 |
| Releases | 809 |
| npm 周下载量 | ~3,950 万 |
| 赞助余额 | $19,389(OpenCollective) |
总体评价
SWC 是 Rust 在前端工具链领域最成功的应用之一。它通过数量级的性能提升证明了 Rust 在 JavaScript 编译领域的价值,同时通过 Next.js 等框架的深度集成证明了其工程成熟度。面对 OXC 等新兴竞争者,SWC 的优势在于成熟的框架集成、稳定的 Wasm 插件生态和持续的社区投入。其长期定位是在高性能编译转译领域与 Babel 形成互补——当需要极致速度和原生集成时使用 SWC,当需要最丰富的插件生态时使用 Babel。