JavaScript分析、压缩工具JavaScript Analyser


Posted in Javascript onDecember 31, 2014

JSA的压缩过程分两步

第一步是语法压缩,类似于Dojo ShrinkSafe,但比他安全,且更加有效。

第二步是文本压缩,目前采用的是
JavaScript Compressor的压缩算法。
(http://dean.edwards.name/packer/ )

这些都可以在设置窗口设置。
默认情况先用语法压缩,当文件大于1000byte且采用文本压缩仍然可以压缩到原来大小90%时才在原来基础上采用文本压缩。

下面来一段脚本压缩示例,展示一下JSA语法压缩和优化功能。

try { 

//xxxx(); 

} 

catch (e) { 

yyyy(); 

function f1() { 

} 

} 

finally { 

zzzz(); 

} 

function f2(var1) { 

var var2 = 2; 

var var3 = 3; 

var withObject = {var2:-2} 

with(withObject){ 

alert(var2); 

} 

}

压缩结果(经过格式化,便于查阅):

zzzz(); 

function f2(A) { 

var var2 = 2; 

var B = 3; 

var C = {var2:-2}; 

with (C) { 

alert(var2); 

} 

}

与其他压缩工具压缩率比较:

1. JavaScript Compressor(http:// dean.edwards.name/packer/)
    与他自己的压缩工具代码为例(v2.02) packer压缩后大小为 7,428 字节(去除注释)。
    而我们的压缩工具可以压缩至7,256  字节
    7256 / 7428 = 0.9768443726440496
2.Dojo ShrinkSafe (粗糙的东西,既低效又危险,建议原有用户赶紧换掉)
    与他自己的框架源代码为例(v0.4.1):
    他自己压缩大小为149,518 字节,而我们压缩后可以缩小至81,261 字节
    81261 / 149518 = 0.5434864029748927

安全性说明:

1.JavaScript Compressor

基于文本的压缩,我没有细看其中逻辑,但是这种压缩出问题的可能性很低,我们的压缩工具也使用到他的压缩算法,在JSI 1.1 a8 及
其集成的第三方类库的测试中,未见异常。而且还有知名框架JQuery使用,相信不会有问题。

补充(2007-03-12):今天发现,这个东西在分析JavaScript多行字符串语法时,有bug。不过这个问题在经过JSA语法压缩之后,将不复存在。

2.Dojo ShrinkSafe 危险!!!!!

使用较短的名字替换掉长的局部变量名,这是一个极其不安全的压缩工具,举例说明:

function(){  

  var withObject = {variable1:1}  

  var variable1 = 2;  

  with(withObject){  

    alert(variable1);  

  }  

} 

将压缩成 :

function(){  

var _1={variable1:1};  

var _2=2;  

with(_1){  

alert(_2);  

}  

} 

这明显是错误的,这个垃圾没有注意javascript某些特殊语法,和动态性。
对eval函数,catch操作,with语句,都未作任何处理。
相比之下JSA的是当前我知道的最安全最有效的压缩工具。
JSA 不仅提供代码压缩功能,还可以做格式化,脚本分析。

脚本分析功能可以用于查看脚本信息,以及查找脚本中的潜在问题。
比如查看脚本中申明了那些函数,变量。
使用了那些外部变量。等等。。。

Javascript 相关文章推荐
JavaScript Tips 使用DocumentFragment加快DOM渲染速度
Jun 28 Javascript
Node.js开发之访问Redis数据库教程
Jan 14 Javascript
HTML5实现留言和回复页面样式
Jul 22 Javascript
详解jQuery移动页面开发中的ui-grid网格布局使用
Dec 03 Javascript
jquery拖动层效果插件用法实例分析(附demo源码)
Apr 28 Javascript
javascript简单实现跟随滚动条漂浮的返回顶部按钮效果
Aug 19 Javascript
浅谈jQuery中的eq()与DOM中element.[]的区别
Oct 28 Javascript
JavaScript输入分钟、秒倒计时技巧总结(附代码)
Aug 17 Javascript
EasyUI创建人员树的实例代码
Sep 15 Javascript
微信小程序实现多个按钮的颜色状态转换
Feb 15 Javascript
2分钟实现一个Vue实时直播系统的示例代码
Jun 05 Javascript
jQuery 实现DOM元素拖拽交换位置的实例代码
Jul 14 jQuery
jQuery中:last-child选择器用法实例
Dec 31 #Javascript
jQuery中:nth-child选择器用法实例
Dec 31 #Javascript
jQuery中:first-child选择器用法实例
Dec 31 #Javascript
jQuery中复合属性选择器用法实例
Dec 31 #Javascript
javascript实现左右控制无缝滚动
Dec 31 #Javascript
javascript比较两个日期的先后示例代码
Dec 31 #Javascript
jQuery中[attribute*=value]选择器用法实例
Dec 31 #Javascript
You might like
PHP的开发框架的现状和展望
2007/03/16 PHP
PHP Google的translate API代码
2008/12/10 PHP
PHP清除字符串中所有无用标签的方法
2014/12/01 PHP
PHP并发多进程处理利器Gearman使用介绍
2016/05/16 PHP
php基于自定义函数记录log日志方法
2017/07/21 PHP
JavaScript 拾碎[三] 使用className属性
2010/10/16 Javascript
js函数排序的实例代码
2013/07/01 Javascript
js 针对html DOM元素操作等经验累积
2014/03/11 Javascript
js日期联动示例
2014/05/02 Javascript
jQuery焦点图切换简易插件制作过程全纪录
2014/08/27 Javascript
javascript检测是否联网的实现代码
2014/09/28 Javascript
基于JS实现弹出一个隐藏的div窗口body页面变成灰色并且不可被编辑
2016/12/14 Javascript
几行js代码实现自适应
2017/02/24 Javascript
详解vuex 中的 state 在组件中如何监听
2017/05/23 Javascript
React Native中Navigator的使用方法示例
2017/10/13 Javascript
js原生map实现的方法总结
2020/01/19 Javascript
在vue中实现echarts随窗体变化
2020/07/27 Javascript
原生js实现点击按钮复制内容到剪切板
2020/11/19 Javascript
基于VUE实现简单的学生信息管理系统
2021/01/13 Vue.js
[57:38]2018DOTA2亚洲邀请赛3月30日 小组赛A组 OpTic VS OG
2018/03/31 DOTA
python遍历文件夹并删除特定格式文件的示例
2014/03/05 Python
Python中return语句用法实例分析
2015/08/04 Python
Python动态赋值的陷阱知识点总结
2019/03/17 Python
利用python求积分的实例
2019/07/03 Python
python 6.7 编写printTable()函数表格打印(完整代码)
2020/03/25 Python
torchxrayvision包安装过程(附pytorch1.6cpu版安装)
2020/08/26 Python
css3 旋转按钮 使用CSS3创建一个旋转可变色按钮
2012/12/31 HTML / CSS
简单总结CSS3中视窗单位Viewport的常见用法
2016/02/04 HTML / CSS
利用css3画个同心圆示例代码
2017/07/03 HTML / CSS
Html5新增标签与样式及让元素水平垂直居中
2019/07/11 HTML / CSS
Original Penguin英国官方网站:美国著名休闲时装品牌
2016/10/30 全球购物
怎么可以提高数据库查询数据的速度
2014/06/28 面试题
秘书英文求职信
2014/04/16 职场文书
销售员试用期自我评价
2014/09/15 职场文书
毕业实习证明(4篇)
2014/10/28 职场文书
Java SSH 秘钥连接mysql数据库的方法
2021/06/28 Java/Android