首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用uglifyjs / uglifyjs2解析遍历和eval javascript表达式

如何使用uglifyjs / uglifyjs2解析遍历和eval javascript表达式
EN

Stack Overflow用户
提问于 2012-09-05 19:29:20
回答 1查看 2.3K关注 0票数 4

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

这些联系在一定程度上帮助了我。

现在我知道这是我们需要做的

  • 解析生成AST
  • 创建自定义步行
  • 翻译AST
  • 生成代码
  • Eval生成代码

这是正确的吗?还是我漏掉了什么?

一个简单的例子,加上可供玩的walker代码,将是非常有用的,也是值得赞赏的。

EN

回答 1

Stack Overflow用户

发布于 2013-03-04 12:36:57

我对uglifyjs也很陌生。我认为它是一个很好的库,但是它缺乏好的文档或示例。我认为非常好的uglifyjs的一种用法是创建一个静态分析工具。出于这个原因,我想共享我编写的一个小脚本,它可以在js文件中找到所有具有小名的变量,例如var d=3;这些变量名描述性不强,很难维护大型程序。因此,我要求所有变量名都是,长度至少为3个字符。为了使事情更有趣,我们不应该将For..loops和For..in循环中的计数器变量标记为缺陷。

也就是说,我们可以创建这个smallVariables.js。

代码语言:javascript
运行
复制
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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12288446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档