`
jindw
  • 浏览: 513022 次
  • 性别: Icon_minigender_1
  • 来自: 初到北京
社区版块
存档分类
最新评论

脚本分析、压缩、混淆工具 JSA新版本发布,压缩效率提高大约10%

阅读更多

JSA 1.0 Alpha发布,压缩效率提高大约10%

最新更新(2007-05-23 IE5 bug) 感谢 PHPRPC 作者 andot  的bug报告:
下载地址:
http://sourceforge.net/project/showfiles.php?group_id=175776

压缩算法改进:

实现了自己的文本压缩算法
  • 提高了压缩比率以及解压效率。
优化了语法压缩
  • 合并连续var申明,
  • 删除了多余var申明,
  • 删除了多余大括弧({、}),
  • 删除了多余分号(;)。

UI改进:

  • 自动编码识别
  • 支持文件拖放
  • 支持JAVA1.4.2+ 当jar打开方式为java时,可双击运行,但,若JAR打开方式被修改(如winrar),请使用如下方式:
    CMD>java -jar xx.jar
  • 格式化
    注释只能在各语句之间,插在语句中间的注释有可能丢失,在格式化的时候,算bug吧。
  • 压缩参数设置
    操作->设置:
    执行语法压缩:将替换局部变量,删除冗余语法。
    执行文本压缩:将脚本文本分词、替换压缩。执行时可通过eval( 解压函数() )方式还原。
    兼容IE5、NS3:老版本的浏览器对正则表达式支持优先,是否需要兼容他们(需要采用稍微复杂一点的解压函数)。
    执行文本压缩的条件设置:设置何时采用文本压缩,有两项,比率要求和大小要求;因为eval是需要额外开销的,所以,只有当文本压缩的比率小于指定值且文件大小大于指定值时才采用文本压缩。

ANT Task

  • 默认编码 :取JRE的默认编码,可能随机器不同而改变,所以,推荐手动指定器编码方式(eg:charset="utf-8"/charset="GBK")
  • jsicompile 任务:编译JSI (压缩,预装载编译,定制启动文件)
  • jscompress 压缩脚本

ANT Task 示例

    jsicompiler 示例(处理JSI及其集成的第三方脚本)

    xml 代码
     
    1. <target name="compress" depends="init">  
    2.   <jsicompiler destDir="ant/temp/script2" charset="utf-8" rebuildboot="true">  
    3.     <fileset dir="web/scripts">  
    4.       <include name="*/**/*.js" />  
    5.       <include name="*.js" />  
    6.       <exclude name="preload/**" />  
    7.     </fileset>  
    8.     <preloadgroup path="code-decorator.js">  
    9.       <fileset dir="web/scripts">  
    10.         <include name='js/io/__$package.js' />  
    11.         <include name='js/io/request.js' />  
    12.         <include name='js/io/writer.js' />  
    13.         <include name='js/xml/__$package.js' />  
    14.         <include name='js/xml/template.js' />  
    15.         <include name='js/xml/tag.js' />  
    16.         <include name='js/util/__$package.js' />  
    17.         <include name='js/util/collections.js' />  
    18.         <include name='org/xidea/syntax/__$package.js' />  
    19.         <include name='org/xidea/syntax/syntax-parser.js' />  
    20.         <include name='org/xidea/decorator/__$package.js' />  
    21.         <include name='org/xidea/decorator/code.js' />  
    22.       </fileset>  
    23.     </preloadgroup>  
    24.   </jsicompiler>  
    25. </target>  

    jscompress 示例(压缩普通脚本)

    xml 代码
     
    1. <target name="test-compress">  
    2.   <jscompress destDir="ant/temp/script2" charset="utf-8">  
    3.     <fileset dir="web/scripts">  
    4.       <include name="js/**/*.js" />  
    5.       <include name="*.js" />  
    6.     </fileset>  
    7.   </jscompress>  
    8. </target>  
分享到:
评论
29 楼 jindw 2007-06-12  
补充一下,zhourenjian的压缩算法,解压效率目前还不够优秀。大约是JSA的三倍。

此外压缩效果也因脚本而异,比如对jquery来说,lz77就没有优势。
28 楼 jindw 2007-06-12  
非常不错,和楼上的相比,JSA的文本压缩显得太简单的:)
下一个版本的JSA将默认禁用文本压缩。

如果想最大限度的最求压缩效率,大家去尝试zhourenjian的文本压缩算法吧:)
27 楼 andot 2007-06-12  
楼上的这个工具太好了,用 JSA 压缩后,再用楼上的工具压缩,还能减少近 1/5。而载入速度上感觉不到差异。

不过楼上这个工具压缩后的代码执行时会产生一个 ungzip 函数,而且这个函数的变量定义部分写的也不够精炼,不过可以通过手工修改进一步减少几十个字符,并且可以干掉 ungzip 函数。哈哈。

通过这个方法,PHPRPC 3.0 for JavaScript IE5 兼容版本压缩后,只有 15.8K 了!真是太棒了!
26 楼 zhourenjian 2007-06-12  
关于JavaScript基于LZ77算法(普通*.zip或*.png压缩是此算法的扩展实现)的压缩:

http://demo.java2script.org/lz77js/

如果不选“RegEx trimming before LZ77”选项,则展开为保持注释空格的源代码。其中压缩算法没有做混淆、分析的工作。另外解压代码约1k左右,使用了eval函数。

对于50K左右的源代码,可以压缩到50%左右;如果选了处理注释空格选项,则可以达到40%左右(普通*.zip压缩率为25%左右)。
25 楼 ufc 2007-06-11  
LICENSE是什么的?LGPL?GPL?还是商用的?
24 楼 sp42 2007-06-11  
的确是蛮不错的工具,赞赞^^
23 楼 ufc 2007-06-11  
LZ的东西不错,支持一下.
22 楼 jindw 2007-06-02  
http://jsi.group.iteye.com/shares
这里可以下一个临时版本,自己修改资源文件.

新的版本将在近两周发布,将支持语言切换.
21 楼 birdjavaeye 2007-06-01  
如何选择用英文界面?我用linux下的jdk,没有给swing和awt配置中文字体...
20 楼 liuzongan 2007-06-01  
功能 不是可强啊
19 楼 jindw 2007-06-01  
    <jsicompiler destDir="ant/temp/script2" charset="utf-8" rebuildboot="true"> 
如果你的脚本原文件不是utf8,如gbk,自己设置一下就是.

中文处理后变成\uxxxx 方式,这就是为了解决中文问题.
经过这样处理后,无论是gbk还是utf8的网页,都可以正确处理.

有人反应说,图形界面里面识别字符集的时候,偶尔也会搞错,图形界面里面是先尝试jvm的默认字符集,这个可能随机器变化.
暂时的解决办法:先用记事本吧要压缩的文件打开,拷贝进去.
这样就不会乱码了.
18 楼 redleaf 2007-06-01  
这个工具怎么对有中文的js处理啊,会变成乱码的,我对Ant不熟,不知道该怎么做,能给个详细的步骤吗?
17 楼 jindw 2007-05-23  
最新更新(2007-05-23 IE5 bug) 感谢 PHPRPC 作者 andot  的bug报告:
下载地址:http://sourceforge.net/project/showfiles.php?group_id=175776
16 楼 jindw 2007-05-21  
hax 写道
jindw 写道
hax 写道
结果就是所有eval语句处可以访问的变量(包括外层变量)的标识符统统不能压缩呀!!!eval真是祸患呀!
所以写代码能不eval千万别eval。。。
btw,如果eval函数也是被传进来的呢?这回就惨了。。。


function evilEval(param1, param2, param3) {
  param1(param2);
}

evilEval(eval, 'alert(param3)', 'abc')

嗯不得不佩服我自己,太变态了。。。。

这个而且ff和jscript处理不一样的。


呵呵,确实够狠。

不过这是违背ECMA规范的,按它的说明,eval甚至不能有别名,不能通过别名调用。
所以,你这种情况就更不允许了。

不过规范归规范,还是很多不怕死的人这么用了,dojo就用了(并且,它的情况完全可避免的)

我在写JSA的时候,这个问题也考虑过,我可以定义eval这样危险函数的别名。
但是,还没提供用户接口。




规范好像没说不能别名吧,好像说的是eval可以没有call等方法。


ff由于历史原因,eval会记住其所在的function的scope,所以可以把一个function 里的eval传出来,就可以对该函数内部搞破坏了。


我记得有的,我以前看到过。
15 楼 hax 2007-05-21  
jindw 写道
hax 写道
结果就是所有eval语句处可以访问的变量(包括外层变量)的标识符统统不能压缩呀!!!eval真是祸患呀!
所以写代码能不eval千万别eval。。。
btw,如果eval函数也是被传进来的呢?这回就惨了。。。


function evilEval(param1, param2, param3) {
  param1(param2);
}

evilEval(eval, 'alert(param3)', 'abc')

嗯不得不佩服我自己,太变态了。。。。

这个而且ff和jscript处理不一样的。


呵呵,确实够狠。

不过这是违背ECMA规范的,按它的说明,eval甚至不能有别名,不能通过别名调用。
所以,你这种情况就更不允许了。

不过规范归规范,还是很多不怕死的人这么用了,dojo就用了(并且,它的情况完全可避免的)

我在写JSA的时候,这个问题也考虑过,我可以定义eval这样危险函数的别名。
但是,还没提供用户接口。




规范好像没说不能别名吧,好像说的是eval可以没有call等方法。


ff由于历史原因,eval会记住其所在的function的scope,所以可以把一个function 里的eval传出来,就可以对该函数内部搞破坏了。
14 楼 jindw 2007-05-21  
hax 写道
结果就是所有eval语句处可以访问的变量(包括外层变量)的标识符统统不能压缩呀!!!eval真是祸患呀!
所以写代码能不eval千万别eval。。。
btw,如果eval函数也是被传进来的呢?这回就惨了。。。


function evilEval(param1, param2, param3) {
  param1(param2);
}

evilEval(eval, 'alert(param3)', 'abc')

嗯不得不佩服我自己,太变态了。。。。

这个而且ff和jscript处理不一样的。


呵呵,确实够狠。

不过这是违背ECMA规范的,按它的说明,eval甚至不能有别名,不能通过别名调用。
所以,你这种情况就更不允许了。

不过规范归规范,还是很多不怕死的人这么用了,dojo就用了(并且,它的情况完全可避免的)

我在写JSA的时候,这个问题也考虑过,我可以定义eval这样危险函数的别名。
但是,还没提供用户接口。
13 楼 hax 2007-05-21  
结果就是所有eval语句处可以访问的变量(包括外层变量)的标识符统统不能压缩呀!!!eval真是祸患呀!
所以写代码能不eval千万别eval。。。
btw,如果eval函数也是被传进来的呢?这回就惨了。。。


function evilEval(param1, param2, param3) {
  param1(param2);
}

evilEval(eval, 'alert(param3)', 'abc')

嗯不得不佩服我自己,太变态了。。。。

这个而且ff和jscript处理不一样的。
12 楼 jindw 2007-05-21  
hax 写道
喂,大哥,你说事实,那要摆事实的呀。给个测试用例呀。

还是你认为eval是可以解决的?那你搞定我给的函数先。不要空口说什么事实胜於雄辩。。。


要例子,其实你自己运行一下就可以的。
为了说明更多的问题,在你的例子里再加个函数doOther:
function doWhat(param1, param2) {
eval(param1);
}
function doOther(param1, param2) {
function inner(param3){alert(param3)}
inner(param1);
}
doWhat('alert(param2)', 'abc');


压缩结果(便于查看,重新格式化了):
function doWhat(param1,param2){
  eval(param1);
}
function doOther(C,A){
  function B(A){
    alert(A);
  }
  B(C);
}
doWhat("alert(param2)","abc");

1。eval影响的域,变量名没去压缩。
2。再doOther中,因不会受到eval影响,可以压缩。
3。最大限度重用了变量符号,这对局部变量很多,或者将来的文本压缩,都有好处。

文件太小,文本压缩就没有优势,所以这里只有语法压缩
11 楼 netfishx 2007-05-21  
这个要支持一把楼主。dojo的压缩是有bug的,它对eval的处理很危险。同一段用dojo处理会出错的代码改用楼主的压缩工具,工作正常。但未广泛测试,还不能定论。
10 楼 hax 2007-05-21  
喂,大哥,你说事实,那要摆事实的呀。给个测试用例呀。

还是你认为eval是可以解决的?那你搞定我给的函数先。不要空口说什么事实胜於雄辩。。。

相关推荐

    JSA脚本压缩工具

    **JSA脚本压缩工具详解** 在Web开发中,JavaScript代码的优化是提高网页加载速度和性能的关键步骤之一。为了减少网络传输的数据量,开发者通常会使用专门的工具对JavaScript代码进行压缩,去除不必要的空格、注释...

    Minify Javascript or CSS

    因此,建议在开发环境中使用未压缩的源代码,而在生产环境中使用压缩过的版本。 2. **处理依赖关系**:合并文件时,确保正确处理脚本间的依赖关系。通常,应该按照依赖顺序引入脚本,避免因顺序错误导致的运行错误。...

    java开源包10

    Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是不能让一个网站下线。 FTP客户端Java类库 ftp4j ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分...

    java开源包8

    Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是不能让一个网站下线。 FTP客户端Java类库 ftp4j ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分...

    java开源包2

    Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是不能让一个网站下线。 FTP客户端Java类库 ftp4j ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分...

    Java资源包01

    Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是不能让一个网站下线。 FTP客户端Java类库 ftp4j ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分...

    java开源包1

    Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是不能让一个网站下线。 FTP客户端Java类库 ftp4j ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分...

    java开源包11

    Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是不能让一个网站下线。 FTP客户端Java类库 ftp4j ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分...

    java开源包3

    Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是不能让一个网站下线。 FTP客户端Java类库 ftp4j ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分...

    java开源包6

    Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是不能让一个网站下线。 FTP客户端Java类库 ftp4j ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分...

    java开源包5

    Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是不能让一个网站下线。 FTP客户端Java类库 ftp4j ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分...

    java开源包4

    Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是不能让一个网站下线。 FTP客户端Java类库 ftp4j ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分...

    java开源包7

    Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是不能让一个网站下线。 FTP客户端Java类库 ftp4j ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分...

    java开源包9

    Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是不能让一个网站下线。 FTP客户端Java类库 ftp4j ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分...

    java开源包101

    Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是不能让一个网站下线。 FTP客户端Java类库 ftp4j ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分...

    Noobadora.sq866tqpb5.gaw3NAY

    【标题】"Noobadora.sq866tqpb5.gaw3NAY" 提供的文件看起来是一个被压缩的文件,很可能是一个项目或软件的存档。然而,这个标题本身并不包含明显的IT知识信息,它更像是一个随机生成或者自定义的文件名,可能包含了...

Global site tag (gtag.js) - Google Analytics