Babel 的 AST 是 JavaScript 代码的结构化表示,通过 @babel/parser 解析源码生成 AST,用 @babel/traverse 遍历节点,@babel/types 创建/替换节点,最后由 @babel/generator 输出新代码。

Babel 的 AST 是 JavaScript 代码的结构化表示,解析和修改它不依赖运行时执行,而是通过静态分析实现。核心在于:用 @babel/parser 把源码转成 AST 树,再用 @babel/traverse 遍历节点,配合 @babel/types 创建或替换节点,最后用 @babel/generator 输出新代码。
解析代码生成 AST
先将字符串形式的 JS 代码解析为标准 AST 对象:
- 安装必要包:
npm install @babel/parser @babel/types @babel/traverse @babel/generator - 调用
parser.parse(),传入源码和配置(如sourceType: 'module'表示支持 import/export) - 返回的是一个
File节点,其program属性是顶层Program节点,子节点在body数组里
遍历并识别目标节点
使用 traverse 按深度优先方式访问每个节点,可按类型名(如 Identifier、CallExpression)或自定义条件筛选:
- 写法示例:
traverse(ast, { Identifier(path) { console.log(path.node.name); } }) -
path是关键对象,包含当前节点(path.node)、父节点(path.parent)、作用域(path.scope)等信息 - 可用
path.isXxx()判断类型,比如path.isFunctionDeclaration(),比直接查node.type更安全
安全地修改 AST 节点
修改不是直接改 node 属性,而是通过 path 提供的方法操作,避免破坏树结构:
立即学习“Java免费学习笔记(深入)”;
-
path.replaceWith(newNode):替换成新节点(需用t.xxxExpression()等创建) -
path.remove():删除当前节点 -
path.insertBefore([...nodes])或path.insertAfter([...nodes]):插入语句 - 所有新建节点必须用
@babel/types工厂函数,如t.stringLiteral('hello')、t.callExpression(t.identifier('console.log'), [t.stringLiteral('hi')])
生成修改后的代码
AST 修改完成后,调用 generator 把树还原为字符串代码:
- 传入修改后的 AST 对象,可选配置如
{ retainLines: true }保持原始行号 - 返回对象含
code(生成的代码字符串)和map(source map,用于调试) - 注意:如果只修改了部分节点但没处理副作用(如变量提升、作用域),生成结果可能与预期不符——Babel 不做语义校验,只做结构转换


















