Manfred Hu的技术博客 http://www.cnblogs.com/manfredHu/ Stay hungry,stay foolish.Keep looking,don't settle.

使用Ant和YUICompressor链接合并压缩你的JS和CSS代码

JS代码和CSS代码在上线前要压缩大家应该都是知道的了。记得之前做项目的时候,最后要交差的时候是找了个网站,将JS代码的文件一个一个地复制,粘贴,复制,粘贴。

当时就在想:TMD有没有好一点的方法,劳资不想老是用Ctrl大法。啊啊啊啊啊啊啊啊阿~。最最坑爹的是,有时候将代码复制粘贴的时候手一抖可能就删了点什么东西,手一快又保存了,反正各种坑爹。坑到没朋友。

但是呢,不压缩也不是是吧?


 在写JS代码渐渐多了起来的时候就发现手动压缩根本不是长远的方法。而且JS的代码也开始分块,分功能,分文件写了,尽量去做到复用。

在实际项目中,推荐的是一个html对应一个JS文件和一个CSS文件。这样做可以减少HTTP请求,众所周知,一个HTTP请求的延迟远比下载一个大点的文件大得多。

所以从

程序员来看:我要分文件,分模块写。不然代码太混乱了。(多文件)

客户(网站的使用者)来看:我要良好的用户体验,越快越好。(少文件,文件一多HTTP请求会很多)

这就产生了冲突,不过有需求就有市场,我们聪明的前端攻城狮也有自己的方法解决。——链接文件与压缩大法,也就是标题“使用Ant和YUICompressor链接合并压缩你的JS和CSS代码”。


Ant,中文翻译过来就是“蚂蚁”。嗯嗯这是Apache的一个项目,基于Java的build工具,可以将一些项目的代码文件合并或者复制。具体的东东可以自行Google或者Baidu

官网:http://ant.apache.org/

YUICompressor,雅虎公司的一个代码压缩工具,貌似压缩比例也挺高的。网上一搜一堆的在线压缩网站有的也是这个做得。也是基于Java的。

这两个都是比较简单基本的合并压缩工具了


第一步:配Java环境

这一步就跳过吧,这么简单是吧?Ant和YUICompressor都是基于Java来做得,不懂得自行Google或者Baidu,这里说的是环境变量那里的配置。不是Eclipse里面的。嗯我知道你们想到了-_-!!。估计很多都配过了就不多说了。


第二步:创建项目

Eclipse下创建一个新的项目,Dynamic Web Project。打开Project Explorer窗口(window->show View)

如图所示,我建立了一个AntTest项目,然后在WebContent下面建立了三个文件夹,

  1. build 这个文件夹是用来放链接合并和压缩工具的
  2. build_output 这个文件夹是用来放项目上线的前端代码和页面的
  3. web 这个是用来放一些代码的各个未链接压缩的部分的,平常编辑代码的话就在这个文件夹下面编辑和修改

第三步:创建具体文件

这张图是web文件夹下面的具体的文件模块,其实jQuery有一些模块没用到的话可以拆开加载的。也可以用这种方式加载进去

web/src/main.html文件的结构:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    <!-- asset为项目上线的代码 ,src为源码,可以看的-->
    <link rel="stylesheet" type="text/css" href="./asset/css/all.css" />
</head>
<body>
    <div id="MainContent">
        <!--页面内容-->
        <p>ANT测试页面</p>
    </div>
    <script type="text/javascript" src="./asset/js/all.js"></script>
</body>
</html>

这里的<link>链接到了一个all.css文件,一个<script>链接到了一个all.js文件,然后呢,我用用all.css和all.js再去链接到全部的css文件和js文件

这里两个all文件只是起来集合,或者说是链接的功能。

这里用到了 ./ 这个东西,表示当前路径下面,去掉这个也可以,还有一个 ../ 表示上一级目录,/ 是表示项目根目录的

web/asset/css/all.css:

1 @import '../../src/css/jquery.ui.core.css';
2  
3 /*UI*/
4 @import '../../src/css/jquery.ui.button.css';
5 @import '../../src/css/jquery.ui.dialog.css';
6 @import '../../src/css/jquery.ui.accordion.css';
7 @import '../../src/css/jquery.ui.autocomplete.css';

这里是用到了import去链接CSS文件,当然我们做开发是可以这样玩的。但是最后的合并的文件肯定不会是用import方式的,而是一个或几个比较大的文件。

这里的路径是以all.css文件为起始点去web/src/css文件里面链接的,切记切记!

web/asset/js/all.js:

 1 /*Base*/
 2 document.write('<script type="text/javascript" src="../web/src/js/jquery-1.5.1.js"></script>');
 3 document.write('<script type="text/javascript" src="../web/src/js/jquery.ui.core.js"></script>');
 4 document.write('<script type="text/javascript" src="../web/src/js/jquery.ui.widget.js"></script>');
 5  
 6 /*UI*/
 7 document.write('<script type="text/javascript" src="../web/src/js/jquery.ui.draggable.js"></script>');
 8 document.write('<script type="text/javascript" src="../web/src/js/jquery.ui.droppable.js"></script>');
 9 document.write('<script type="text/javascript" src="../web/src/js/jquery.ui.button.js"></script>');
10 document.write('<script type="text/javascript" src="../web/src/js/jquery.ui.dialog.js"></script>');
11 document.write('<script type="text/javascript" src="../web/src/js/jquery.ui.accordion.js"></script>');
12 document.write('<script type="text/javascript" src="../web/src/js/jquery.ui.autocomplete.js"></script>');

JS代码是通过document.write方式输出到页面然后去加载的。这里因为all.js文件是被main.html执行了,然后main.html根据all.js输出的这些文件去加载的,所以这里的路径是相对于main.html文件的路径。

然后我们运行一下main.html测试一下路径有没有错(这里可以检验一下上面做得是否正确,如果不能加载表示文件路径放错了)

这里可以看到,全部文件都加载了进来。这样就OK了,下面继续链接合并与压缩大计。


第四步:放置工具文件到build文件夹里面

 

这是Ant和YUICompressor的文件夹。直接解压放里面就可以。

Ant的话也要配环境的,比如下面的

ANT_HOME    D:/ apache-ant-1.9.0

path             D:/ apache-ant-1.9.0/bin

classpath      D:/apache-ant-1.9.0/lib

具体的路径放的不一样每台电脑都不同,可以看http://jingyan.baidu.com/article/e2284b2b45d193e2e6118dc6.html或者自行解决。


第五步:设置配置文件build.xml

我们这里是用

  1 <?xml version="1.0" encoding="UTF-8"?>
  2  
  3 <project default="compress" basedir="D:\eclipseWorkSpace\AntTest\WebContent\web" name="core">
  4     <!-- 项目的 web 路径,也就是我们修改代码的那个web文件夹的路径 -->
  5     <property name="path" value="D:\eclipseWorkSpace\AntTest\WebContent\web" />
  6     <!-- 部署的输出路径 也就是项目的链接合并压缩的输出文件夹的路径-->
  7     <property name="targetDir" value="D:\eclipseWorkSpace\AntTest\WebContent\build_output\asset" />
  8     <!-- 源文件路径(src) -->
  9     <property name="code.src" value="src" />
 10     <property name="baseService" value="baseService" />
 11     <!-- !!! YUI Compressor 路径 !!! -->
 12     <property name="yuicompressor" value="D:\eclipseWorkSpace\AntTest\WebContent\build\yuicompressor-2.4.6\yuicompressor-2.4.6\build\yuicompressor-2.4.6.jar"/>
 13          
 14     <!-- ================================= 
 15          target: concat 拼接(合并)文件        
 16     ================================= -->
 17           
 18     <target name="concat" depends="" description="concat code">
 19         <echo message="Concat Code Files Begin!!!" />
 20         <!-- 需要注意这里的拼接顺序depends是优先链接合并的文件,也就是依赖的意思 --><!-- JS -->
 21         <concat destfile="${targetDir}/js/source/all.js" encoding="utf-8" fixlastline="on">
 22             <fileset dir="${code.src}/js" includes="jquery-1.5.1.js" />
 23             <fileset dir="${code.src}/js" includes="jquery.ui.core.js" />
 24             <fileset dir="${code.src}/js" includes="jquery.ui.widget.js" />
 25             <fileset dir="${code.src}/js" includes="jquery.ui.draggable.js" />
 26             <fileset dir="${code.src}/js" includes="jquery.ui.droppable.js" />
 27             <fileset dir="${code.src}/js" includes="jquery.ui.button.js" />
 28             <fileset dir="${code.src}/js" includes="jquery.ui.dialog.js" />
 29             <fileset dir="${code.src}/js" includes="jquery.ui.accordion.js" />
 30             <fileset dir="${code.src}/js" includes="jquery.ui.autocomplete.js" />
 31         </concat>
 32         <!-- CSS -->
 33         <concat destfile="${targetDir}/css/source/all.css" encoding="utf-8">
 34             <fileset dir="${code.src}/css" includes="jquery.ui.core.css" />
 35             <fileset dir="${code.src}/css" includes="jquery.ui.button.css" />
 36             <fileset dir="${code.src}/css" includes="jquery.ui.dialog.css" />
 37             <fileset dir="${code.src}/css" includes="jquery.ui.accordion.css" />
 38             <fileset dir="${code.src}/css" includes="jquery.ui.autocomplete.css" />
 39         </concat>
 40  
 41         <echo message="Concat Code Files Finished!!!" />
 42     </target>
 43  
 44     <!-- ================================= 
 45           target: copy 拷贝文件 
 46          ================================= -->
 47  
 48     <target name="copy_asset" depends="concat" description="copy the asset file">
 49         <echo message="Copy Asset Begin" />
 50         <!-- main.html -->
 51         <copy todir="${targetDir}/../" overwrite="true">
 52             <fileset dir="${path}/" includes="*.html"/>
 53         </copy>
 54         <!-- img *.png -->
 55         <copy todir="${targetDir}/img" overwrite="true">
 56             <fileset dir="${path}/asset/img" includes="*.png" />
 57         </copy>
 58  
 59         <echo message="Copy Asset Finished" />
 60     </target>
 61  
 62  
 63     <!-- ================================= 
 64           target: compress 压缩 js && css  
 65          ================================= -->
 66  
 67     <target name="compress" depends="copy_asset" description="compress code">
 68         <echo message="Compress Code Begin" />
 69  
 70         <apply executable="java" parallel="false" failonerror="true" dest="${targetDir}/js">
 71             <fileset dir="${targetDir}/js/source" includes="*.js"/>
 72             <arg line="-jar"/>
 73             <arg path="${yuicompressor}" />
 74             <arg line="--charset utf-8" />
 75             <arg line="-o" />
 76             <targetfile/>
 77             <mapper type="glob" from="*.js" to="*.js" />
 78         </apply>
 79          
 80         <apply executable="java" parallel="false" failonerror="true" dest="${targetDir}/css">
 81             <fileset dir="${targetDir}/css/source" includes="*.css"/>
 82             <arg line="-jar"/>
 83             <arg path="${yuicompressor}" />
 84             <arg line="--charset utf-8" />
 85             <arg line="-o" />
 86             <targetfile/>
 87             <mapper type="glob" from="*.css" to="*.css" />
 88         </apply>
 89  
 90         <echo message="Compress Code Finished" />
 91  
 92         <echo message="Clean Begin" />
 93  
 94         <!--<delete verbose="false" failonerror="true">
 95             <fileset dir="${path}" includes="${targetDir}/*-o.js" />
 96         </delete> -->
 97  
 98         <echo message="Clean Finished" />
 99  
100     </target>
101 </project>

在命令提示符(CMD)下用ant的指令运行(别告诉我你不会。。。。。),学过Java的应该都懂的,javac嘛,一个道理:

 

其实到这里大概流程就差不多了,但是呢,懒人总有偷懒的方法,上面还要打命令提示符,啊啊啊啊啊啊啊啊~

然后,自己做了个简单的批处理文件。


第六步:创建build.bat批处理文件自动执行ant指令

鼠标右键新建一个txt文件,然后打入

这里build.bat和build.xml是放在同一个路径下的。所以可以这样直接调用指令,如果你想放在别的地方是要改路径的。

然后保存,后缀txt改成bat就可以了。

以后,修改完代码之后按下build.bat键盘F3(Eclipse打开文件快捷键)就可以链接合并压缩你的JS和CSS代码了。

当然,如果你不想压缩只想合并的话呢,把build.xml压缩那块删了就可以了。


上面这样做其实还是有一些小问题的,后台开发人员如果要去设置路径映射那些的话其实是要去build_output文件夹下面做的,因为这个文件夹才是页面真正的地址(代码已被合并压缩)。

记得跟他们说一下就好了。

作者:manfred Hu

博客:http://www.cnblogs.com/manfredHu

本文地址:http://www.cnblogs.com/manfredHu/p/4719606.html

项目分享:http://yunpan.cn/cdPU8mrHYRLrd  访问密码 d1ba

转载请注明出处谢谢!!!

posted @ 2015-08-10 23:05  manfredHu  阅读(1854)  评论(2编辑  收藏  举报
推荐
返回顶部