前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Babel 插件开发&访问节点

Babel 插件开发&访问节点

作者头像
前端小鑫同学
发布2022-12-26 13:01:10
5430
发布2022-12-26 13:01:10
举报
文章被收录于专栏:小鑫同学编程历险记

1. 前言

大家好,我是小鑫同学。一位从事过Android开发混合开发,现在长期从事前端开发的编程爱好者,我觉得在编程之路上最重要的是知识的分享,所谓三人行必有我师

整理一下 Babel 插件开发时用得到的转换操作相关的 API~

2. 访问节点

2.1 获取子节点的Path:

我们在处理节点的属性之前必须要拿到节点对象才能进行操作,我们使用path.node.property来访问属性~

代码语言:javascript
复制
BinaryExpression(path) {
  path.node.left;
  path.node.right;
  path.node.operator;
}

我们还可以使用 path 内置的 get 函数来指定属性名获取属性值~

代码语言:javascript
复制
BinaryExpression(path) {
  path.get('left');
}
Program(path) {
  path.get('body.0');
}

2.2 检查节点的类型:

检查节点的类型我们可以使用内置的工具类函数isXxx()~

代码语言:javascript
复制
BinaryExpression(path) {
  if (t.isIdentifier(path.node.left)) {
    // ...
  }
}

我们在检查类型的时候还可以顺便检查其中的某些属性是否达到预期~

代码语言:javascript
复制
BinaryExpression(path) {
  if (t.isIdentifier(path.node.left, { name: "n" })) {
    // ...
  }
}

// 简化前的代码
BinaryExpression(path) {
  if (
    path.node.left != null &&
    path.node.left.type === "Identifier" &&
    path.node.left.name === "n"
  ) {
    // ...
  }
}

2.3 检查路径(Path)类型:

路径具有相同的方法检查节点的类型~

代码语言:javascript
复制
BinaryExpression(path) {
  if (path.get('left').isIdentifier({ name: "n" })) {
    // ...
  }
}

// 等价于
BinaryExpression(path) {
  if (t.isIdentifier(path.node.left, { name: "n" })) {
    // ...
  }
}

2.4 检查标识符(Identifier)是否被引用:

代码语言:javascript
复制
Identifier(path) {
  if (path.isReferencedIdentifier()) {
    // ...
  }
}

// 或者

Identifier(path) {
  if (t.isReferenced(path.node, path.parent)) {
    // ...
  }
}

2.5 找到特定的父路径:

向上查找特定节点可以使用~

代码语言:javascript
复制
path.findParent((path) => path.isObjectExpression());

如果也需要遍历当前节点~

代码语言:javascript
复制
path.find((path) => path.isObjectExpression());

查找最接近的父函数或程序~

代码语言:javascript
复制
path.getFunctionParent();

向上遍历语法树,直到找到在列表中的父节点路径~

代码语言:javascript
复制
path.getStatementParent();

2.6 获取同级路径:

如果一个路径是在一个 FunctionProgram中的列表里面,它就有同级节点。

  • 使用path.inList来判断路径是否有同级节点,
  • 使用path.getSibling(index)来获得同级路径,
  • 使用 path.key获取路径所在容器的索引,
  • 使用 path.container获取路径的容器(包含所有同级节点的数组)
  • 使用 path.listKey获取容器的key

这些API用于 babel-minify 中使用的 transform-merge-sibling-variables 插件.

代码语言:javascript
复制
var a = 1; // pathA, path.key = 0
var b = 2; // pathB, path.key = 1
var c = 3; // pathC, path.key = 2
代码语言:javascript
复制
export default function({ types: t }) {
  return {
    visitor: {
      VariableDeclaration(path) {
        // if the current path is pathA
        path.inList // true
        path.listKey // "body"
        path.key // 0
        path.getSibling(0) // pathA
        path.getSibling(path.key + 1) // pathB
        path.container // [pathA, pathB, pathC]
      }
    }
  };
}

2.7 停止遍历:

当我们遍历完成目的后应该尽早结束而不是继续遍历下去~

代码语言:javascript
复制
BinaryExpression(path) {
  if (path.node.operator !== '**') return;
}

如果您在顶级路径中进行子遍历,则可以使用2个提供的API方法~

path.skip()跳过遍历当前路径的子路径~

path.stop()完全停止遍历~

代码语言:javascript
复制
outerPath.traverse({
  Function(innerPath) {
    innerPath.skip(); // if checking the children is irrelevant
  },
  ReferencedIdentifier(innerPath, state) {
    state.iife = true;
    innerPath.stop(); // if you want to save some state and then stop traversal, or deopt
  }
});
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-08-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 前言
  • 2. 访问节点
    • 2.1 获取子节点的Path:
      • 2.2 检查节点的类型:
        • 2.3 检查路径(Path)类型:
          • 2.4 检查标识符(Identifier)是否被引用:
            • 2.5 找到特定的父路径:
              • 2.6 获取同级路径:
                • 2.7 停止遍历:
                相关产品与服务
                容器服务
                腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档