babel-types

Babel Types(类型)模块是一个用于 AST 节点的 Lodash 式工具库。 译注:Lodash 是一个 JavaScript 函数工具库,提供了基于函数式编程风格的众多工具函数)它包含了构造、验证以及变换 AST 节点的方法。 其设计周到的工具方法有助于编写清晰简单的 AST 逻辑。

安装:

yarn add babel-types
# or
yarn add @babel/types

使用:

import traverse from "babel-traverse";
import * as t from "babel-types";
traverse(ast, {
  enter(path) {
    if (t.isIdentifier(path.node, { name: "n" })) {
      path.node.name = "x";
    }
  }
});

其中 t.isIdentifier(path.node, { name: "n" }) 相当于:

path.node.type === "Identifier" && path.node.name === "n";

Definitions(定义)

Babel Types 模块拥有每一个单一类型节点的定义,包括有哪些属性分别属于哪里,哪些值是合法的,如何构建该节点,该节点应该如何去遍历,以及节点的别名等信息。

单一节点类型定义的形式如下:

defineType("BinaryExpression", {
  builder: ["operator", "left", "right"],
  fields: {
    operator: {
      validate: assertValueType("string")
    },
    left: {
      validate: assertNodeType("Expression")
    },
    right: {
      validate: assertNodeType("Expression")
    }
  },
  visitor: ["left", "right"],
  aliases: ["Binary", "Expression"]
});

Builders(构建器)

你会注意到上面的 BinaryExpression 定义有一个 builder 字段。.

builder: ["operator", "left", "right"];

这是由于每一个节点类型都有构建器方法:

t.binaryExpression("*", t.identifier("a"), t.identifier("b"));

它可以创建如下所示的 AST:

{
  type: "BinaryExpression",
  operator: "*",
  left: {
    type: "Identifier",
    name: "a"
  },
  right: {
    type: "Identifier",
    name: "b"
  }
}

当打印出来(输出)之后是这样的:

a * b

构建器还会验证自身创建的节点,并在错误使用的情形下抛出描述性的错误。这就引出了接下来的一种方法。

Validators(验证器)

BinaryExpression 的定义还包含了节点的 fields 字段信息并且指示了如何验证它们。

fields: {
  operator: {
    validate: assertValueType("string")
  },
  left: {
    validate: assertNodeType("Expression")
  },
  right: {
    validate: assertNodeType("Expression")
  }
}

这可以用来创建两种类型的验证方法。第一种是 isX。.

t.isBinaryExpression(maybeBinaryExpressionNode);

此方法用来确保节点是一个二进制表达式,不过你也可以传入第二个参数来确保节点包含特定的属性和值。

t.isBinaryExpression(maybeBinaryExpressionNode, { operator: "*" });

这些方法还有一种断言式的版本,会抛出异常而不是返回 truefalse。.

t.assertBinaryExpression(maybeBinaryExpressionNode);
t.assertBinaryExpression(maybeBinaryExpressionNode, { operator: "*" });
// Error: Expected type "BinaryExpression" with option { "operator": "*" }

Converters(变换器)

MIT Licensed | Copyright © 2018-present 滇ICP备16006294号

Design by Quanzaiyu | Power by VuePress