0

I need to parse (and possibly modify) a js expression from within javascript (Specifically i want to markup some eval() expressions before the actual eval)

I really like the UglifyJS README examples, but alas, it needs node.js Is there any way to get this to run on clientside browser?!

(i am not really a js expert so if i am completely misunderstanding this platform thingy please let me know)

Failing that, is there an alternative js parser ? Currently i am looking LintJS or esprima or something like that

4

1 回答 1

1

UglifyJS 可以在浏览器和 NodeJS 中工作,就像 Esprima 一样(最好仔细检查每个浏览器的兼容性规范)。事实上,您可以在浏览器(Chrome 首选)中使用 UglifyJS,方法是转到UglifyJS站点并打开检查器控制台并输入:

var ast = UglifyJS.parse("var foo= 1")

然后您可以探索 AST 数据。例如,要获取变量声明的名称,请使用:

ast.body[0].definitions[0].name.name // returns "foo"

如果您想修改 AST 树,请研究其结构生成您自己的 AST 节点来扩展树。UglifyJS 文档还可以,研究结构的格式有点手动(弹出对话框有点烦人,我必须编写自己的文档解析器来创建我可以享受更多学习的文档)。AST 节点只是简单的对象(不需要构造函数或原型,只需具有简单属性值或子对象/对象数组的对象字面量),只要它们具有所有必需的属性和 AST 结构,您将拥有一个有效的 AST树。例如,您可以像这样更改变量名称:

ast.body[0].definitions[0].name.name = "bar";

修改树后,您可以使用代码生成器功能将其打印回 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 更短但不确定它是否更简洁。Esprima 也有一些工具,比如Escodegen,可以像 UglifyJS 一样生成代码。

最好去探索它们,看看你觉得舒服的地方,它们都做了类似的伟大事情,并允许你以前所未有的方式自动化你的重构和代码分析任务。

于 2013-07-05T00:47:11.133 回答