如何通过babel去操作ast, 并生成对应的代码。

本文介绍了如何使用Babel的ast模块进行AST(抽象语法树)操作,包括修改变量名、插入对象属性、识别依赖文件和代码增强。通过实例展示了如何实现在JavaScript代码中实现名称替换、结构修改等技巧。
部署运行你感兴趣的模型镜像

如何通过babel去操作ast, 并生成对应的代码。

修改对象名,比如Taro.xxx 修改为wx.xxx

const babel = require('@babel/core')
let traverse = require('@babel/traverse').default
const generate = require('@babel/generator').default
const types = require('@babel/types');

const code = 'wx.login();let env = wx.env'
const { ast } = babel.transformSync(code, { ast: true })
traverse(ast, {
  BlockStatement(path) {
    path.scope.rename('wx', 'ft')
  },
  Identifier(path) {
    if (path.isReferenced() && path.node.name === 'wx') {
      path.replaceWith(types.identifier('ft'))
    }
  },
})

console.log(generate(ast, {}).code)

在代码中插入对应的节点,比如在某个对象中插入一个属性

const babel = require('@babel/core');
let traverse = require('@babel/traverse').default
const generate = require('@babel/generator').default
const types = require('@babel/types');

const code = 'let a = { b: 2, c: 1 }'
const { ast } = babel.transformSync(code, { ast: true })
traverse(ast, {
  ObjectExpression(path) {
    path.node.properties.push(
      types.objectProperty(
        types.identifier("d"),
        types.identifier("2")
      )
    )
  }
})
console.log(generate(ast, {}).code)

找到代码中的依赖文件

const babel = require('@babel/core');
let traverse = require('@babel/traverse').default

const code = 'const demo = require("./demo"); import test from "test.js" '
const { ast } = babel.transformSync(code, { ast: true })
traverse(ast, {
  ImportDeclaration(path) {
    console.log(path.node.source.extra.rawValue)
  },
  CallExpression(path) {
    if (path.node.callee.name === 'require' && path.node.arguments) {
      console.log(path.node.arguments[0].value)
    }
  }
})

在表达式前后插入一个方法

const babel = require('@babel/core');
let traverse = require('@babel/traverse').default
const types = require('@babel/types');
const generate = require('@babel/generator').default;

const code = 'var a = 1'
const { ast } = babel.transformSync(code, { ast: true })

traverse(ast, {
  enter(path) {
    if (types.isExpressionStatement(path.node)) {
      try {
        if (path.node.expression.callee.name === 'demo') {
          return
        }
      } catch (error) {
      }
    }
    const item = types.expressionStatement(
      types.callExpression(
        types.identifier('demo'),
        [
          types.identifier(`data`),
        ]
      )
    )
    if (types.isStatement(path.node)) {
      path.insertBefore(item)
      path.insertAfter(item)
    }
  }
})
console.log(generate(ast, {}).code)

参考文档:https://juejin.cn/post/7045496002614132766

如果你喜欢我的作品,请考虑赞助,以保持它们的可持续性。

您可能感兴趣的与本文相关的镜像

Seed-Coder-8B-Base

Seed-Coder-8B-Base

文本生成
Seed-Coder

Seed-Coder是一个功能强大、透明、参数高效的 8B 级开源代码模型系列,包括基础变体、指导变体和推理变体,由字节团队开源

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值