我需要从javascript中解析(并可能修改)js表达式 (具体来说,我想在实际eval之前标记一些eval()表达式)
我非常喜欢UglifyJS README示例,但是,它需要node.js 有没有办法让它在客户端浏览器上运行?!
(我不是真正的js专家,所以如果我完全误解了这一点 平台好事请告诉我)
如果失败了,是否有另一种js解析器? 目前我正在寻找LintJS或esprima或类似的东西
答案 0 :(得分:1)
UglifyJS可以在浏览器和NodeJS中工作,就像Esprima一样(最好仔细检查每个浏览器兼容性规范)。事实上,你可以在浏览器中浏览UglifyJS(首选Chrome),转到UglifyJS站点并打开检查器控制台并输入:
var ast = UglifyJS.parse("var foo= 1")
然后你可以探索AST数据。例如,要获取变量声明的名称,请使用:
ast.body[0].definitions[0].name.name // returns "foo"
如果要修改AST树,请研究the structure和generate your own AST nodes以扩展树。 UglifyJS文档没问题,研究结构的格式有点简单(弹出对话框有点烦人,我不得不编写自己的文档解析器来创建我可以享受更多学习的文档)。 AST节点只是简单的对象(不需要构造函数或原型,只需要具有简单属性值的对象文字或子对象/对象数组),只要它们具有所有必需的属性和AST结构,您就拥有有效的AST树。例如,您可以像这样更改变量名称:
ast.body[0].definitions[0].name.name = "bar";
修改树后,您可以使用code generator feature将其打印回Javascript源。像这样:
// assuming variable ast already exists from above
var stream = UglifyJS.OutputStream(); // there are options you can pass to control basic formatting
ast.print(stream);
var code = stream.toString();
console.log(code); // equals "var bar=1;"
UglifyJS很棒,Esprima也是如此。 Esprima使用Spider Monkey AST格式,这是一个众所周知的Javascript AST标准,Uglify使用它自己的AST模型。我发现Esprima的AST格式干净但冗长,而UglifyJS更短但不确定它是否更清洁。还有像Escodegen这样的Esprima工具来生成代码,就像UglifyJS那样。
最好全部探索它们,看看你感觉舒适的地方,它们都做了类似的伟大事情,并允许你以前所未有的方式自动完成重新分解和代码分析任务。