SWC
问题
SWC 是什么?它如何替代 Babel?为什么比 Babel 快这么多?
答案
SWC(Speedy Web Compiler)是用 Rust 编写的 JavaScript/TypeScript 编译器,是 Babel 的高性能替代品。Next.js 从 v12 开始默认使用 SWC。
关于 Babel 原理,可参考 Babel 原理。
SWC vs Babel
| 维度 | Babel | SWC |
|---|---|---|
| 语言 | JavaScript | Rust |
| 速度 | 1x(基准) | 20-70x |
| 线程 | 单线程 | 多线程(Rayon) |
| 功能 | 编译 + Polyfill | 编译 + 压缩 + 打包 |
| 插件 | JS 插件生态丰富 | Wasm 插件(有限) |
| 使用 | 独立工具 | Next.js/Vite 内置 |
为什么 SWC 快 20x+
核心原因:
- Arena 内存分配:AST 节点在连续内存中,缓存命中率高
- 无 GC:没有运行时垃圾回收暂停
- 多线程:Rayon 并行处理多个文件
- 单 pass 优化:多个变换合并为一次 AST 遍历
在项目中使用 SWC
next.config.js
// Next.js 12+ 默认使用 SWC,无需配置
module.exports = {
// SWC 自动替代 Babel
// 如果项目有 .babelrc,Next.js 会 fallback 到 Babel
}
.swcrc
{
"$schema": "https://swc.rs/schema.json",
"jsc": {
"parser": {
"syntax": "typescript",
"tsx": true
},
"transform": {
"react": {
"runtime": "automatic"
}
},
"target": "es2020"
}
}
常见面试问题
Q1: SWC 的插件生态能替代 Babel 吗?
答案:
不完全能。SWC 覆盖了 Babel 80%+ 的常用功能(语法降级、JSX 转换、TypeScript 编译),但自定义插件生态远不如 Babel 丰富。SWC 插件用 Wasm 编写,开发门槛高。
Next.js 的策略:SWC 处理常见变换,遇到不支持的 Babel 插件时自动 fallback 到 Babel。