Babel 的编译流程
约 686 字大约 2 分钟
2026-02-28
Babel 是一个转译器,是 source 到 source 的转换工具。整体转义流程分为三步:
转义流程
parse:通过parser把源码转成抽象语法树(AST)transform:遍历 AST,调用各种transform插件对 AST 进行增删改generate:把转换后的 AST 打印成目标代码,并生成 sourcemap
parse
parse
parse 阶段的目的是把源码字符串转换成机器能够理解的 AST,这个过程分为词法分析、语法分析。
比如 let name = 'guang'; 这样一段源码,我们要先把它分成一个个不能细分的单词(token),也就是 let, name, =, 'guang',这个过程是词法分析,按照单词的构成规则来拆分字符串成单词。
之后要把 token 进行递归的组装,生成 AST,这个过程是语法分析,按照不同的语法结构,来把一组单词组合成对象,比如声明语句、赋值表达式等都有对应的 AST 节点。
transform
transform 阶段是对 parse 生成的 AST 的处理,会进行 AST 的遍历,遍历的过程中处理到不同的 AST 节点会调用注册的相应的 visitor 函数,visitor 函数里可以对 AST 节点进行增删改,返回新的 AST(可以指定是否继续遍历新生成的 AST)。这样遍历完一遍 AST 之后就完成了对代码的修改。
generate
generate 阶段会把 AST 打印成目标代码字符串,并且会生成 sourcemap。不同的 AST 对应的不同结构的字符串。比如 IfStatement 就可以打印成 if(test) {} 格式的代码。这样从 AST 根节点进行递归的字符串拼接,就可以生成目标代码的字符串。
sourcemap 记录了源码到目标代码的转换关系,通过它我们可以找到目标代码中每一个节点对应的源码位置,用于调试的时候把编译后的代码映射回源码,或者线上报错的时候把报错位置映射到源码。
总结
我们了解了编译和转译的区别,明确了 babel 是一个 js transpiler。然后学习了 babel 编译流程的三个步骤 parse、transform、generate,为什么会有这三步,每一步都干了什么( parse 生成 ast,transform 对 ast 进行转换,generate 打印 ast 成目标代码并生成 sourcemap)。
这一节对整体流程有了一个认识,这是后续深入学习 babel 的基础,后面会分别学习每一个步骤。
