在重构代码时,我经常需要重命名变量,目前我使用regexs以一种有点麻烦的方式进行重命名--最后,由于缺乏实际的结构,我不得不拿出一些愚蠢的文本解决方案,例如,将“req”重命名为“request”,并避免类似名称“require”的副作用。
想一想:这有点像用regexs修改DOM :它只是不起作用。
我了解了AST和Esprima等代码结构修改工具。是否有重新命名变量、Esprima或其他的工具?
发布于 2014-01-14 10:27:21
1. grasp.js
看起来http://graspjs.com/就是这样做的。
grasp selector --replace replacement file.js例如,将'el‘重命名为'element':
grasp '#el' --replace 'element' index.js官方的grasp.replace文档。
2. vscode
Visual Studio代码还包括一个真正的替换工具。只需右键单击一个令牌并选择重命名符号。

发布于 2019-11-07 13:58:01
我知道你一直要求‘一个工具’,但我认为最好只是使用esprima本身和各种通用工具之上的esprima,并滚动您自己的重命名。因为这真的很容易,然后你就有了更多的控制。这里是一个完整的例子,只有12行代码。它使用escodegen和estraverse,都在github上,就我所能看到的与esprima一起使用的“标准”而言。esprima本质上给出了解析函数字符串->抽象语法树,escodegen本质上给出了它的反向,即抽象语法树->字符串。并用导线法“行走树”,从而帮助分析或修改它。
在这里,代码:
function rename(code, renamingObj){
var ast = esprima.parse(code);
function callback(node){
if (node.type==='Identifier') {
if (node.name in renamingObj){
node.name = renamingObj[node.name];
}
}
}
estraverse.traverse(ast, { enter: callback });
return escodegen.generate(ast);
}Testcase:
function blah(x,y){
var difference = x + y;
var product = x - y;
var sum = x * y;
return 42;
}
var renamingObj = {
sum : 'product',
difference : 'sum',
product : 'difference'
};运行它:
rename(blah.toString(), renamingObj)产出:
function blah(x, y) {
var sum = x + y;
var difference = x - y;
var product = x * y;
return 42;
}我想说的是,如果您有什么特别的事情要做,那么修改上面的代码比筛选一些工具文档更容易。
发布于 2013-10-31 16:20:49
我们的JavaScript格式化程序/模糊处理程序将可靠地做到这一点。它解析JavaScript,构建AST,或者打印漂亮的版本,或者打印丑陋的(模糊的)版本。(他们在一起的原因是因为漂亮和丑陋是同一枚硬币的反面!)
它所做的事情之一是置乱(整个)标识符名。通过使用AST,它只重命名“整个标识符”;它不会将"req“与"require”混淆,也不会意外地修改字符串或注释内容。
您可以告诉它构建一个包含所有标识符名称的映射,然后将它们全部重命名;只更改一个,就可以获得重命名效果。标识符映射如下所示:
x -> y
p -> q
...将x重命名为y、p到q等。您希望:
x -> x
p -> q
...要将p改为q,很容易生成身份地图作为您的起点。
我不认为这很方便,但确实有效。显然它不知道任何关于范围的事情。(总有一天!)
详情请看我的简历。许多版主讨厌工具问题,当我提供一个工具答案时,他们似乎特别不喜欢它,其中包括工具的链接。所以你得自己找出链接,抱歉。(如果你认为这是愚蠢的,请向Meta抱怨)。
https://stackoverflow.com/questions/19710494
复制相似问题