JS代码压缩是一种十分常见的前端优化的手段,对于大量使用JS的Web应用,代码压缩可以是极大的减少代码的大小,加快传输效率,提高浏览的体验。
而在所有的JS压缩工具中,UglifyJS在不改变JS语义前提下可以提供最好的压缩率,其优异的性能而广为称颂,而与它性能相对应的是复杂的运行环境,你需要安装nodejs、然后使用npm安装UglifyJS类库,最后还要编写js...My God,我只是想压缩一下代码而已。
如果你和我一样既希望享受UglifyJS高效率,又苦恼于复杂繁琐的配置,你可以尝试如下方法。在网上有很多在线压缩JS代码的站点,支持UglifyJS也不少,但是只能手动操作,无法批量处理,实用性实在不怎么高。但是如果有站点提供REST API给程序调用,那结果就不同了。
对于UglifyJS在
http://marijnhaverbeke.nl/uglifyjs中就有一个可供程序调用的HTTP API:
引用
UglifyJS compression can be used as an HTTP service by sending a POST or GET request to this URL, with any of the parameters listed below either embedded in the URL, or in an application/x-www-form-urlencoded request body. The response body will contain the compressed code in case of a successful request, or an error message when returning an error HTTP status code.
code_url
A URL pointing at a JavaScript file to compress. Only the http: and https: protocols are supported. Invalid or errorring URLs will be ignored. This parameter can be given multiple times to concatenate the scripts at those locations together.
js_code
JavaScript code passed directly inside the request. Both this parameter and code_url can be given, in which case the code passed in js_code will end up after the code from URLs.
utf8
Defaults to off, can be passed (with any value) to allow non-ascii characters to appear in the output.
download
When given, this should contain a filename. The server will add a Content-Disposition header to the response, which causes typical browsers to download the response under the given filename.
通过这个API,就可以使用任意的编程语言进行文件夹批量压缩JS的操作了。下面是我用PHP写的调用API批量压缩的小脚本:
<?php
set_time_limit(0);
$fromdir="E:\\wamp\\www\\wopop20\\script";
$todir="D:\\cscript";
compressDir($fromdir,$todir);
echo "success";
function compressDir($fromdir,$todir){
if ($handle = opendir($fromdir)) {
if(!is_dir($todir)) mkdir($todir, 0777, true);
while (false !== ($file = readdir($handle))) {
if ($file != "." && $file != "..") {
$absolutefilename=$fromdir."\\".$file;
if(is_file($absolutefilename)&&preg_match('/\.js$/',$file)){
// echo $absolutefilename,'<br>';
$str=compressJS($absolutefilename);
file_put_contents($todir."\\".$file, $str);
}elseif(is_dir($absolutefilename)){
compressDir($absolutefilename,$todir."\\".$file);
}
}
}
closedir($handle);
}
}
function compressJS($filename){
$url="http://marijnhaverbeke.nl/uglifyjs";
$filecontent=file_get_contents($filename);
static $ch;
// echo $filecontent;
if(empty($ch)){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPGET, false);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
}
$data=array('js_code'=>$filecontent,'utf8'=>'1');
curl_setopt($ch, CURLOPT_POSTFIELDS,http_build_query($data));
$compresstext=curl_exec($ch);
// curl_close($ch);
if(!empty($compresstext)){
return $compresstext;
}
echo "compress {$filename} failed";
return false;
}
?>