Java 開發js、css批量壓縮工具
開發這個小工具的緣由是:網上提供的壓縮服務,大部分是單個檔案壓縮,而專案中需要壓縮的檔案太多,一個個的壓縮佔用了太多時間,還是一個手工活,容易出錯。
為什麼需要壓縮?為了快,速度。讓使用者更快的開啟頁面,減少系統網路流量。
網上有yuicompressor-2.4.8.jar包下載,使用命令可以壓縮單個檔案,但我想要的是批量壓縮多個檔案,而yuicompressor包提供了壓縮的類和方法,那我只要讀取需要壓縮的檔案,利用它的壓縮方法進行壓縮就好了
//這是yuicompressor-2.4.8.jar包的使用命令,在 CMD 視窗中使用這個命令可以壓縮檔案
java -jar yuicompressor-2.4 .8.jar myfile.js -o myfile-min.js
開發這個工具要達成的效果是,能打成一個 compressor.jar 包,使用和上面那種簡單的命令完成批量壓縮任務
1.開始新建Spring Boot專案,使用 Maven 在pom.xml中引用
<!-- https://mvnrepository.com/artifact/com.yahoo.platform.yui/yuicompressor -->
<dependency>
<groupId>com.yahoo.platform.yui</groupId>
<artifactId >yuicompressor</artifactId>
<version>2.4.8</version>
</dependency>
<dependency>
<groupId>rhino</groupId>
<artifactId>js</artifactId>
<version>1.7R2</version>
</dependency>
2.建立壓縮類Compressor.java
@Component
public class Compressor {
private static final String encoding = "utf-8";
private static final String[] suffixArray = { ".js", ".css" };
//需要壓縮的資料夾(會壓縮此資料夾下的所有js、css檔案)
@Value("${filePath}")
private String filePath;
static int linebreakpos = 1000;//-1;換行:負數表示不換行
static boolean munge=true;
static boolean verbose=false;
static boolean preserveAllSemiColons=false;
static boolean disableOptimizations=false;
/**
* 壓縮方法
*/
public void compress(){
init(filePath);
}
//初始化,獲取檔案目錄下的所有需要壓縮的檔案 js css
public static void init(String filePath){
Date startTime = new Date();
Long count = 0L;
File file = new File(filePath);
if(file.isDirectory()){
File[] files = file.listFiles();
// 如果某個資料夾是空資料夾,則跳過
if (files == null) {
return;
}
for (File f : files) {
compress(f);
count++;
}
Date endTime = new Date();
Long cost = endTime.getTime() - startTime.getTime();
System.out.println("壓縮完成,耗時:" + cost + "ms,共壓縮檔案個數:" + count);
}
}
//壓縮
public static void compress(File file){
try {
String fileName = file.getName();
String suffix = fileName.substring(fileName.lastIndexOf("."), fileName.length());
List<String> suffixList = Arrays.asList(suffixArray);
if (suffixList.contains(suffix) && !fileName.endsWith("-min" + suffix)) {
Reader in = new InputStreamReader(new FileInputStream(file), encoding);//以UTF-8格式讀取,否則壓縮出來會亂碼
String filePath=file.getAbsolutePath();
File tempFile = new File(filePath+".tempFile");
Writer out = new OutputStreamWriter(new FileOutputStream(tempFile),encoding);
if (fileName.endsWith(".js")) {
//js compressor
JavaScriptCompressor jscompressor = new JavaScriptCompressor(in, new ErrorReporter() {
//壓縮出錯後的操作
@Override
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);
}
}
@Override
public void error(String message, String sourceName,
int line, String lineSource, int lineOffset) {
if (line < 0) {
System.err.println("\n[ERROR] " + sourceName + "-" + message);
} else {
System.err.println("\n[ERROR] " + line + ':' + lineOffset + ':' + sourceName + "-" + message);
}
}
@Override
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")) {
//css compressor
CssCompressor csscompressor = new CssCompressor(in);
csscompressor.compress(out, linebreakpos);
}
in.close();
out.close();
file.delete();
tempFile.renameTo(file);
tempFile.delete();
}
}catch (Exception e){
e.printStackTrace();
}
}
}
3.建立一個啟動類,目的:專案啟動時,執行壓縮方法
/**
* 系統啟動時,執行某方法
* Order 當有多個執行方法時,通過設定value的值來指定執行順序
*/
@Component
@Order(value = 1)
public class MyApplicationRunner implements ApplicationRunner {
@Autowired
Compressor compressor;
@Override
public void run(ApplicationArguments args) throws Exception {
//系統啟動時,執行壓縮方法
//壓縮的使用命令:java -jar compressor.jar --filePath=C:\Users\Desktop\js
compressor.compress();
}
}
4.把專案打成jar包,把它複製出來,改下檔名
使用方法,開啟 Cmd視窗,cd 到此資料夾,使用命令進行壓縮,filePath引數表示需要壓縮的目錄
java -jar yuicompressor.jar –filePath=C:\Users\Desktop\yuicompressor\res
filePath:指要壓縮的目錄,會壓縮此目錄下的所有js、css
測試:在 res 資料夾下放了6個js檔案和一個css檔案,看看壓縮效果,前後對比一下
開啟cmd,使用命令壓縮,壓縮完後,會有列印日誌,顯示壓縮時長和檔案數,如果壓縮報錯也會有日誌
壓縮後,每個檔案都有不同程度的減小,以後專案中的檔案需要壓縮時,拷貝到一個資料夾下,使用命令統一壓縮,方便多了,需依賴java jdk環境
在.Net Framework 4.5中有 System.Web.Optimization Bundle元件,很方便的壓縮合並css,js
在.Net Core中使用 BuildBundlerMinifier 來進行css,js的壓縮合並 ,官網地址
開始想用 Net 的 winform開發一個桌面小工具,打包成 exe檔案,開啟 exe ,選擇一個資料夾,點選壓縮按鈕完成批量壓縮任務,原理是 .net調java 來實現,後面想了想,因在做java開發,就沒有去實現了。