抽象语法树在 JavaScript 中的应用

404 查看

抽象语法树是什么

在计算机科学中,抽象语法树(abstract syntax tree 或者缩写为 AST),或者语法树(syntax tree),是源代码的抽象语法结构的树状表现形式,这里特指编程语言的源代码。树上的每个节点都表示源代码中的一种结构。之所以说语法是「抽象」的,是因为这里的语法并不会表示出真实语法中出现的每个细节。1

果然比较抽象,不如先看几个例子:

抽象语法树举例

从上述两个例子可以看出,抽象语法树是将源代码根据其语法结构,省略一些细节(比如:括号没有生成节点),抽象成树形表达。

抽象语法树在计算机科学中有很多应用,比如编译器、IDE、压缩优化代码等。下面介绍一下抽象语法树在 JavaScript 中的应用。

JavaScript 抽象语法树

构造 JavaScript 抽象语法树有多种工具,比如 v8SpiderMonkeyUglifyJS 等,这里重点介绍 UglifyJS。

UglifyJS

UglifyJS 是使用最广的 JavaScript 压缩工具之一,而且自身也是用 JavaScript 写的,使用它的方法很简单(需要 nodejs 环境):

首先全局安装:

然后就可以使用了:

关于 UglifyJS 的用法这里就不多介绍了,我们要做的是一些更有趣的事情。

UglifyJS Tools

UglifyJS 提供了一些工具用于分析 JavaScript 代码,包括:

  • parser,把 JavaScript 代码解析成抽象语法树
  • code generator,通过抽象语法树生成代码
  • mangler,混淆 JavaScript 代码
  • scope analyzer,分析变量定义的工具
  • tree walker,遍历树节点
  • tree transformer,改变树节点

生成抽象语法树

使用 UglifyJS 生成抽象语法树很简单:

首先安装 UglifyJS 为 npm 包:

然后使用 parse 方法即可:

这样生成的 ast 即为那一段代码的抽象语法树。那么我们怎么使用呢?

使用 mangler 压缩代码

使用 mangler 可以通过将局部变量都缩短成一个字符来压缩代码。