使用yuicompressor.jar实现对js、css文件的代码压缩

YUI Compressor是一个压缩js、css的工具,压缩后的文件几乎接近原文件的一半大小,该工具下载下来就是一个jar文件,它是用Java开发的,所以在运行的时候也是要依赖于jre环境,本文后面的介绍都是基于本机已经安装jre并且做好了配置的前提。

yuicompressor help

图1:yuicompressor help

上图是我在Windows的命令行中查看到的yuicompressor的一些命令的提示信息,翻译成中文如下:

语法: java -jar yuicompressor-x.y.z.jar [options] [input file]
通用参数:
-h, --help 显示帮助信息
--type <js|css> 指定输入文件的文件类型
--charset <charset> 指定读取输入文件使用的编码
--line-break <column> 在指定的列后插入一个 line-bread 符号
-v, --verbose 显示info和warn级别的信息
-o <file> 指定输出文件。默认输出是控制台。
javascript专用参数:
--nomunge 只压缩, 不对局部变量进行混淆。
--preserve-semi 保留所有的分号。
--disable-optimizations 禁止优化。

使用yuicompressor对js、css文件压缩的时候,首先将yuicompressor的jar文件下来下来,然后放在机器的某个位置(我下载的是yuicompressor-2.4.2.jar,放在的是C盘的根目录下,后面都是以此为例),然后就可以直接使用下面的命令对指定的文件进行压缩:

java -jar c:\yuicompressor-2.4.2.jar --type js --charset utf-8 d:\test01.js -o d:\test-min.js

上面的代码就是实现的对D盘下的test01.js这个文件进行压缩,压缩后保存在原位置,命名为test-min.js。基于这个实现原理,我写了下面的Java代码,这样只要运行该Java代码的main方法,并且修改其中的一些参数,就可以很方便的实现对某个目录下的所有的js、css的递归循环压缩,也可以直接指定文件名进行指定文件的压缩。

代码如下:

import java.io.File;
import java.io.IOException;
import java.util.Date;

/**
 * 工具类:利用yuicompressor来对js、css文件进行压缩
 * 
 * @author YEDWARD
 * 
 */
public class CompressorUtil {
	/**
	 * main方法
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		/**
		 * 压缩时,将这里的:
		 * yuiPath替换成你机器上yuicompress文件的路径; 
		 * filePath替换成要压缩的文件或文件夹路径;
		 * fileType替换成要压缩的文件类型(扩展名),只能是js、css两种类型; 
		 * encoding替换成你要读取文件的编码格式
		 */
		String yuiPath = "c:\\yuicompressor-2.4.2.jar";
		String filePath = "E:\\workspace\\MYAPP\\WebContent\\app";
		String fileType = "js";
		String encoding = "utf-8";

		StringBuilder sb = new StringBuilder();
		File file = new File(filePath);
		if (fileType.equalsIgnoreCase("JS")) {
			compressJS(yuiPath, sb, file, encoding);
		}
		if (fileType.equalsIgnoreCase("CSS")) {
			compressCSS(yuiPath, sb, file, encoding);
		}
		String[] res = sb.toString().split("\n");
		Runtime runTime = Runtime.getRuntime();
		Date startTime = new Date();
		Long count = 0L;
		for (String cmd : res) {
			if (!cmd.trim().equals("")) {
				System.out.println(cmd);
				try {
					runTime.exec(cmd);
					count++;
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		Date endTime = new Date();
		Long cost = endTime.getTime() - startTime.getTime();
		System.out.println(fileType.toUpperCase() + "压缩完成,耗时:" + cost + "ms,共压缩文件个数:" + count);
	}

	/**
	 * 压缩JS文件
	 */
	public static void compressJS(String yuiPath, StringBuilder sb, File f, String encoding) {
		if (f.isDirectory()) {
			File[] files = f.listFiles();
			// 如果某个文件夹是空文件夹,则跳过
			if (files == null) {
				return;
			}
			for (File file : files) {
				compressJS(yuiPath, sb, file, encoding);
			}
		} else {
			String fileName = f.getName();
			if (fileName.endsWith(".js") && !fileName.endsWith("-min.js")) {
				sb.append("java -jar ");
				sb.append(yuiPath);
				sb.append(" --type js --charset ");
				sb.append(encoding + " " + f.getPath());
				sb.append(" -o " + f.getPath().replace(".js", "-min.js"));
				sb.append("\n");
			}
		}
	}

	/**
	 * 压缩CSS文件
	 */
	public static void compressCSS(String yuiPath, StringBuilder sb, File f, String encoding) {
		if (f.isDirectory()) {
			File[] files = f.listFiles();
			// 如果某个文件夹是空文件夹,则跳过
			if (files == null) {
				return;
			}
			for (File file : files) {
				compressCSS(yuiPath, sb, file, encoding);
			}
		} else {
			String fileName = f.getName();
			if (fileName.endsWith(".css") && !fileName.endsWith("-min.css")) {
				sb.append("java -jar ");
				sb.append(yuiPath);
				sb.append(" --type css --charset ");
				sb.append(encoding + " " + f.getPath());
				sb.append(" -o " + f.getPath().replace(".css", "-min.css"));
				sb.append("\n");
			}
		}
	}
}

直接复制上面代码放到编译器中编译运行,并且按需替换掉main方法中的yuiPath、filePath、fileType、encoding即可,压缩需要一段时间,所有的文件都压缩成功后,会出现类似如下图2所示的结果:

压缩完成提示

图2:压缩完成提示

这样就OK了,记得要先下载yuicompressor.jar文件,保存到本机,并且记得修改上面代码中的几个参数,本文后面会提供一个yuicompressor-2.4.2.jar版本,这是目前最新的,建议以后使用时下最新的版本进行压缩。

YUI Compressor-2.4.2下载地址:yuicompressor-2.4.2.zip

下面,愉快的开始压缩吧!

本文标题:使用yuicompressor.jar实现对js、css文件的代码压缩

本文链接:http://yedward.net/?id=316

本文版权归作者所有,欢迎转载,转载请以文字链接的形式注明文章出处。

相关文章