最近网站进行整体升级,有一部分需要放到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,有经验的朋友可以给我留言分享分享心得。