开始使用

阅读时间约 2 分钟

全网最简单易上手,可读性最强的 AST 处理工具!

像JQuery一样链式操作AST

Install

    npm install gogocode

快速开始

对于下面的代码

const code = `
  const moment = require('moment');
  var a = 1;
  const b = 2;
  function log (x, y = 'World') {
    console.log('a')
    console.log(a, x, y);
  }
`;

创建一个 AST 实例

const $ = require('gogocode');
const AST = $(code);

  • 小明想将 所有的 a 变量名替换为 c,只需要
$(code).replace('a', 'c')

  • 小明改主意了,只想把 var a = 1 里的变量名改为 c,需要两步:

    • 取变量 a 的定义赋值,
    $(code).find('var a = 1');
    • a 变量名替换为 c,并输出整体代码
    $(code)
    .find('var a = 1')
    .attr('declarations.0.id.name', 'c')
    .root()
    .generate();

这是直接操作AST的方式,有没有更简单的方法呢?有!

$(code).replace(`var a = 1`, `var c = 1`)

replace确实用起来爽,但当你在分析转换代码时遇到replace覆盖不到的场景时,请用GoGoCode提供的其他api来精准操作AST吧!


  • 小明又改主意了,想把所有定义语句的 a 都改成 c,只需要将目标语句改一下写成:
$(code).replace(`var a = $_$`, `var c = $_$`)
看到这里,你应该已经理解 findreplace 的第一参有点类似‘jquery 选择器’,而这里的选择器是你需要查找的代码片段,无论想要匹配多么复杂的代码都可以匹配到,其中 $_$ 通配符可以匹配任意确定代码,代码选择器及通配符详细介绍 看这里

  • 小明想试试将代码里的 var 改为 letrequire 改为 import,他发现用 GoGoCode 真的可以像字符串的 replace 一样简单!
$(code)
.replace('var $_$ = $_$', 'let $_$ = $_$');
.replace('const $_$ = require($_$)', 'import $_$ from $_$')

api 列表

基础api获取节点api操作节点
$().find().attr()
$.loadFile.parent().replace()
.generate().parents().replaceBy()
$.writeFile.siblings().after()
.next().before()
.nextAll().append()
.prev().prepend()
.prevAll().empty()
.root().remove()
.eq().clone()
.each()