如何使用uglifyjs/uglifyjs2解析walk和eval javascript表达式
如何使用语法解析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的一个很好的用途是创建一个静态分析工具。 出于这个原因,我想分享我写的一个小脚本,
- 解析以生成AST
- 创建自定义步行
- 翻译AST
- 生成代码
- Eval生成代码
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树是一个非常强大的工具
我还发现以下文章非常有用:
走路时,请看