您的位置:首页 > Web前端 > JavaScript

在线压缩javascript --- Google Closure Compiler

2016-04-14 23:33 603 查看
压缩javascript的工具很多,为什么我们要选Google Closure Compiler?
一千个读者有一千个哈姆雷特,没有最好的答案,在这里可以参考下面这篇分析
https://github.com/pandamicro/Javascript-Compressors-Analyse
----------------------------
在这里就只讨论Closure Compiler
首先最核心的代码,利用Closure Compiler在线工具和php自带的cURL库进行压缩。
Closure Compiler提供了3中压缩模式
ADVANCED_OPTIMIZATIONS 高级优化
SIMPLE_OPTIMIZATIONS 简单优化
WHITESPACE_ONLY 仅去除空白
我在这里选择了‘简单优化’模式。
为什么不选择高级优化?
高级优化有更高的压缩率,有更好的运行效率,为什么我不选择它?
因为高级优化有个致命的缺点,会对代码进行更彻底的修改(暴力修改),这种修改有可能会导致代码的不可用,而且很难被用户察觉到。
如果你对高级优化的压缩逻辑不是很熟悉,很难避免写出这种致命代码。
所以我这里还是以简单优化为例啦。
$params = array(
'output_info'=>'compiled_code',
'output_format'=>'text',
'compilation_level'=>'SIMPLE_OPTIMIZATIONS',
'js_code'=>urlencode($script)
);
$ch = curl_init('http://closure-compiler.appspot.com/compile');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,http_build_query($params));
$output = curl_exec($ch);
curl_close($ch);
在开始之前检查输出文件是否可以写入
function prep_output_file(){
if($this->options['output_file']) {
if(file_exists($this->options['output_file']) and is_writeable($this->options['output_file'])){
return true;
}else{
$dirname = dirname($this->options['output_file']);
if (file_exists($dirname)) {
if (is_writeable($dirname)) {
touch($this->options['output_file']);
chmod($this->options['output_file'], 0777);
return true;
}else{
trigger_error("Directory not writable");
return false;
}
}else{
trigger_error("Directory does not exist");
return false;
}
}
}else{
trigger_error("Missing output_file");
return false;
}
}
在压缩之前,通过判断时间来检查代码是否有改变

//$this->options['files'] 是一个存放javascript文件的数组
function check_changed(){
if (file_exists($this->options['output_file'])) {
$output_filemtime = filemtime($this->options['output_file']);
foreach ($this->options['files'] as $js_file) {
if ($output_filemtime < filemtime($js_file)){
return true;
}
}
} else {
return true; // no file
}
return false;
}
添加单个javascript文件或文件夹中所有文件到数组$this->options['files']
function add_script($file){
$file = "{$_SERVER['DOCUMENT_ROOT']}/".(ltrim($file, "/"));
if (file_exists($file) and is_readable($file)) {
$this->options['files'][] = $file;
}else{
trigger_error("Javascript file does not exist: $file");
}
}

function add_directory($dir){
$dir = "{$_SERVER['DOCUMENT_ROOT']}/".(ltrim($dir, "/"));
if(file_exists($dir) and is_dir($dir)){
foreach(new DirectoryIterator($dir) as $file_info) {
if($file_info->isDot() or $file_info->isDir()) continue;
if(strtolower($file_info->getExtension()) == "js") {
$this->options['files'][] = $file_info->getRealPath();
}
}
}else{
trigger_error("Directory does not exist");
}
}
读取被添加的javascript文件
function get_source() {
$script = "";
foreach ($this->options['files'] as $file) {
$script .= file_get_contents($file) . "\n\n";
}
return $script;
}
最后你当然还可以把压缩后的文件放到CDN上去。
完整代码我就不放了,每个人的需求不一样,还是自己动手的好
-------------
貌似google在线的这个功能国内被墙了,这里提供下载版本,需要java再能用噢 https://github.com/google/closure-compiler
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Google javascript 在线