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

来源:互联网 发布:网络挂号:厦门长庚医院 编辑:程序博客网 时间:2024/05/16 18:35

最近网站进行整体升级,有一部分需要放到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 {// 要处理的目录    staticFile dir = new File("W:\\YuiCompressor\\yuicompressor-2.4.7\\build");static int linebreakpos = -1;staticboolean munge = true;staticboolean verbose = false;staticboolean preserveAllSemiColons = false;staticboolean disableOptimizations = false;public static void main(String [] args){try {checkFile(dir);} catch (Exception e) {// TODO Auto-generated catch blocke.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\JSimport osimport reurl = "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 resultdef 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
原创粉丝点击