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