写在前面
上篇 babel学习之旅(一) 我们介绍了 What is Babel 以及 简单的配置,这篇文章 我们现在整体看一下babel是如何工作的
Babel是如何工作的
Babel 会将源码转换 AST 之后,通过便利AST树,对树做一些修改,然后再将AST转成code,即成源码
图片来源 alloyteam
如上图所示,babel的编译过程和大多数其他语言的编译器大致相同,可以分为三个阶段:
解析(PARSE):将代码字符串解析成 AST (抽象语法树)。
转换(TRANSFORM):对 AST (抽象语法树)进行转换操作。
生成(GENERATE): 根据变换后的 AST (抽象语法树)再生成代码字符串。
解析
Babel的解析引擎是 Babylon, babylon 是一个解析器,它可以将 JavaScript 字符串转换为对计算机来说更加友好的表现形式,称之为抽象语法树 AST(Abstract Syntax Tree),
babylon并非由babel团队自己开发的,而是fork的acorn项目,为了是做一些代码的转换,是很不错的一款引擎,
不过acorn引擎只提供基本的解析 AST 的能力,遍历还需要配套的acorn-travesal, 替换节点需要使用acorn-,而这些开发,在Babel的插件体系开发下,变得一体化了。
解析的过程分为两步:
- 分词: 将整个代码字符串分割成 语法单元数组
- 语义分析:在分词结果的基础之上分析 语法单元之间的关系
什么是分词和语义分析,请查阅这里
babel转AST的解析过程在Babylon中完成, 解析成AST树使的是babylon.parse方法
转换
比如我们在 .babelrc 里配置的 presets 和 plugins (下面将介绍babel的配置)是在第二步 转换中 进行的。
babel-traverse 模块允许你浏览、分析和修改抽象语法树(AST)
生成
babel-generator 模块用来将转换后的抽象语法树(AST)转换为 JavaScript 字符串。