Babel logo

Babel

JavaScript 生态中最成熟、最全面的编译器与转译工具链,通过插件化架构实现新语法降级、polyfill 注入和代码转换。

编译转译JavaScript 编译器插件化Polyfill

Babel 是 JavaScript 生态中历史最悠久的编译器工具链,拥有数百个插件,覆盖语法转换、polyfill 注入和代码转换。2026 年 Babel 8 完成现代化清理,仍凭借最完善的插件生态保持核心地位。

Babel — JavaScript 编译器

JavaScript 生态中最成熟、最全面的编译器与转译工具链,通过插件化架构实现新语法降级、 polyfill 注入和代码转换。

技术简介说明

Babel 是 JavaScript 生态中历史最悠久、生态最完善的编译器工具链。它诞生于 ES6 到 ES5 的转译需求,逐步演变为一个覆盖语法转换、API polyfill、类型剥离、JSX 编译等场景的完整平台。在 JavaScript 语言规范快速演进(每年新增 TC39 提案)的背景下,Babel 通过高度模块化的插件体系,让开发者能够"提前使用"尚未被目标环境支持的语法特性。

Babel 的核心价值在于其无与伦比的扩展性——拥有数百个官方和社区插件,覆盖几乎所有 ECMAScript 提案和框架特定语法(React JSX、TypeScript、Flow、Decorators 等)。它是 Webpack、Rollup、Jest、Create React App 等主流工具的默认编译后端,npm 周下载量超过 6.5 亿,是前端工程化基础设施中不可替代的一环。

2026 年 Babel 8 发布,进行了现代化清理(ESM-only、Node.js 22+、移除 ES5 默认目标),标志着 Babel 进入后现代化阶段。虽然面临 SWC、esbuild 等 Rust/Go 高性能工具的速度竞争,但 Babel 凭借最完善的插件生态和最广泛的框架集成,仍在编译转译领域保持核心地位。

基本信息

项目详情
官网https://babeljs.io
GitHubhttps://github.com/babel/babel
LicenseMIT
最新版本v8.0.3(2026 年 6 月 27 日发布)
主要维护者Nicolò Ribaudo(首席维护者)、Huáng Jùnliàng (JLHwung)、liuxingbaoyu
机构赞助Sovereign Tech Agency、Igalia、Tidelift
GitHub Stars~44,000
npm 周下载量6.5 亿+

快速上手

安装

# 安装 Babel CLI 和核心预设
npm install --save-dev @babel/core @babel/cli @babel/preset-env
 
# 可选:安装 React 和 TypeScript 预设
npm install --save-dev @babel/preset-react @babel/preset-typescript

基础配置

创建 babel.config.json(Babel 8 推荐使用 JSON 配置):

{
  "presets": [
    ["@babel/preset-env", {
      "targets": "> 0.5%, last 2 versions, not dead",
      "useBuiltIns": false
    }],
    "@babel/preset-react",
    "@babel/preset-typescript"
  ]
}

注意:Babel 8 已移除 preset-env 中的内置 polyfill 注入功能(useBuiltIns: "usage" 等选项已被删除),polyfill 需通过 core-js 手动管理。

最小示例

# 编译单个文件
npx babel src/index.tsx --out-file dist/index.js
 
# 编译整个目录
npx babel src --out-dir dist --extensions ".ts,.tsx,.js,.jsx"

package.json 中添加脚本:

{
  "scripts": {
    "build": "babel src --out-dir dist --extensions '.ts,.tsx,.js,.jsx'"
  }
}

核心概念与架构

三阶段编译器管道

Babel 遵循经典的编译器架构,分为三个核心阶段:

源代码 ──→ [Parser] ──→ AST ──→ [Traverser + Plugins] ──→ 修改后 AST ──→ [Generator] ──→ 输出代码
              │                      │                         │
         @babel/parser          @babel/traverse           @babel/generator
阶段包名职责
解析(Parse)@babel/parser将源代码解析为 AST(前身为 Babylon),支持最新 ECMAScript 标准和 Stage 提案
遍历(Traverse)@babel/traverse通过**访问者模式(Visitor Pattern)**遍历 AST,插件在此阶段检查和转换节点
生成(Generate)@babel/generator将修改后的 AST 转回 JavaScript 源代码,同时生成 source map

插件系统

Babel 的所有转换功能都通过插件实现。每个插件是一个 JavaScript 对象,包含 visitor 函数来操作特定类型的 AST 节点:

// 一个简单的 Babel 插件示例
export default function ({ types: t }) {
  return {
    visitor: {
      Identifier(path) {
        // 将变量名改为大写
        path.node.name = path.node.name.toUpperCase();
      }
    }
  };
}

Presets(预设集合)

Presets 是一组插件的集合,简化配置:

Preset包含内容
@babel/preset-env根据目标环境自动选择所需插件(最核心的预设)
@babel/preset-reactJSX 转换、React 特有转换
@babel/preset-typescriptTypeScript 语法支持(剥离类型注解)
@babel/preset-flowFlow 类型语法支持

Assumptions 系统

Babel 7.13+ 引入的细粒度编译假设系统,允许开发者在规范合规性输出体积之间做权衡:

{
  "assumptions": {
    "setPublicClassFields": true,
    "privateFieldsAsProperties": true,
    "objectRestNoSymbols": true,
    "spread": { "iterable": false }
  }
}

核心特性

  • 最完善的插件生态:数百个官方和社区插件,覆盖所有 TC39 提案和框架语法
  • 智能目标适配preset-env 结合 Browserslist,按需编译到目标环境
  • TypeScript 支持:通过 @babel/preset-typescript 剥离类型注解(不做类型检查)
  • JSX 转换:支持经典 React.createElement 和 React 17+ 自动运行时
  • Decorators 支持:支持 Stage 3 Decorators 提案(@babel/plugin-proposal-decorators
  • React Compiler 集成babel-plugin-react-compiler(v19.2.0+)支持 React 自动记忆化
  • Source Map 支持:完整的源码映射能力
  • 内置 TypeScript 类型:Babel 8 所有包原生附带 .d.ts,无需额外安装 @types/babel__*
  • 浏览器端运行@babel/standalone 支持在浏览器中直接编译(用于 REPL 和在线 Playground)
  • 模块化设计:核心极小,按需加载插件和预设

生态图

Babel 生态系统全景

┌──────────────────────────────────────────────────────────┐
│                    Babel 生态系统                          │
├──────────────────────────────────────────────────────────┤
│                                                          │
│  核心层                                                   │
│  ├── @babel/core          — 编译器核心引擎                │
│  ├── @babel/parser        — 解析器(Babylon)             │
│  ├── @babel/traverse      — AST 遍历器                   │
│  ├── @babel/generator     — 代码生成器                    │
│  └── @babel/types         — AST 节点类型定义              │
│                                                          │
│  预设层                                                   │
│  ├── @babel/preset-env    — 智能环境适配预设              │
│  ├── @babel/preset-react  — React/JSX 预设               │
│  ├── @babel/preset-typescript — TypeScript 预设           │
│  └── @babel/preset-flow   — Flow 预设                    │
│                                                          │
│  插件层(数百个)                                          │
│  ├── @babel/plugin-transform-*   — 标准语法转换          │
│  ├── @babel/plugin-proposal-*    — TC39 提案支持         │
│  ├── babel-plugin-react-compiler — React Compiler       │
│  └── 社区插件(styled-components, macros, lodash 等)     │
│                                                          │
│  工具链集成                                                │
│  ├── @babel/cli           — 命令行工具                    │
│  ├── babel-loader         — Webpack 集成                  │
│  ├── @rollup/plugin-babel — Rollup 集成                  │
│  ├── @babel/register      — Node.js require hook         │
│  └── @babel/standalone    — 浏览器独立构建                │
│                                                          │
│  运行时辅助                                                │
│  ├── @babel/runtime       — 运行时 helpers               │
│  └── @babel/helpers       — 内部辅助函数库                │
│                                                          │
│  开发者工具                                                │
│  ├── Babel REPL           — 在线 Playground              │
│  ├── @babel/eslint-parser — ESLint 解析器                │
│  └── babel-plugin-macros  — 零配置宏系统                  │
│                                                          │
└──────────────────────────────────────────────────────────┘

关键依赖关系

  • @babel/parser 被 ESLint、Prettier、vue-eslint-parser 等工具依赖
  • @babel/types 是 AST 操作的基础类型库
  • @babel/traverse 的 Visitor 模式影响了整个 JS 工具生态

适用场景

  • 多浏览器兼容性编译(最典型场景):通过 preset-env + Browserslist 编译到不同目标环境
  • React/JSX 项目preset-react 是最成熟的 JSX 编译方案
  • TypeScript 转译(不要求类型检查时):preset-typescript 提供快速类型剥离
  • TC39 新提案试验:第一时间使用 Stage 2+ 语法特性(Decorators、Pipeline Operator 等)
  • 自定义代码转换:通过插件实现业务特定的代码转换需求(如 i18n 提取、CSS-in-JS 编译)
  • 旧项目维护:大量存量 Webpack + Babel 项目仍在活跃维护
  • 浏览器端编译@babel/standalone 支持在线代码编辑和实时编译

开发与工程化

配置文件选择

配置文件优先级说明
babel.config.json项目级推荐,作用于整个项目(含 node_modules)
.babelrc.json文件级作用于单个包(monorepo 中常用)
babel.config.js项目级需要动态逻辑时使用
package.json"babel" 字段最低简单配置时可考虑

Monorepo 配置策略

my-monorepo/
├── babel.config.json    ← 根目录配置,作用于所有包
├── packages/
│   ├── ui/
│   │   └── .babelrc.json  ← 包级覆盖(如需要)
│   └── app/
│       └── .babelrc.json

CI/CD 集成

# GitHub Actions 示例
- name: Build with Babel
  run: npx babel src --out-dir dist --extensions '.ts,.tsx,.js,.jsx' --source-maps
 
# 缓存 Babel 依赖
- name: Cache Babel
  uses: actions/cache@v4
  with:
    path: node_modules/.cache/babel-loader
    key: ${{ runner.os }}-babel-${{ hashFiles('babel.config.json') }}

调试技巧

# 查看 Babel 处理过程的 AST 变化
npx babel src/index.js --out-file /dev/stdout 2>&1 | head -100
 
# 查看哪些插件被激活
BABEL_SHOW_CONFIG_FOR=./src/index.js npx babel src/index.js

性能与安全

性能特点

方面说明
速度纯 JavaScript 实现,显著慢于 SWC(~20x)和 esbuild
优化策略Babel 8 面向现代环境,自动跳过原生支持的特性转换
按需编译基于 Browserslist 目标的部分编译,减少不必要的转换
缓存babel-loader 支持 cacheDirectory 选项,显著加速重复构建
增量编译通过 Webpack/Vite 等打包工具实现增量编译

性能优化建议

  1. 启用缓存:Webpack 中设置 babel-loader?cacheDirectory=true
  2. 缩小编译范围:使用 include/exclude 排除 node_modules
  3. 选择现代目标:使用 Babel 8 的默认 Browserslist(不再默认 ES5)
  4. 混合编译方案:对于大型项目,考虑用 SWC/esbuild 做基础转译,Babel 仅处理需要插件的场景
  5. Assumptions 调优:启用合理的编译假设以减小输出体积

安全注意事项

  • 2025 年 3 月安全公告(GHSA-968p-4wvh-cqc8):@babel/generator.replace 正则表达式存在 DoS 风险,已在补丁版本中修复
  • 代码注入风险:使用 @babel/standalone 在浏览器端编译时,确保输入来源可信
  • 依赖安全:定期检查 Babel 插件依赖的安全更新

技术对比

与同类工具的详细对比

维度BabelSWCesbuildSucraseOXC
实现语言JavaScript/TypeScriptRustGoJavaScriptRust
编译速度基准(1x)~20x(单线程)/ ~70x(多线程)~36x(含打包)~20x~20x+
插件系统最成熟,数百个插件Wasm 插件(生态发展中)有限(onResolve/onLoad)不支持外部插件发展中
类型检查❌(仅剥离)❌(仅剥离)❌(仅剥离)❌(仅剥离)❌(仅剥离)
JSX 支持✅ 完整✅ 完整✅ 完整✅ 完整✅ 完整
TC39 提案支持✅ 最快(Stage 1+)✅ 较快⚠️ 有限⚠️ 有限✅ 快速跟进
Polyfill 注入✅(Babel 7, Babel 8 移除)
框架集成Webpack、Rollup、Jest 等Next.js(默认)、Parcel、DenoVite(dev)、Angular 17+Sandpack、JestVite 8、Rolldown
npm 周下载量6.5 亿~4000 万~2.37 亿~数百万~1000 万
维护模式3 人志愿者 + 机构赞助核心团队 + 社区赞助单人维护(BDFL)单人维护VoidZero/Cloudflare
ESM-only✅(Babel 8)N/AN/AN/AN/A
稳定性最成熟(10+ 年历史)成熟(v1.15+)仍 0.x成熟(维护模式)快速成长

何时选择 Babel

  • 需要最完善的插件支持和 TC39 提案覆盖
  • 项目依赖特定的 Babel 插件生态
  • 需要浏览器端编译能力(@babel/standalone
  • 旧项目维护(已有大量 Babel 配置和插件)

何时考虑替代方案

  • 对编译速度有极高要求 → 考虑 SWC 或 esbuild
  • 新项目且不需要复杂插件 → 考虑 SWC 或 esbuild
  • 需要打包能力 → esbuild 或 Rolldown

最佳实践

生产环境配置

{
  "presets": [
    ["@babel/preset-env", {
      "targets": "> 0.5%, last 2 versions, not dead",
      "bugfixes": true,
      "debug": false
    }],
    ["@babel/preset-react", {
      "runtime": "automatic"
    }],
    "@babel/preset-typescript"
  ],
  "env": {
    "production": {
      "plugins": ["babel-plugin-react-compiler"]
    }
  }
}

常见陷阱

  1. 重复编译:确保 Webpack 配置中 include/exclude 正确,避免 node_modules 被重复编译
  2. polyfill 管理:Babel 8 已移除自动 polyfill 注入,需手动引入 core-js/stable
  3. SourceType 问题:编译 .ts/.tsx 文件时确保 extensions 配置正确
  4. 缓存失效:修改 Babel 配置后需清除 node_modules/.cache/babel-loader 缓存
  5. 插件顺序:Decorators 插件必须在 Class Properties 之前("@babel/plugin-proposal-decorators" 在前)

从 Babel 7 迁移到 Babel 8

  1. 更新所有 @babel/* 包到 8.x
  2. 移除 useBuiltIns 配置,改用 core-js 手动管理 polyfill
  3. 确认 Node.js 版本 >= 22
  4. 检查并移除已废弃的配置选项
  5. 如有 CommonJS 入口配置,迁移到 ESM

技术局限与边界

已知限制

  • 速度瓶颈:纯 JavaScript 实现,编译速度远慢于 Rust/Go 方案(20-70x 差距),大型项目构建时间显著
  • 不做类型检查:仅剥离 TypeScript/Flow 类型,类型安全需依赖 tsctsgo
  • 不做打包:Babel 仅负责文件级别的编译转译,模块打包需配合 Webpack/Rollup 等
  • 不支持 ESM 到 CJS 的完整互操作:模块格式转换能力有限
  • 插件开发门槛:AST 操作的复杂度较高,插件开发需要编译器知识

不适用场景

  • 追求极致构建速度的新项目(推荐 SWC 或 esbuild)
  • 需要类型检查的场景(推荐 TypeScript 编译器)
  • 需要打包能力的场景(推荐 Vite、Webpack、Rolldown)
  • 浏览器端生产环境编译(@babel/standalone 仅适用于开发/演示场景)

可持续性隐忧

  • 维护者公开表示捐款持续下降
  • 核心维护团队仅 3 人(志愿者模式)
  • 依赖机构赞助(Sovereign Tech Agency、Igalia)维持质量
  • 周下载量 6.5 亿但资金支持不成比例

学习资源

2026 年现状

最新版本

  • Babel 8.0.3(2026 年 6 月 27 日)—— 现代化清理版本,ESM-only、Node.js 22+、移除遗留 polyfill 注入

发展趋势

  1. 现代化完成:Babel 8 完成了从遗留架构到现代化架构的迁移,技术债大幅减少
  2. 速度竞争加剧:SWC、esbuild、OXC 等高性能工具持续侵蚀 Babel 的市场份额
  3. 插件生态仍是护城河:数百个 Babel 插件短期内无法被替代
  4. 混合编译方案兴起BabelSwcLoader 等工具结合 Babel 的插件兼容性和 SWC 的速度

未来路线图

  • BABLR 架构提案:外部贡献者提出的不可变树结构重写方案(讨论中,非官方计划)
  • 新 TC39 提案支持:持续跟进 Decorators、Module Blocks、Pattern Matching 等
  • preset-env 移入核心:计划将 preset-env 的目标适配逻辑集成到核心
  • REPL 升级:基于 Babel 8 的在线 Playground 升级

社区活跃度

指标数值
GitHub Stars~44,000
npm 周下载量6.5 亿+
核心维护者3 人(志愿者) + 机构赞助
Open Issues~2,500+
Babel 7 安全补丁支持至 ~2027 年 6 月

总体评价

Babel 仍然是 JavaScript 编译领域的"标准答案",拥有最完善的插件生态和最广泛的框架集成。Babel 8 的现代化清理使其架构更加健康。然而,面对 Rust/Go 高性能工具的竞争,Babel 在速度上的劣势愈发明显。其长期定位将从"默认编译器"转变为"插件平台"——当需要复杂代码转换和 TC39 提案支持时使用 Babel,当只需要基础转译时使用更快的替代方案。