Babel 的工作原理

Babel 转译代码的三个核心阶段:解析、转换和生成

问题

Babel 是如何将现代 JavaScript 代码转译成兼容性更好的代码的?

解答

Babel 的转译过程分为三个阶段:

1. 解析(Parse)

将源代码解析生成抽象语法树(AST)。这个阶段包含两个步骤:

  • 词法分析:将代码字符串转换为 token 流
  • 语法分析:将 token 流转换为 AST 结构
// 源代码
const add = (a, b) => a + b;

// 经过解析后生成 AST(简化示例)
{
  type: "VariableDeclaration",
  declarations: [{
    type: "VariableDeclarator",
    id: { type: "Identifier", name: "add" },
    init: { type: "ArrowFunctionExpression", ... }
  }]
}

2. 转换(Transform)

使用 babel-traverse 遍历 AST,在遍历过程中对节点进行添加、更新或移除操作。这是 Babel 插件发挥作用的阶段。

// babel-traverse 遍历并转换 AST
traverse(ast, {
  ArrowFunctionExpression(path) {
    // 将箭头函数转换为普通函数
    path.replaceWith(
      t.functionExpression(/* ... */)
    );
  }
});

3. 生成(Generate)

使用 babel-generator 将转换后的 AST 重新生成 JavaScript 代码。

// 转换后的代码
var add = function(a, b) {
  return a + b;
};

关键点

  • Babel 转译分为解析、转换、生成三个阶段
  • AST(抽象语法树)是连接三个阶段的核心数据结构
  • babel-traverse 负责遍历和修改 AST
  • babel-generator 负责将 AST 转回代码
  • Babel 插件主要在转换阶段工作,通过操作 AST 实现代码转换