babel模块
@babel/corebabel的核心模块,将代码转换成AST,再将AST转成代码都靠它@babel/types一个用于 AST 节点的 Lodash 式工具库babylonBabel 的解析器。最初是 从Acorn项目fork出来的。使用了基于插件的架构,有一个 plugins 选项可以开关内置的插件,现已被@babel/parser代替@babel/parser取代babylon,成为Babel新的解析器@babel/traverseBabel Traverse(遍历)模块维护了整棵树的状态,并且负责替换、移除和添加节点。@babel/generator读取AST并将其转换为代码和源码映射@babel/template
Babel 的处理步骤
Babel 的三个主要处理步骤分别是: 解析(parse),转换(transform),生成(generate)。
解析
解析步骤接收代码并输出 AST。 这个步骤分为两个阶段:词法分析(Lexical Analysis) 和 语法分析(Syntactic Analysis)。
词法分析
词法分析阶段把字符串形式的代码转换为 令牌(tokens) 流。
会把每一块代码转换成单独的一个类型对象,比如
n * n;
[
{ type: { ... }, value: "n", start: 0, end: 1, loc: { ... } },
{ type: { ... }, value: "*", start: 2, end: 3, loc: { ... } },
{ type: { ... }, value: "n", start: 4, end: 5, loc: { ... } },
...
]
语法分析
语法分析阶段会把一个令牌流转换成AST的形式。这个阶段会使用令牌中的信息把它们转换成一个 AST的表述结构,这样更易于后续的操作。
会把词法分析的类型对象转换成一个树形结构(AST语法树)
转换
转换步骤接收 AST 并对其进行遍历,在此过程中对节点进行添加、更新及移除等操作。 这是 Babel 或是其他编译器中最复杂的过程同时也是插件将要介入工作的部分
生成
将AST语法树转换成,字符串形式的代码
遍历
想要转换 AST 你需要进行递归的树形遍历。
Visitors(访问者)
访问者是一个用于 AST 遍历的跨语言的模式。 简单的说它们就是一个对象,定义了用于在一个树状结构中获取具体节点的方法。