如何使用uglifyjs解析javascript表达式?虽然是一个优秀的库,但缺乏文档使人更加难以理解!
这些联系在一定程度上帮助了我。
现在我知道这是我们需要做的
这是正确的吗?还是我漏掉了什么?
一个简单的例子,加上可供玩的walker代码,将是非常有用的,也是值得赞赏的。
发布于 2013-03-04 12:36:57
我对uglifyjs也很陌生。我认为它是一个很好的库,但是它缺乏好的文档或示例。我认为非常好的uglifyjs的一种用法是创建一个静态分析工具。出于这个原因,我想共享我编写的一个小脚本,它可以在js文件中找到所有具有小名的变量,例如var d=3;这些变量名描述性不强,很难维护大型程序。因此,我要求所有变量名都是,长度至少为3个字符。为了使事情更有趣,我们不应该将For..loops和For..in循环中的计数器变量标记为缺陷。
也就是说,我们可以创建这个smallVariables.js。
var smallVariableNames = [];
function addBadVariableName(line,value){
smallVariableNames.push(line + " "+value);
}
var UglifyJS = require("../tools/node"); //Please install node first
var parser = UglifyJS.parser // Parse input.js file and create AST
, fs = require('fs')
, filename = 'input.js';
var toplevel = UglifyJS.parse(String(fs.readFileSync(filename)));
var walker = new UglifyJS.TreeWalker(function(node){ //walk AST
var statement = JSON.parse(JSON.stringify(node));
if (node instanceof UglifyJS.AST_VarDef || node instanceof UglifyJS.AST_Constant)
{
var parentForIn = walker.find_parent(UglifyJS.AST_ForIn); //in order to avoid init vars in for..in loops
var parentLoopVariable ="";
if (parentForIn) {
parentLoopVariable = JSON.parse(JSON.stringify(parentForIn));
parentLoopVariable = parentLoopVariable["init"];
parentLoopVariable = parentLoopVariable["definitions"];
if (parentLoopVariable)
parentLoopVariable = parentLoopVariable[0].name["end"].value;
}
var parentFor = walker.find_parent(UglifyJS.AST_For); //in order to avoid init vars in for loops
if (parentFor) {
parentLoopVariable = JSON.parse(JSON.stringify(parentFor));
parentLoopVariable = parentLoopVariable["init"];
parentLoopVariable = parentLoopVariable["definitions"];
if (parentLoopVariable)
parentLoopVariable = parentLoopVariable[0].name["end"].value;
}
var expression = statement["name"];
if (expression) {
variableName = node.start.value
if(variableName && variableName.length < 3 && variableName !== parentLoopVariable)
{
addBadVariableName(node.start.line,variableName);
}
}
}
});
toplevel.walk(walker);
for (line in smallVariableNames)
console.log(smallVariableNames[line]);简单地说,我们的脚本--我们读取"input.js“文件,解析它,走到树前,找到所有这些小变量。
好的,现在我们有了我们的脚本,我们可以测试它!!我已经将脚本保存在文件夹%UGLIFY-JS%/test/最快速的方法(如果您有node.js和uglify.js)是在命令中运行:*node node.js
根据输入文件的不同,您将看到一些行号和小变量名。以这种方式,你可以把任何规则适合你的需要。AST树是一个非常强大的工具。
此外,我还发现以下文章非常有用:http://lisperator.net/uglifyjs/walk
https://stackoverflow.com/questions/12288446
复制相似问题