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>  
评论
jindw 2007-09-09
jiming 写道
请教一下,使用这个包压缩后可以反编译回去吗?

文本压缩部分可以还原,语法压缩不可还原。
jiming 2007-09-09
请教一下,使用这个包压缩后可以反编译回去吗?
jindw 2007-08-20
hax 写道
金同学下面有什么打算么?我现在都不敢给自己“放假”,压力太大了。

现在已经回杭州了,不过还没找到工作,不想放假也不行了,呵呵

DSONet 写道
ANT Task 示例
jsicompiler 示例

这个示例没法用啊
貌似依赖文件不全?
depends="init" ?
还有 <taskdef resource="jst-task.properties" ?
这部分内容呢?


不需要依赖,示例里面依赖也就是清空创建目录什么的。

<taskdef resource="jst-task.properties" ?
这是任务定义的一种方式,他会从类路径钟找jst-task.properties,省去一堆堆的任务定义。
DSONet 2007-08-20
ANT Task 示例
jsicompiler 示例

这个示例没法用啊
貌似依赖文件不全?
depends="init" ?
还有 <taskdef resource="jst-task.properties" ?
这部分内容呢?
jindw 2007-07-12
hax 写道
这个很难,通常只有js解释器自己可以做到。况且现在我们很多情况下是动态eval出来的,更难以定位到原先的源文件了。


他说的时压缩时的语法错误报告,还是可以做到的。
hax 2007-07-12
这个很难,通常只有js解释器自己可以做到。况且现在我们很多情况下是动态eval出来的,更难以定位到原先的源文件了。
jiming 2007-07-12
jindw 写道
jiming 写道
一个建议:

我用了一下这个产品,总的来说应该是非常棒。但是对于有的可以正常工作的 js 文件在压缩的时候会报错,目前的错误信息没有一点帮助意义。所以建议是不是能够把当前压缩到哪一行显示在错误信息中,如果能显示错误原因就更好了,这样用户好根据错误信息调整一下以适应jsa的规则。


JSA是没有任何特别规则的。
但是因为他是基于Rhino引擎的,所以,必须通过这个引擎的语法解析。

我在jQuery的一个插件压缩时,也遇到过报错的问题:
原因时处理正则的问题。
Rhino对正则语法更加严谨,比如 /[./]/ 在浏览器上一般都能通过,但是,Rhino会报错。必须写成 /[.\/]/

此外格式化的时候,偶尔发现匹配堆栈益出的情况,因为这不是主要功能,也一直没有管他。



我的要点不是说规则:)

我的意思是能够把编译出错的语句打出来方便用户找到哪句 js 语句出了问题,好进行修改。而不是毫无头绪的去一点一点的找问题。
hax 2007-07-09
金同学下面有什么打算么?我现在都不敢给自己“放假”,压力太大了。
jindw 2007-07-09
legend 写道
jindw 同学也放暑假?

呵呵,已经给自己放假半年了:)
legend 2007-07-08
jindw 同学也放暑假?
jindw 2007-07-08
恩,是的,我想暑假之后吧,有空再修改修改,吧错误信息之类的加上去。
hax 2007-07-08
倒是的,对于保留字作为id的,建议jsa可以根据情况给出error(完全不可使用的)或warning(理论上特殊上下文可用,但许多引擎会报错)。
foolfish 2007-07-07
JSA-1.0beta
有个不是bug的小问题
这个问题会引起java异常导致程序无法继续进行
在关键字变量上,
如:
var char='a';
alert(char);

这段代码可以运行但压缩出错.
(当然,使用关键字做为变量本身就是不正确的...)
jindw 2007-06-30
jiming 写道
一个建议:

我用了一下这个产品,总的来说应该是非常棒。但是对于有的可以正常工作的 js 文件在压缩的时候会报错,目前的错误信息没有一点帮助意义。所以建议是不是能够把当前压缩到哪一行显示在错误信息中,如果能显示错误原因就更好了,这样用户好根据错误信息调整一下以适应jsa的规则。


JSA是没有任何特别规则的。
但是因为他是基于Rhino引擎的,所以,必须通过这个引擎的语法解析。

我在jQuery的一个插件压缩时,也遇到过报错的问题:
原因时处理正则的问题。
Rhino对正则语法更加严谨,比如 /[./]/ 在浏览器上一般都能通过,但是,Rhino会报错。必须写成 /[.\/]/

此外格式化的时候,偶尔发现匹配堆栈益出的情况,因为这不是主要功能,也一直没有管他。
jiming 2007-06-30
一个建议:

我用了一下这个产品,总的来说应该是非常棒。但是对于有的可以正常工作的 js 文件在压缩的时候会报错,目前的错误信息没有一点帮助意义。所以建议是不是能够把当前压缩到哪一行显示在错误信息中,如果能显示错误原因就更好了,这样用户好根据错误信息调整一下以适应jsa的规则。
jindw 2007-06-16
图形界面的帮助菜单中有例子。
hbomb 2007-06-15
能不能,简单讲一下如何使用JSA Ant Task来批量处理脚本的?
我ant不是很熟
jindw 2007-06-14
JSA 1 beta即将发布,先预览一下:
http://www.xidea.org/webstart/JSA.jnlp

搞成web start了,省得大家老跑sf更新:)
andot 2007-06-13
我将压缩后的代码改为了这种形式:

[code:1]
eval((function(s){var w=s.split(''),l=w.length,r=0,b=0,e=0,r=0,n=0,p=0,i=0,m=0x1000,h=0x800,g=0x5c,u=[],v=[],x=[],y=[],z=[],t="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.;,()=-+{}*/ []<>_$&|?:!%^\t'~@#`\\\"\r\n".split('');for(;i<t.length;i++){p=t[i];v[p]=p;y[p.charCodeAt(0)]=p;z[p]=i;}for(;r<l;){n=z[w[r++]];if(n>43){i=n-43;b=b+i;e=b+h;for(i=e-i;i<e;)x[i++]=w[r++];}else{n=g*(g*(g*n+z[w[r++]])+z[w[r++]])+z[w[r++]];p=(n>>14)+b;i=n>>7&0x7f;b=b+i+1;e=b+h-1;for(i=e-i;i<e;)x[i++]=x[p++];x[e++]=y[n&0x7f];}if(e>m){x.length=e;for(i=0;i<h;)x[i++]=null;u[u.length]=x.join('');for(i=0;i<h;)x[i++]=x[b++];b=0;}}z=y=w=null;x.length=b+h;for(i=0;i<h;)x[i++]=null;u[u.length]=x.join('');x=null;return u.join('');})("压缩后的字符串"));
[/code:1]

这样就可以不侵入其他名字空间也减少了一些字符。
zhourenjian 2007-06-12
andot 写道
楼上的这个工具太好了,用 JSA 压缩后,再用楼上的工具压缩,还能减少近 1/5。而载入速度上感觉不到差异。

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

通过这个方法,PHPRPC 3.0 for JavaScript IE5 兼容版本压缩后,只有 15.8K 了!真是太棒了!


我记得unzip函数是当时经过大量修改的,当时我觉得应该是精炼得不能够再精炼了。当时的环境考虑为IE6.0/FF1.0/1.5和Opera 8.0。由于解压效率的问题,有些地方区分了浏览器以作效率优化。

Update: 重新看来一下那一年多前的代码,发现确实有一些多余字符,确实可以再少几十个字符。也可以写的更为精炼,不侵入其他名字空间等等。不过说实在话,一直以来我自己都没有怎么真正用压缩过后的*.js。

关于解压效率,也就是载入速度,只要脚本100k左右,基本上可以不用考虑;如果脚本原始大小超过100k,性能在IE或者Firefox上降低得比较厉害(Opera 8反而不受影响,Opera的JavaScript性能比较好的)。另外我觉得javascript级别的压缩对>100k的代码是错误的,还是用apache httpd server的mod_deflate吧。至于mod_deflate的用法可以参考:

http://inside.java2script.com/2007/06/05/compressing-and-deploying-javascript.html
jindw
  • 浏览: 203625 次
  • 性别: Icon_minigender_1
  • 来自: 初到北京
  • 详细资料
搜索本博客
存档
最新评论