如何使用Python或Lisp删除无用的JavaScript代码

时间:2012-03-31 16:01:35

标签: javascript python lisp

JavaScript代码如下:

   <script>
    a={name:"abc"};
    b={xyz:"123"};
    this.c='aaa';
    this.cc='bbb';
    d=new Date();
    var e=new Array();
    var f=false;
    this.g=123;
    this.g++;
    document.write(b.xyz+this.cc);
    </script>

上面只使用变量b(b={xyz:"123"};)cc(this.cc='bbb';)

有没有人知道是否有办法用Python或Lisp删除未使用的变量?

3 个答案:

答案 0 :(得分:3)

尝试closure compilerjavascript代码中删除冗余代码和无用的空格: 我在158 bytes上运行了您的代码(closure compiler),我得到了这个代码(89 bytes):

a={name:"abc"};b={b:"123"};this.a="bbb";d=new Date;document.write(b.b+this.a);

http://closure-compiler.appspot.com

答案 1 :(得分:1)

在Common Lisp中,有parse-js来解析JavaScript代码。如果你想以交互方式评估JavaScript代码并执行某种动态分析,那么还有CL-JavaScript解释器,它构建在它之上。至于静态分析,还有cl-uglify-js,它也建立在parse-js之上 - 要么消除死代码,要么你可以尝试修改它来做...

答案 2 :(得分:1)

TXR中快速而脏的基于文本的黑客攻击:

script.txr:

@(collect)
@prolog
@(last)
<script>
@(end)
@(collect :vars (code))
@  (block occurs)
@    (cases)
@{decl /(var )?/}@{var /[a-z]+/}=@expr
@      (trailer)
@      (skip)
@      (cases)
@        (skip)@var@(skip)
@        (bind code `@decl@var=@expr`)
@      (or)
</script>
@        (fail occurs)
@      (end)
@    (or)
@code
@    (end)
@  (end)
@(last)
</script>
@(end)
@(collect)
@epilog
@(end)
@(output)
@{prolog "\n"}
<script>
@{code "\n"}
</script>
@{epilog "\n"}
@(end)

测试用例script.html

verbatim
text
<script>
a={name:"abc"};
b={xyz:"123"};
this.c='aaa';
this.cc='bbb';
d=new Date();
var e=new Array();
var f=false;
this.g=123;
this.g++;
</script>
left
alone

执行命令

$ txr script.txr script.html
verbatim
text
<script>
a={name:"abc"};
b={xyz:"123"};
this.c='aaa';
this.cc='bbb';
var e=new Array();
this.g=123;
this.g++;
</script>
left
alone

如你所见,实现了一些冷凝。

然而,代码认为aaa构成变量a的使用。保留变量e,因为e中出现var f=false;但是你不再看到这一点,因为该行本身已被删除,因为f没有发生。

如果你想要的不仅仅是基于文本的黑客攻击,你必须解析Javascript。 (在TXR中也可以采用清晰且有纪律的基于语法的方式,但编码所有语法规则是单调乏味的。)