[工具包]jscodeshift-代码批量修改的工具

本文介绍了如何使用jscodeshift工具进行代码批量修改,包括对jscodeshift、Codemod和Recast的基本概念解析,以及在vue2.x到vue3.x升级中的实践应用。详细阐述了从读取源代码、解析AST到节点定位、替换和创建的过程,提供了一种自动化解决代码升级问题的方法。
摘要由CSDN通过智能技术生成

在vue2.x升级vue3.x的过程中遇到了大批量的代码需要手动更新,例如导出不再是export default {},而是export default default defineComponent({})类似这种问题,因为项目较多就发现每次手动修改就很奔溃,希望有个自动化的工具可以一个命令,修改掉大部分的差异问题。

因此,在网上查找到了代码重构利器-- jscodeshift ,但是关于jscodeshift使用因为官网的说明较少,网上的博客说明看的我头大的也不太知道究竟是怎么用的,又是codemod,又是 recast,又是Test加上是新手,很多不明白是怎么回事!!!

所以查找资料以及个人摸索后,在成功实现重构后,加上个人理解整理一下整个过程

概念介绍

Codemod

关于这个代码集或者库官网解释是一个可以大批量自动修改代码,但是仍需要人工检测与干预的工具。

那么 jscodeshift 又与Codemod有什么关系?jscodeshift 是一个 Javascript 的Codemod工具,因为可能存在修改java等其它语言的Codemod工具;

Recast

在我的理解当中Recast是一个用于解析源文件的一个解析器,也就是对于要修改的文件可以通过Recast解析成 Javascript 语法的树型结构–我们将这种语法树结构称之为AST抽象语法树。

那么 jscodeshift 又与 Recast 有什么关系?jscodeshift 是一个 Recast 的包装器,它也用到了Recast的解析功能

AST

上面提到了AST抽象语法树,这里简单介绍一下,因为它与我们修改文件–删除、增加、修改、查找树上的节点息息相关。

说到AST就避不开Ast Explorer,一个在线语法树解析网站。

这个在线工具非常重要!!!
在这里插入图片描述

这里简单说明一下,第一个选择了 javascript ,因为源文件是.ts还是.js都是 javascript,如果是其它后缀的文件可以对应选择,例如*.vue要选择vue。

下一个选框对应的就是解析器的选择,默认是recast,js文件一般都使用的是该解析器;对于ts文件有时(内容与js完全时)也可以使用该解析器,但是如果文件中的内容有类型设置时,我们会发现右侧的语法树无法查看,有报错信息,就是因为无法解析文件中的类型设置,此时该选框修改为typescript,代码成功解析成语法树

代码重构工具实战

在网上教程中很多用到了测试套件我是没太明白的,本人是直接编写相关修改文件,通过node命令直接执行该文件

AST 的流程图

在这里插入图片描述

实际上就是读取到源文件内容,对源文件进行解析获取到对应的AST抽象语法树,然后修改对应语法树上的节点,然后再将修改后语法树转化为文件内容,最后写入文件,完成文件的修改。

安装工具包

npm i jscodeshift

原文件

test.js ,也就是会被修改或解析的文件

const List = [
  {
   
    title: "姓名",
    key: "name",
    width: 200,
    child:{
   
      title: "姓名",
      key: "name",
    }
  },
  {
   
    title: "年龄",
    key: "age",
    width: 200
  }
];

需求是要将源文件数组中对象的字段title改成label,但是child内部的不需要修改

读取源代码

tool.js是一个工具文件,用于编写修改原文件的代码

const j = require("jscodeshift");
const fs = require("fs");//读取文件
const path = require("path");//解析文件路径
const testPath = path.resolve("./test.js");
const content = fs.readFileSync(testPath).toString()//读取文件内容

fs与path是node内置的包,不需要额外安装

解析源代码

const ast = j(content);//解析成AST树结构,默认recast解析器

如果要修改的是ts的内容,需要修改解析器

const ast = j(content,{
   
  parser : require("recast/parsers/typescript");
  }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三知之灵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值