如何使用uglifyjs / uglifyjs2来解析walk和eval javascript表达式

时间:2012-09-05 19:29:21

标签: javascript node.js expression eval uglifyjs

如何使用uglifyjs解析javascript表达式?虽然是一个优秀的图书馆,但缺乏文档会使其更难理解!

这些链接在某种程度上帮助了我。

现在我知道这是需要做的事情

  • 解析以生成AST
  • 创建自定义漫游
  • 翻译AST
  • 生成代码
  • Eval生成的代码

这是对的吗?或者我错过了什么?

使用walker代码进行游戏的一个简单示例将非常有用和赞赏

1 个答案:

答案 0 :(得分:3)

我也是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_modules / uglify-js / test / smallVariables.js *

根据您的输入文件,您将看到一些行号和小变量名。 通过这种方式,您可以根据需要放置任何规则。 AST树是一个非常强大的工具。

此外,我发现以下文章非常有用: http://lisperator.net/uglifyjs/walk