Babel 实际上是一组模块的集合。这里将探索一些主要的模块,解释它们是做什么的以及如何使用它们。
定义了把代码解析成AST的一套规范
语法
1 | require("@babel/parser").parse("code", { |
例子
1 | import * as babelParser from "@babel/parser"; |
@babel/traverse
Babel Traverse(遍历)模块维护了整棵树的状态,并且负责替换、移除和添加节点。
之前也说到,path参数里面的属性和方法都是在babel-traverse里面定义的。这里还是引用一个例子,将babel-traverse和Babylon一起使用来遍历和更新节点:
语法
1 | npm install --save @babel/traverse |
例子
一个坑:尝试这个例子时,使用的是 webpack5,发现会报 [Uncaught ReferenceError: process is not defined]
。谷歌的答案是定义环境,但尝试无果,直接把 webpack 降级到 4,同时还需要将 html-webpack-plugin 也降级到 4
1 | import * as babelParser from "@babel/parser"; |
@babel/types
一个强大的用于处理AST节点的工具库,它包含了构造、验证以及变换AST节点的方法。该工具库包含考虑周到的工具方法,对编写处理AST逻辑非常有用。
语法
1 | npm install --save-dev @babel/types |
例子
判断import导入是什么类型的导入
1 | import { Ajax } from '../lib/utils'; |
在AST中用于表示上面导入的三个变量的节点是不同的,分别叫做ImportSpecifier、ImportDefaultSpecifier和ImportNamespaceSpecifier。如果我们只对导入指定变量的import命令语句做处理,那么我们的babel插件就可以这样写:
1 | import traverse from "babel-traverse"; |
Definitions(定义)
Babel Types模块拥有每一个单一类型节点的定义,包括节点包含哪些属性,什么是合法值,如何构建节点、遍历节点,以及节点的别名等信息。
单一节点类型的定义形式如下:
1 | defineType("BinaryExpression", { |
Builders(构建器)
你会注意到上面的 BinaryExpression
定义有一个 builder
字段。.
1 | builder: ["operator", "left", "right"] |
这是由于每一个节点类型都有构造器方法builder,按类似下面的方式使用:
1 | t.binaryExpression("*", t.identifier("a"), t.identifier("b")); |
可以创建如下所示的 AST:
1 | { |
当打印出来之后是这样的:
1 | a * b |
构造器还会验证自身创建的节点,并在错误使用的情形下会抛出描述性错误,这就引出了下一个方法类型。
Validators(验证器)
BinaryExpression
的定义还包含了节点的字段 fields
信息,以及如何验证这些字段。
1 | fields: { |
可以创建两种验证方法。第一种是 isX
。.
1 | t.isBinaryExpression(maybeBinaryExpressionNode); |
这个测试用来确保节点是一个二进制表达式,另外你也可以传入第二个参数来确保节点包含特定的属性和值。
1 | t.isBinaryExpression(maybeBinaryExpressionNode, { operator: "*" }); |
这些方法还有一种断言式的版本,会抛出异常而不是返回 true
或 false
。.
1 | t.assertBinaryExpression(maybeBinaryExpressionNode); |
@babel/generator
Babel 的代码生成器,它读取AST并将其转换为代码和源码映射(sourcemaps)
语法
1 | npm install --save-dev @babel/generator |
例子
沿用前面的例子,将代码的 n 变量换成 x
1 | import * as babelParser from "@babel/parser"; |
@babel/template
虽然很小但却非常有用的模块。 它能让你编写字符串形式且带有占位符的代码来代替手动编码, 尤其是生成的大规模 AST的时候。 在计算机科学中,这种能力被称为准引用(quasiquotes)。
语法
1 | npm install --save-dev @babel/template |