zoukankan      html  css  js  c++  java
  • Ant 执行 YUICompressor

     

    Ant 执行 YUICompressor 任务压缩 JavaScript 和 CSS 文件,解决中文乱码问题,增加源文件字符编码集设定

    标签: javascriptantcss任务encodingnull
     分类:
     
    发布 JavaScript 的时候,无论从代码保护还是提高性能角度,都应该对代码进行压缩,去除重叠的空白分隔符,混淆变量。雅虎交互(YUI)提供了非常强大的压缩工具,对 .js 文件和 .css 文件都有效。这里所说明的情况,是用 Ant 直接启动压缩任务。

    首先,需要准备二个 .jar 文件,分别是 YUIAnt.jar 和 yuicompressor-2.4.x.jar 。本帖发表日期是 2012-4-5 周四,最新版是 yuicompressor-2.4.7 。
    YUIAnt.jar  下载地址 http://www.ubik-ingenierie.com/miscellanous/YUIAnt/
    yuicompressor-2.4.x.jar 下载地址 http://www.julienlecomte.net/yuicompressor/ 

    在 Ant 的构建过程描述文件(build.xml)中,可以参考如下例子来引入。

    [html] view plain copy
     
     print?
    1. <property name="dir.lib.yuicompress" value="lib"/><!-- 存放 YUI Compress 二个 .jar 文件的目录 -->  
    2. <property name="dir.build.js" value="dist/webapp/js"/><!-- 存放压缩过的 JavaScript 文件目录 -->  
    3. <property name="dir.build.css" value="dist/webapp/css"/><!-- 存放压缩过的 CSS 文件目录 -->  
    4. <property name="dir.src.js" value="web/js"/><!-- JavaScript 源文件目录 -->  
    5. <property name="dir.src.css" value="web/css"/><!-- CSS 源文件目录 -->  
    6.   
    7. <path id="path.build.classpath.yuicompress">  
    8.     <fileset dir="${dir.lib.yuicompress}">  
    9.         <include name="yuicompressor-2.4.2.jar"/>  
    10.         <include name="YUIAnt.jar"/>  
    11.     </fileset>  
    12. </path>  
    13.   
    14. <target name="compres-js-css" description="压缩 .js 和 .css 文件">    
    15.     <taskdef name="compress" classname="com.yahoo.platform.yui.compressor.YUICompressTask">  
    16.         <classpath refid="path.build.classpath.yuicompress"/>  
    17.     </taskdef>  
    18.     <compress linebreak="150" warn="false" munge="yes"  
    19.             preserveallsemicolons="true" outputfolder="${dir.build.js}">  
    20.         <fileset dir="${dir.src.js}">  
    21.             <include name="**/*.js"/>  
    22.         </fileset>  
    23.     </compress>  
    24.     <compress linebreak="150" warn="false" munge="yes" charset="UTF-8"  
    25.             preserveallsemicolons="true" outputfolder="${dir.build.css}">  
    26.         <fileset dir="${dir.src.css}">  
    27.             <include name="**/*.css"/>  
    28.         </fileset>  
    29.     </compress>  
    30. </target>  

    其中 <compress> 标签的 charset 参数的含义是指定输出文件的字符编码集。原版存在无法以指定字符编码集读取源文件的问题。所以我对此(com.yahoo.platform.yui.compressor.YUICompressTask)进行了改造。此改造方法为原创,经测试无误。

    其实,原先的设计根本就没有考虑到源文件字符编码集的问题。首先我们为 <compress> 标签增加 encoding 这个属性,用来指定源文件的字符编码集。然后在读取文件的时候,用这个 Ant 构建文件中指定的 encoding 来打开文件输入流。所有改造都只针对 com/yahoo/platform/yui/compressor/YUICompressTask.Java 这一个文件。看了源文件,发现雅虎源代码的水平真是太不考究了……空格和 Tab 混用,行尾多余空白也不消除,空行也没有规范,注释也不指名调用顺序……不感叹了,下面是改写方法。

    首先,要改变最开始的 import 部分。
    原先的程序:

    [java] view plain copy
     
     print?
    1. import java.io.FileOutputStream;  
    2. import java.io.FileReader;  
    3. import java.io.IOException;  
    4. import java.io.InputStream;  
    5. import java.io.OutputStream;  
    改为无误:
    [java] view plain copy
     
     print?
    1. import java.io.FileOutputStream;  
    2. import java.io.IOException;  
    3. import java.io.InputStream;  
    4. import java.io.InputStreamReader;  
    5. import java.io.OutputStream;  

    第二,属性确认方法要增加对 encoding 未指定的支持,并根据 YUI 官方的提议,修改 charset 默认值得逻辑。在 validate() 方法中修改。
    原先的程序:

    [java] view plain copy
     
     print?
    1. /** 
    2.  *  
    3.  */  
    4. private void validate() {  
    5.     if(charset==null)  
    6.     {  
    7.         charset = System.getProperty("file.encoding");  
    8.     if(charset == null)  
    9.     {  
    10.         charset = "UTF-8";  
    11.     }  
    12.     }  
    13.   
    14.     this.munge = (this.munge != null) ? munge : Boolean.FALSE;  
    15.     this.lineBreak = (this.lineBreak==null) ? new Integer(-1) : this.lineBreak;       
    16. }  
    改为:
    [java] view plain copy
     
     print?
    1. /** 
    2.  * Set attribute default value. 
    3.  * Modified by Shane Loo Li at 2012-4-4 Wednesday 
    4.  */  
    5. private void validate() {  
    6.     if (this.charset == null)  
    7.     {  
    8.         //this.charset = System.getProperty("file.encoding");  
    9.         /* 
    10.          * Modified by Shane Loo Li at 2012-4-5 Thursday. 
    11.          * In YUI Compressor 2.4.7, The development team think that 'UTF-8' is better than local 
    12.          * charset for the output file. 
    13.          */  
    14.         this.charset = this.charset != null ? this.charset : "UTF-8";  
    15.     }  
    16.     if (this.encoding == null)  
    17.     {  
    18.         this.encoding = System.getProperty("file.encoding");  
    19.         this.encoding = this.encoding != null ? this.encoding : "UTF-8";  
    20.     }  
    21.     this.munge = (this.munge != null) ? munge : Boolean.FALSE;  
    22.     this.lineBreak = (this.lineBreak==null) ? new Integer(-1) : this.lineBreak;  
    23. }  
    其中三目运算符优先级低于比较运算,高于赋值运算,刚好不用加括号。

    第三,源文件 185 行是打开源文件以读取,原来是这么写的:
    [java] view plain copy
     
     print?
    1. if(inputFile.getAbsolutePath().equals(outputFile.getAbsolutePath()))  
    2. {  
    3.         log("Input and Output file are the same, creating a copy");  
    4.         tempFile = File.createTempFile("temp",   
    5.             inputFile.getName().substring(inputFile.getName().lastIndexOf(".")));  
    6.         log("Copying "+inputFile.getAbsolutePath() + " to " + tempFile.getAbsolutePath());  
    7.     copy(inputFile, tempFile);  
    8.     reader = new BufferedReader(new FileReader(tempFile));  
    9. }  
    10. else  
    11. {  
    12.     reader = new BufferedReader(new FileReader(inputFile));  
    13. }  
    改为:
    [java] view plain copy
     
     print?
    1. if(inputFile.getAbsolutePath().equals(outputFile.getAbsolutePath()))  
    2. {  
    3.     log("Input and Output file are the same, creating a copy");  
    4.     tempFile = File.createTempFile("temp",   
    5.             inputFile.getName().substring(inputFile.getName().lastIndexOf(".")));  
    6.     log("Copying "+inputFile.getAbsolutePath() + " to " + tempFile.getAbsolutePath());  
    7.     copy(inputFile, tempFile);  
    8.     // Modified by Shane Loo Li a 2012-4-4 Wednesday to support different source file charset.  
    9.     reader = new BufferedReader(new InputStreamReader(new FileInputStream(tempFile), this.encoding));  
    10.     //reader = new BufferedReader(new FileReader(tempFile));  
    11. }  
    12. else  
    13. {  
    14.     // Modified by Shane Loo Li a 2012-4-4 Wednesday to support different source file charset.  
    15.     reader = new BufferedReader(new InputStreamReader(new FileInputStream(inputFile), this.encoding));  
    16.     //reader = new BufferedReader(new FileReader(tempFile));  
    17. }  
    这么更改是因为 FileReader 不提供用指定字符编码集读取,所以要换成别的打开方式。

    第四,在文件前边有对象成员变量声明,增加
    [java] view plain copy
     
     print?
    1. private String encoding;  

    在文件后边有一组 getter 和 setter ,增加

    [java] view plain copy
     
     print?
    1. /** 
    2.  * @return the encoding 
    3.  */  
    4. public String getEncoding() {  
    5.     return this.encoding;  
    6. }  
    7.   
    8. /** 
    9.  * @param set the source file encoding 
    10.  */  
    11. public void setEncoding(String encoding) {  
    12.     this.encoding = encoding;  
    13. }  

    然后就可以了,编译一下,将编译出来的主 .class 替换掉原来 .jar 包中的 .class 文件,就可以用了。

    以下提供源代码、.class 和 .jar 都改动了的合集。通过 CSDN 下载站上传。
    http://download.csdn.net/detail/shanelooli/4200449

    参考资料
    用 Ant 调用 YUI Compressor : http://www.iteye.com/topic/368724
    源文件字符集写死成 UTF-8 改造: http://moly.iteye.com/blog/718122
  • 相关阅读:
    新浪微博学习的知识点
    新浪项目笔记
    2015年10月20日整理知识
    版本管理工具 (git 或者 svn)
    Coding 代码push/commit/pull/git clone
    fileurlwithpath urlwithstring 这俩有啥区别吗
    正则表达式
    地图
    各种杂项
    实时通讯
  • 原文地址:https://www.cnblogs.com/developer-ios/p/6047262.html
Copyright © 2011-2022 走看看