Babel是一个强大的JS编译器,确切地说是源码到源码的编译器,通常也叫作转换编译器(transpiler)。为Babel提供一些JS代码,Babel更改这些代码,然后返回新生成的代码。为Babel提供的代码会比较方便地转化为AST抽象语法树,之后只需要专注AST抽象语法树的转化生成。

Babel的编译过程主要有以下三个阶段。

  1. 解析(Parse):将输入字符流解析为AST抽象语法树。
  2. 转化(Transform):对抽象语法树进一步转化。
  3. 生成(Generate.:根据转化后的语法树生成目标代码。

Babel的解析

Babel的解析实际上包含了两个内容:词法分析和语法分析。经过这一步后,可以直接得到输入源代码的AST抽象语法树,极大地方便了AST程序的开发。

Babel的转化

转化步骤接收AT并对其进行遍历,在此过程中对节点进行添加、更新及移除等操作。后续的混淆JS代码以及对混淆过的JS代码进行还原都在此处,这是本书的重点。之所以将字符流转化为抽象语法树,原因是树状结构更加容易进行原子操作,可以对任意的节点进行精细化处理。在抽象语法树中,代码间的关系被抽象为节点间的关系,而实现相同功能的节点之间的表示也是相同的。利用这一点,可以在语法树层面对输入的代码进行增、删、改、查,而不必关心具体的代码书写。制定几条规则,Babel就可以对抽象语法树进行遍历,完成整个代码的批量操作。

Babel的生成

代码生成步骤把最终(经过一系列转换之后)的AST转换成字符串形式的代码。代码生成其实很简单:深度优先遍历整个AST,然后构建可以表示转换后代码的字符串。经过
这一步,就可以得到从AST抽象语法树层面修改过的代码。