java+python+YuiCompressor实现多css js的合并与压缩

3 篇文章 0 订阅

最近网站进行整体升级,有一部分需要放到DNS上,对于原有的css和js进行整合,提高访问速度(可能前辈都知道,js和css多了的话会增加网站或者app的请求数量,这样会降低网站的访问速度,最简单的办法就是合并多个js和css文件)。

    我js和css文件有很多,手动合并的话不是被累死,就是被累死,或者被累死。反正我是个懒人,就用程序吧。上网看了一下,YuiCompressor比较不错,所以下载了它的jar包,网络上很多,我就不贴了。

     我的压缩步骤总共分为两步:1.压缩所有js和css文件。2.合并所有js/css文件

     java充当了js的压缩角色,代码如下:

package JavaCompressor;

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.Reader;
import java.io.Writer;

import org.mozilla.javascript.ErrorReporter;
import org.mozilla.javascript.EvaluatorException;

import com.yahoo.platform.yui.compressor.CssCompressor;
import com.yahoo.platform.yui.compressor.JavaScriptCompressor;

public class TestJsZip {
	// 要处理的目录
    static	File dir = new File("W:\\YuiCompressor\\yuicompressor-2.4.7\\build");

	static int linebreakpos = -1;
	static	boolean munge = true;
	static	boolean verbose = false;
	static	boolean preserveAllSemiColons = false;
	static	boolean disableOptimizations = false;


	public static void main(String [] args){
		try {
			checkFile(dir);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public static void checkFile(File file) throws Exception {

		if (file.getName().endsWith(".svn"))
			return;

		if (file.isFile()) {
			jsZip(file);
			return;
		}

		File[] files = file.listFiles();
		if (files == null || files.length == 0)
			return;

		for (File f : files) {
			if (file.getName().endsWith(".svn"))
				return;
			if (file.isFile()) {
				jsZip(file);
				continue;
			}
			checkFile(f);
		}
	}

	public static  void jsZip(File file) throws Exception {
		String fileName = file.getName();
		System.out.println(fileName);
		if (fileName.endsWith(".js") == false && fileName.endsWith(".css") == false) {
			return;
		}
		Reader in = new FileReader(file);

		String filePath = file.getAbsolutePath();
		File tempFile = new File(filePath + ".tempFile");
		Writer out = new FileWriter(tempFile);
		if (fileName.endsWith(".js")) {
			JavaScriptCompressor jscompressor = new JavaScriptCompressor(in, new ErrorReporter() {

				public void warning(String message, String sourceName, int line, String lineSource, int lineOffset) {
					if (line < 0) {
						System.err.println("\n[WARNING] " + message);
					} else {
						System.err.println("\n[WARNING] " + line + ':' + lineOffset + ':' + message);
					}
				}

				public void error(String message, String sourceName, int line, String lineSource, int lineOffset) {
					if (line < 0) {
						System.err.println("\n[ERROR] " + message);
					} else {
						System.err.println("\n[ERROR] " + line + ':' + lineOffset + ':' + message);
					}
				}

				public EvaluatorException runtimeError(String message, String sourceName, int line, String lineSource,
						int lineOffset) {
					error(message, sourceName, line, lineSource, lineOffset);
					return new EvaluatorException(message);
				}
			});

			jscompressor.compress(out, linebreakpos, munge, verbose, preserveAllSemiColons, disableOptimizations);
		} else if (fileName.endsWith(".css")) {
			CssCompressor csscompressor = new CssCompressor(in);
			csscompressor.compress(out, linebreakpos);
		}

		out.close();
		in.close();
		file.delete();
		tempFile.renameTo(file);
		tempFile.delete();
	}

}
这样执行完后,所有文件都已经被压缩,然后我用python执行合并操作(这里提醒一下,合并操作同样可以java来执行,而且很简单,不过个人对python一直情有独钟,所以用python来执行),代码如下:

# coding:utf-8
'''
Created on 2016年1月12日

@author: 马慧超
'''

# C:\MOON\TSTWorkSpace\YuiCompressor\WebContent\JS
import os
import re
url = "W:\\YuiCompressor\\yuicompressor-2.4.7\\build"
def read_entirely(file):
    result = ""
    with open(file, 'r') as handle:
        for line in handle:
            result += line
        return result
def combinor(dir):
    resultJS = ""
    resultCSS = ""
    for root, dirs, files in os.walk(dir):
           for file in files:
               m = re.match('.*\.js', file)
               n = re.match('.*\.css', file)
               if m:
                   resultJS += read_entirely(os.path.join(url, file)) + '\n'
               if n:
                   resultCSS += read_entirely(os.path.join(url, file)) + '\n'
    open("core.js", 'w').write(resultJS)
    open("core.css", 'w').write(resultCSS)
combinor(url)
这样所有的js都被合并到core.js 中了,所有的css都被合并到core.css中了。

【注】:可能有些有心人已经发现了,虽然这种办法实现了压缩和合并,但是会出现一种问题,就是变量重名冲突问题。这个确实是一个大问题,我之前想过用正则表达式找出,但是找出来后并不能确定两者是否在同一命名空间(作用域)下冲突,纠结ing,有经验的朋友可以给我留言分享分享心得。大笑

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值