2007-05-08
脚本分析、压缩、混淆工具 JSA新版本发布,压缩效率提高大约10%
关键字: JSIJSA 1.0 Alpha发布,压缩效率提高大约10%
最新更新(2007-05-23 IE5 bug) 感谢 PHPRPC 作者 andot 的bug报告:下载地址:http://sourceforge.net/project/showfiles.php?group_id=175776
压缩算法改进:
实现了自己的文本压缩算法
优化了语法压缩
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 示例
- <target name="compress" depends="init">
- <jsicompiler destDir="ant/temp/script2" charset="utf-8" rebuildboot="true">
- <fileset dir="web/scripts">
- <include name="*/**/*.js" />
- <include name="*.js" />
- <exclude name="preload/**" />
- </fileset>
- <preloadgroup path="code-decorator.js">
- <fileset dir="web/scripts">
- <include name='js/io/__$package.js' />
- <include name='js/io/request.js' />
- <include name='js/io/writer.js' />
- <include name='js/xml/__$package.js' />
- <include name='js/xml/template.js' />
- <include name='js/xml/tag.js' />
- <include name='js/util/__$package.js' />
- <include name='js/util/collections.js' />
- <include name='org/xidea/syntax/__$package.js' />
- <include name='org/xidea/syntax/syntax-parser.js' />
- <include name='org/xidea/decorator/__$package.js' />
- <include name='org/xidea/decorator/code.js' />
- </fileset>
- </preloadgroup>
- </jsicompiler>
- </target>
- <target name="test-compress">
- <jscompress destDir="ant/temp/script2" charset="utf-8">
- <fileset dir="web/scripts">
- <include name="js/**/*.js" />
- <include name="*.js" />
- </fileset>
- </jscompress>
- </target>
jsicompiler 示例(处理JSI及其集成的第三方脚本)
xml 代码
jscompress 示例(压缩普通脚本)
xml 代码
评论
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" ?
这部分内容呢?
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" ?
这部分内容呢?
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的规则。
我用了一下这个产品,总的来说应该是非常棒。但是对于有的可以正常工作的 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);
这段代码可以运行但压缩出错.
(当然,使用关键字做为变量本身就是不正确的...)
有个不是bug的小问题
这个问题会引起java异常导致程序无法继续进行
在关键字变量上,
如:
var char='a';
alert(char);
这段代码可以运行但压缩出错.
(当然,使用关键字做为变量本身就是不正确的...)
jindw
2007-06-30
jiming 写道
一个建议:
我用了一下这个产品,总的来说应该是非常棒。但是对于有的可以正常工作的 js 文件在压缩的时候会报错,目前的错误信息没有一点帮助意义。所以建议是不是能够把当前压缩到哪一行显示在错误信息中,如果能显示错误原因就更好了,这样用户好根据错误信息调整一下以适应jsa的规则。
我用了一下这个产品,总的来说应该是非常棒。但是对于有的可以正常工作的 js 文件在压缩的时候会报错,目前的错误信息没有一点帮助意义。所以建议是不是能够把当前压缩到哪一行显示在错误信息中,如果能显示错误原因就更好了,这样用户好根据错误信息调整一下以适应jsa的规则。
JSA是没有任何特别规则的。
但是因为他是基于Rhino引擎的,所以,必须通过这个引擎的语法解析。
我在jQuery的一个插件压缩时,也遇到过报错的问题:
原因时处理正则的问题。
Rhino对正则语法更加严谨,比如 /[./]/ 在浏览器上一般都能通过,但是,Rhino会报错。必须写成 /[.\/]/
此外格式化的时候,偶尔发现匹配堆栈益出的情况,因为这不是主要功能,也一直没有管他。
jiming
2007-06-30
一个建议:
我用了一下这个产品,总的来说应该是非常棒。但是对于有的可以正常工作的 js 文件在压缩的时候会报错,目前的错误信息没有一点帮助意义。所以建议是不是能够把当前压缩到哪一行显示在错误信息中,如果能显示错误原因就更好了,这样用户好根据错误信息调整一下以适应jsa的规则。
我用了一下这个产品,总的来说应该是非常棒。但是对于有的可以正常工作的 js 文件在压缩的时候会报错,目前的错误信息没有一点帮助意义。所以建议是不是能够把当前压缩到哪一行显示在错误信息中,如果能显示错误原因就更好了,这样用户好根据错误信息调整一下以适应jsa的规则。
jindw
2007-06-16
图形界面的帮助菜单中有例子。
hbomb
2007-06-15
能不能,简单讲一下如何使用JSA Ant Task来批量处理脚本的?
我ant不是很熟
我ant不是很熟
jindw
2007-06-14
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]
这样就可以不侵入其他名字空间也减少了一些字符。
[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 了!真是太棒了!
不过楼上这个工具压缩后的代码执行时会产生一个 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
- 浏览: 203625 次
- 性别:

- 来自: 初到北京

- 详细资料
搜索本博客
最新评论
-
JSI 类库文件格式探讨
应该是jsa啥时候有新版本
-- by dingyuan -
JSI 类库文件格式探讨
jsi啥时候放新版本啊
-- by dingyuan -
最近工作上比较郁闷
一个人犯错误不要紧,总要得是能从错误中吸取教训,并且不要再犯第二次。我觉得不应该 ...
-- by twfx -
2008年我可以做一些什么
呵呵,开始了一些,完成了一些,黄掉了一些。
-- by jindw -
2008年我可以做一些什么
你的计划开始了吗?
-- by programmer






评论排行榜