Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/429.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用uglifyjs/uglifyjs2解析walk和eval javascript表达式_Javascript_Node.js_Expression_Eval_Uglifyjs - Fatal编程技术网

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

如何使用uglifyjs/uglifyjs2解析walk和eval javascript表达式,javascript,node.js,expression,eval,uglifyjs,Javascript,Node.js,Expression,Eval,Uglifyjs,如何使用语法解析javascript表达式?虽然它是一个优秀的库,但缺少文档使它更难理解 这些链接在某种程度上帮助了我 现在我知道这是需要做的 解析以生成AST 创建自定义步行 翻译AST 生成代码 Eval生成代码 这是正确的吗?还是我遗漏了什么 一个使用walker代码的简单示例将非常有用,我对uglifyjs也是新手。 我认为这是一个伟大的图书馆,但它缺乏良好的文档或例子。 我认为uglifyjs的一个很好的用途是创建一个静态分析工具。 出于这个原因,我想分享我写的一个小脚本,

如何使用语法解析javascript表达式?虽然它是一个优秀的库,但缺少文档使它更难理解

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

现在我知道这是需要做的

  • 解析以生成AST
  • 创建自定义步行
  • 翻译AST
  • 生成代码
  • Eval生成代码
这是正确的吗?还是我遗漏了什么

一个使用walker代码的简单示例将非常有用,我对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]);
var smallVariableNames=[];
函数addBadVariableName(行,值){
smallVariableNames.push(行+“”+值);
}
var UglifyJS=require(“../tools/node”)//请先安装节点
var parser=UglifyJS.parser//解析input.js文件并创建AST
,fs=require('fs')
,filename='input.js';
var toplevel=UglifyJS.parse(字符串(fs.readFileSync(filename));
var walker=new UglifyJS.TreeWalker(函数(节点){//walk AST
var语句=JSON.parse(JSON.stringify(node));
if(UglifyJS.AST|u VarDef的节点实例| UglifyJS.AST|u常量的节点实例)
{
var parentForIn=walker.find_parent(UglifyJS.AST_ForIn);//为了避免在for..in循环中初始化变量
var parentLoopVariable=“”;
if(parentForIn){
parentLoopVariable=JSON.parse(JSON.stringify(parentForIn));
parentLoopVariable=parentLoopVariable[“init”];
parentLoopVariable=parentLoopVariable[“定义”];
if(parentLoopVariable)
parentLoopVariable=parentLoopVariable[0]。名称[“结束”]。值;
}
var parentFor=walker.find_parent(UglifyJS.AST_For);//以避免For循环中的初始化变量
如果(家长){
parentLoopVariable=JSON.parse(JSON.stringify(parentFor));
parentLoopVariable=parentLoopVariable[“init”];
parentLoopVariable=parentLoopVariable[“定义”];
if(parentLoopVariable)
parentLoopVariable=parentLoopVariable[0]。名称[“结束”]。值;
}
变量表达式=语句[“名称”];
if(表达式){
variableName=node.start.value
if(variableName&&variableName.length<3&&variableName!==parentLoopVariable)
{
addBadVariableName(node.start.line,variableName);
}
}
}
});
顶层。步行(步行);
用于(小变量名称中的行)
log(smallVariableNames[line]);
简单地说,我们的脚本读取“input.js”文件,解析它,走到树上,找到所有这些小变量

好了,现在我们有了我们的脚本,我们可以如何测试它!! 我已将脚本保存在文件夹%UGLIFY-JS%/test中/ 最快捷的方法(如果安装了node.js和uglify.js)是在命令中运行: *node_modules/uglify js/test/smallVariables.js*

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

我还发现以下文章非常有用:

走路时,请看