[Javascript AST] 1. Continue: Write a simple Babel plugin
We want to write a Babel Plugin, which move 'const versionRegex = /(/d+)\.(/d+)\.(/d+)/gi' out of function scope and put it into global scope.
Code:
function getVersion(versionString) { const versionRegex = /(\d+)\.(\d+)\.(\d+)/gi var x = /foo/.text('thing') const [, major, minor, patch] = versionRegex.exec(versionString) return {major, minor, patch} }
AST:
export default function (babel) { const { types: t } = babel; return { name: "ast-transform", // not required visitor: { RegExpLiteral(path) { // We only want to locate // const versionRegex = /(\d+)\.(\d+)\.(\d+)/gi // NOT // var x = /foo/.text('thing') // for versionRegex, because it is a VariableDeclarator, it has init prop // for /foo/, it is under MemeberExpression's object prop if(path.parentKey !== 'init') { return; } // Now we locate const versionRegex = /(\d+)\.(\d+)\.(\d+)/gi // we want to generate a unqi id for id const program = path.find(parent => parent.isProgram()) const variableDeclarator = path.find(parent => parent.isVariableDeclarator()) const variableDeclaration = path.find(parent => parent.isVariableDeclaration()) const { node: { id: {name: originalName} } } = variableDeclarator const newName = program.scope.generateUidIdentifier(originalName) console.log(variableDeclaration) // rename the versionRegex path.scope.rename(newName.name, originalName) // move the regex out of function scope // create new versionRegex variable out of function scope // and assign the value to it const newVariableDeclaration = t.variableDeclaration(variableDeclaration.node.kind, [ t.variableDeclarator(newName, path.node) ]) program.node.body.unshift(newVariableDeclaration) // last remove the old one variableDeclarator.remove() } } }; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2016-09-24 [Ember] Ember.js Templates
2016-09-24 [NodeJS] Deploy a Node Application with the Now CLI
2016-09-24 [Ramda] Filter, Reject and Partition