代码改变世界

php处理压缩js文件时积累的一点小经验

2011-12-07 18:14  ☆冷枫☆  阅读(2447)  评论(0编辑  收藏  举报

做web开发的,总是少不了和js打交道。js写的多了总是会出现影响页面加载速度的情况。特别是做富客服端时写了多个js文件,压缩合并文件就显得尤为重要了。

 

可能有不少的朋友会说在线的压缩工具也有很多啊。确实 ,但是如果能够在项目中直接合并压缩多个js,并且压缩完成后生成一个经过整合的新js文件是多么惬意的事情啊。今天因项目需要所以在php中尝试了一把。

 

 前提条件:

  用下面方面压缩合并js文件的,原始的js文件需要安装以下规则进行编码(当然里面的引用路径根据个人情况决定):

       
   

  这样写的好处我想大家都知道,虽然不能解决减少http请求,但是可以简化前端页面js个数,在这里定义一个init()函数前端直接引用这个启动函数即可。另外下面php方法中的正则匹配也是根据这种结构去处理的。

  

 

实现原理:

        即将js文件中的多余的注释、换行、回车、空格等无用字符删除即可。

 

代码示例:

 

//压缩JS文件并替换JS嵌套include文件
function zipJs($js){
    $h1 = 'http://';
    $s1 = '【:??】';    //标识“http://”,避免将其替换成空
    $h2 = 'https://';
    $s2 = '【s:??】';    //标识“https://”
    preg_match_all('#include\("([^"]*)"([^)]*)\);#isU',$js,$arr);    
    if(isset($arr[1])){
        foreach ($arr[1] as $k=>$inc){
            $path = "http://www.xxx.com/";          //这里是你自己的域名路径
            $temp = file_get_contents($path.$inc);            
            $js = str_replace($arr[0][$k],$temp,$js);            
        }    
    }

    $js = preg_replace('#function include([^}]*)}#isU','',$js);//include函数体
    $js = preg_replace('#\/\*.*\*\/#isU','',$js);//块注释
    $js = str_replace($h1,$s1,$js);
    $js = str_replace($h2,$s2,$js);
    $js = preg_replace('#\/\/[^\n]*#','',$js);//行注释
    $js = str_replace($s1,$h1,$js);
    $js = str_replace($s2,$h2,$js);
    $js = str_replace("\t","",$js);//tab
    $js = preg_replace('#\s?(=|>=|\?|:|==|\+|\|\||\+=|>|<|\/|\-|,|\()\s?#','$1',$js);//字符前后多余空格
    $js = str_replace("\t","",$js);//tab
    $js = str_replace("\r\n","",$js);//回车
    $js = str_replace("\r","",$js);//换行
    $js = str_replace("\n","",$js);//换行
    $js = trim($js," ");
    return $js;
}

 

 

将替换后的js生成一个新文件方法:

 

//写入文件,自动判断文件夹是否存在
function writeToFile($file,$s){
    $path = dirname($file);
    if(!is_dir($path)) mkdir($path,0777,true);
    file_put_contents($file,$s);
}

 

 

 测试示例:

$newjs = zipJs(file_get_contents("js/index.js"));

writeToFile("js/indexV2.0.js",$newjs);  

 

      做到这里就能正常的生成一个压缩合并过的js文件了,这个文件中包含所有你需要引用的js文件。经过本人测试在页面中用压缩合并过的js文件能正常处理相应业务逻辑,当然速度就比先前要快多了。