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

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

  • https://groups.google.com/forum/?fromgroups=#!topic/uglifyjs/YjWjgl8Qm0c
  • https://github.com/mishoo/UglifyJS/blob/master/tmp/instrument.js

  • 现在我知道这是需要做的
  • 解析生成 AST
  • 创建自定义 Walks
  • 翻译 AST
  • 生成代码
  • 评估生成的代码

  • 这样对吗?或者我错过了什么?

    一个带有步行者代码的简单示例会很有帮助和赞赏

    最佳答案

    我也是 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

    关于javascript - 如何使用 uglifyjs/uglifyjs2 解析 walk 和 eval javascript 表达式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12288446/

    10-09 21:20