`

Javascript压缩工具(Javascript compressed,Js压缩)(转)

 
阅读更多

怎么压缩Js?为什么要压缩Javascript? Javascript compressed/crunched
开发Ajax除了自己要写js代码外,同样也免不了要使用其它第三方js库,是否该为JavaScript减肥?
当 你提高了用户体验,做出了很绚丽的效果而欣喜的时候,是否想过优化一下JS的效率,比如微软的live,其中的js做了压缩处理。JS的速度分为两种,下 载速度和执行速度。今天就先来说说下载速度。要想js的下载速度快,就需要尽量减小js文件的大小。这里我们可以使用一个工具 ESC(ECMAScript cruncher)来帮我们完成这个工作,不过这个工具只能在Windows下使用。到
http://www.saltstorm.net/depo/esc/introduction.wbm?pod=js 下载 ESC.zip ,解压后看看它的帮助文档。很简单。

ESC Introduction
ESC is an ECMAScript pre-processor written in JScript, enabling an unlimited number of external scripts to be compressed/crunched into supertight, bandwidth-optimized packages. Featuring several compression-techniques such as comment removal, whitespace stripping, newline stripping and variable substitution ESC can reduce the overall size of your code with up to ~45%. Single, multiple scripts and even directories with scripts can be merged together at the compression level you decide. The processed output can later be appended or written to a file, or piped to another application for further processing via STDOUT.

ESC do NOT support crunching of inline scripts. So any attempt passing HTML, ASP, JSP, PHP or other equivalent documents to ESC is done at your own risk.

ESC supports four levels of compression, where a higher level equals higher compression. Beware though that levels >2 requires your code to be syntaxically perfect or ESC will punish you by producing a broken and useless output.

The compression ratio should hit around 25% using the default compression level on a vanilla looking script, but results as high as ~45% can be achieved depending on the script's design / your style of writing code.

ESC's compression engine is intelligent in the meaning that it has language syntax, statement and keyword awareness and it *knows* about native objects and members provided by the most common scripting hosts. This knowledgebase can easily be extended by pluggin in userdefined maps with additional information to further gain control of the crunching procedure. During processing following things are taken into account :

String and RegExpression read-ahead
Jscript Conditional compilation statements and variables
ECMA-262 Core language definitions (ECMAScript)
Intermediate DOM's (level 0) and DOM level 1
MS Jscript specific objects/methods
Netscape/Mozilla/Opera specific objects/methods/properties
MS WSH (Windows Scripting Host) 1+ native objects

压缩级别分为5种,从0到4

Level 0 :: No compression

Level 1 :: Comment removal

Level 2 :: Whitespace removal

Level 3 :: Newline removal

Level 4 :: Variable substitution

在WINDOWS命令行下执行

cscript ESC.wsf -ow menu2.js menu.js将会把menu.js按照js压缩级别2来压缩(默认js压缩级别为2)为menu2.js

cscript ESC.wsf -l 3 -ow menu3.js menu.js将会把menu.js按照js压缩级别3来压缩为menu3.js

需要注意的是,js压缩级别4会把变量名修改,如果你的js中用到了全局变量或者类的话,就不能使用该压缩级别了,否则其它使用你的js的文件可能会无法正常运行。

试了一下,把yui的menu.js压缩了一下,对应的级别和压缩率分别如下:

js压缩级别1:压缩率44.41%

js压缩级别2:压缩率62.82%

js压缩级别1:压缩率64.93%

原来130多K的js文件压缩后也就40多K,看来还是挺有用处的。


另外还有一个小工具
jsmin 也可以压缩,不过没有ESC的level选项,看了一下好像压缩效果类似于ESC的level3.济南大学的一些老师写了个jsmin的图形界面程序 JsMinGUI ,使用起来更加方便。:-)

Dojo项目组也提供了一个工具,shrinksafe可以通过
http://alex.dojotoolkit.org/shrinksafe/ 在线的上传要压缩的文件,处理完毕后可以保存到本地,另外shrinksafe还提供了一个本地运行的版本,需要jre1.4的支持。

Ps:对于一些压缩的代码,在阅读时可以用
JavaScript Code Improver 来进行格式化。看看它主页上的一个例子:
javascript压缩代码示例
原来的代码:

程序代码 程序代码
<script language="JavaScript">var i=0,s="",k=0;function foo(){for(j=0;j<10;j++){for(i=0;i<10;i++){s="string1";k=Math.floor(Math.random()*10);}for(i=20;i>9;i--){s="string2";k=I;}}}</script>



格式化后:

程序代码 程序代码
<script language="JavaScript">
var I = 0, s = "", k = 0;
function foo()
{
for(j = 0; j < 10; j++)
{
for(I = 0; I < 10; i++)
{
s = "string1";
k = Math.floor( Math.random()*10 );
}
for(I = 20; I > 9; i--)
{
s = "string2";
k = I;
}
}
}
</script>




js压缩,巨NB的dHTML特效. 来自:
http://hometown.aol.de/_ht_a/memtronic/MemTronic_CruncherCompressor_v09g.html

JS压缩示例样本:JS压缩示例样本


更多的JS压缩器以及混淆器
http://dean.edwards.name/packer/ 在线Js压缩
A Online JavaScript Compressor/Obfuscator version 2.0.2
Also available as a .NET application
开源下载:http://dean.edwards.name/download/#packer
JS压缩器帮助:http://dean.edwards.name/packer/usage/
http://dean.edwards.name/packer/usage/sample.html

http://hometown.aol.de/_ht_a/memtronic/

JavaScript Compressor/Obfuscator Demo:
http://www.brainjar.com/js/crunch/demo.html

JavaScript Code Improver:
JavaScript Code Improver Download


前面提到的Javascript压缩,都是采用删除注释,删除多余空格,替换字符等方式进行的,还有一种通过服务器的配置来实现Js静态压缩的方法:
关于JavaScript的gzip静态压缩方法
传 统的JS压缩(删除注释,删除多余空格等)提供的压缩率有时还是不尽不意,幸亏现在的浏览器都支持压缩传输(通过设置http header的Content-Encoding=gzip),可以通过服务器的配置(如apache)为你的js提供压缩传输,或是appfuse中使 用的GZipFilter使tomcat也提供这种能力

现在的问题是这种动态的压缩会导致服务器CPU占用率过高,现在我想到的解决辨法是通过提供静态压缩(就是将js预先通过gzip.exe压缩好)

一.下面描述在tomcat中的应用

1.将prototype.js通过gzip.exe压缩保存成prototype.gzjs
2.设置header,我编写了一个简单的AddHeadersFilter来将所有以gzjs结尾的文件增加设置header Content-Encoding=gzip
web.xml中的配置

引用内容 引用内容
<filter>
<filter-name>AddHeaderFilter</filter-name>
<filter-class>
badqiu.web.filter.AddHeaderFilter
</filter-class>
<init-param>
<param-name>headers</param-name>
<param-value>Content-Encoding=gzip</param-value>
</init-param>
</filter>

<filter-mapping>
<filter-name>AddHeaderFilter</filter-name>
<url-pattern>*.gzjs</url-pattern>
</filter-mapping>



测试prototype.js是否正常的代码

程序代码 程序代码
<html>
<head>
<!-- type="text/javascript"不可少,有的浏览器缺少这个不能运行 -->
<script src="prototype.gzjs" type="text/javascript"></script>
</head>
<body>
<input id="username" name="username" value="badqiu"/><br />
<input id="email" value="badqiu@gmail.com"/>
<script>
<!-- 测试prototype的方法是否正常-->
alert($F('username'))
</script>
</body>
</html>



在Apache httpd中可以直接通过在httpd.conf增加AddEncoding x-gzip .gzjs来映射.gzjs文件的header

二.相关压缩率数据
1. prototype.js 1.5.0_rc0原始大小56KB,未经任何处理直接使用gzip压缩为12KB,总压缩率79%
2. 通过js压缩工具压缩过的protytype.js为20KB,使用gzip压缩为10KB,总压缩率为83%
3. 实际项目中的多个js合并成的文件 439KB,直接通过gzip压缩为85KB,总压缩率81%
4. 439KB经过js压缩为165KB,再经过gzip压缩为65KB,总压缩率86%

基本上你都可以忽略js压缩工具的压缩率,直接使用gzip压缩

gzip下载地址 http://www.gzip.org
tomcat的压缩配置示例下载地址: http://www.blogjava.net/Files/badqiu/gziptest.rar

其主要是利用服务器自带的动态压缩功能 传输时压缩数据流.

分享到:
评论

相关推荐

    JS压缩工具 js代码美化

    为什么要压缩Javascript? Javascript compressed/crunched 开发Ajax除了自己要写js代码外,同样也免不了要使用其它第三方js库,是否该为JavaScript减肥? 当你提高了用户体验,做出了很绚丽的效果而欣喜的时候,...

    lzbase62:base62中基于LZ77(LZSS)JavaScript压缩算法

    lzbase62 base62中基于LZ77(LZSS)JavaScript压缩算法。 压缩后的结果将是一个以62个基数(0-9A-Za-z)为字符的字符串。 将大量数据存储在大小受限制的存储区(例如localStorage或cookie)中时,此功能很有用。演示...

    compressorjs:JavaScript图像压缩器

    JavaScript图像压缩器。 使用浏览器的本机 API进行压缩工作,这意味着它是有损压缩。 通常使用此方法在上载客户端映像文件之前对其进行预压缩。 目录 主要 dist/ ├── compressor.js (UMD) ├── compressor.min...

    lzwCompress.js:在JavaScript中为字符串实现了无损LZW压缩解压JSONJS对象

    JavaScript中针对字符串/ JSON / JS对象实现的无损LZW压缩/解压缩。 用法: 从npm安装lzwCompress: npm install lzwcompress 然后在您的node.js应用程序中使用它: import lzwCompress from 'lzwcompress'; ...

    CSS和JS管理工具Brewer.js.zip

    Brewer.js 是一个工具用于简化管理 CSS 和 JS 源文件,主要功能有: 编译 coffee-script (or iced) 源码到 javascript 编译 LESS 或 Stylus 文件到 CSS 将多个 JS 或者 CSS 文件合并到单一文件并可进行压缩...

    serve-compressed-2:Express中间件服务于预压缩资产

    在构建过程中,可以使用或gzip这样的命令行实用工具来压缩文件。 将压缩文件保存在适当的目录中之后,可以像下面这样使用serve-compressed: const path = require ( 'path' ) ;const express = require ( 'express...

    JJLC:用于压缩存储在 localStorage 中的 JSON 的 Javascript 库

    用于 localStorage 的 Javascript Json 实时压缩 JJLC 允许您压缩 json 文件并将其保存在 localStorage 中。 它使用 JSON 模式自动创建地图,并由于 JSON 模式的冗余而节省了大量大小。 当您将 json 存储在 ...

    is-compressed:检查文件路径是否为压缩文件

    被压缩 检查文件路径是否为压缩文件 安装 $ npm install is-compressed 用法 const isCompressed = require ( 'is-compressed' ) ; isCompressed ( 'source/unicorn.zip' ) ; //=&gt; true isCompressed ( 'source/...

    compressed-size-action:GitHub Action为PR提供了压缩后的大小更改

    压缩大小动作 GitHub操作,报告PR上压缩文件大小的变化。 存在npm ci文件时自动使用yarn或npm ci 建立您的PR,然后建立目标并在两者之间进行比较 不上传任何内容或不依赖集中存储 支持和 用法: 添加工作流( ....

    cropper.js 制作头像/图片上传、裁剪、并发送至后端-javascript

    支持翻译Exif 方向信息 跨浏览器支持 Main dist/ ├──cropper.css ├──cropper.min.css (compressed) ├──cropper.js (UMD) ) ├──cropper.min.js (UMD,压缩) ├──cropper.common.js (CommonJS,默认) └...

    S3TC:S3TC算法JavaScript实现

    S3TC 算法的 JavaScript 实现。 仅 DXT1 w/o alpha 实现。 该实现足够快,可以用作小图像的在线压缩器(256 到 256 像素约 10-20 毫秒)。 使用示例 假设我们已经有了 WebGL 上下文gl和一个 CommonJS 模块系统。 ...

    html5图片上传和图片压缩上传

    Html5 Image Upload and Compressed Image Upload.html5图片上传和图片压缩上传

    ghost-storage-compressed

    幽灵存储压缩 压缩的Ghost存储允许鬼在本地保存时压缩图像支持:imagemin-giflossy,imagemin-gifsicle,imagemin-jpegtran,imagemin-mozjpeg,imagemin-optipng,imagemin-pngquant,imagemin-webp安装通过NPM npm...

    base64-to-compressed-image:从txt中获取base64字符串,对其进行解码并另存为压缩图像

    base64到压缩的图像 从txt中获取base64字符串,对其进行解码并另存为压缩图像。 使用前先做“ npm i”。

    compressing:压缩和解压缩所需的一切

    压缩 缺少节点的压缩和解压缩库。 目前支持: 柏油gzip g 压缩安装npm install compressing用法压缩单个文件以gzip为例,tar,tgz和zip与gzip相同。 诺言风格 const compressing = require ( 'compressing' ) ;// ...

    guard-uglify:用于 uglifyjs javascript 文件压缩的​​保护库(通过 uglifier gem)

    什么? gem 的保护包装。 安装 添加到您的Gemfile : gem 'guard-uglify' 或者手动安装 gem: $ gem install guard-uglify ...# :run_at_start - compressed input file when guard starts # :uglifie

    WakhiWebKeys:Web 浏览器的 Wakhi 键盘布局

    建造要创建书签: 使用您选择的 Javascript 压缩器压缩 wakhiIM.js,例如的 Google Closure Compiler 将压缩代码嵌入 HTML 页面上的链接中: [removed]__COMPRESSED_HTML_HERE__'&gt;WakhiWebKeys&lt;/a&gt;计划和可能性这里...

    jzon:JZON是JSON压缩的对象表示法

    宗佐JZON是JSON压缩对象表示法。 这可以用作json压缩器和解压缩器,最适合压缩您在项目中静态使用的大型json对象数组。 未来的方向是添加一个C#实现,以便您的服务器可以使用压缩格式。 或仅发送一次格式,然后将...

    denoflate:WebAssembly支持的Deno DeflateGzipZlib压缩,用Rust编写

    丹诺膦酸盐WebAssembly为Deno提供了Deflate / Gzip / Zlib压缩功能,以Rust编写。用法deno cache -r https://deno.land/x/denoflate/mod.tsimport { deflate , inflate } from ...

    jslzjb:LZJB压缩算法(http

    请注意, Iuppiter.js的Base64实现似乎不兼容,不正确或有故障。 您应该使用btoa() ,例如: // "bytes" is an array of integers representing byte values 0-255 var compressed = Iuppiter . compress ( bytes ...

Global site tag (gtag.js) - Google Analytics