发现在修改css文件或者js文件重新发布更新公众号后修改的内容没有发生变化,有时又需要手动多刷新几次或者清理微信缓存后才好用,这就造成用户体验不好。
需要一种重新发布后用户可以实时看到最新的功能,想到一种增加版本号来解决微信缓存问题,编写一个工具类可以在CSS或者JS引用时添加文件最后修改日期的时间戳,这样微信就可以只更新时间戳变化的文件,没有修改的可以继续使用本地缓存的文件,避免不必要的资源请求。
该工具类可以生成一个新的项目文件夹,运行结束后就可以发布了
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.io.FileUtils;
public class UpdateVersion {
// 收集所有的页面文件html
public static List<File> htmlFile = new ArrayList<File>();
public static void main(String[] args) {
updateFile("要修改项目文件夹");
}
/**
* 遍历跟文件夹并过滤目标文件
*
* @param rootFile
* @return
*/
public static List<File> managerFile(File rootFile) {
File[] rootFiles = rootFile.listFiles();
for (File file : rootFiles) {
if (file.isDirectory()) {
if(".idea".equals(file.getName())){
continue;
}
managerFile(file);
} else {
htmlFile.add(file);
}
}
return htmlFile;
}
public static void updateFile(String webRootName){
/*
* 获取项目路径
*/
String webRoot = "D:/test/"; // 原文件根目录
File rootDir = new File(webRoot+webRootName);//根据项目的绝对地址获取文件
if (!rootDir.exists()) {
return;
}
List<File> htmlFile = managerFile(rootDir);// 获取所有的html文件
/*
* 生成全局的版本号(目前我没有使用这种方式,我使用的是每个文件的最后修改时间作为版本号)
*/
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
String versionNum = sdf.format(new Date());
/*
* 循环遍历所有的文件
*/
for (File file : htmlFile) {
String fileName = file.getPath().substring(webRoot.length());
String filePath = "D:/dst/" + file.getParent().substring(webRoot.length());// 生成目标文件目录
/*
* 创建新目录
*/
File fileDir = new File(filePath);
if (!fileDir.exists()) {
fileDir.mkdirs();
}
try {
File targetFile = new File("D:/dst/" + fileName);
/*
* 生成新文件
*/
if (!targetFile.exists()) {
targetFile.createNewFile();
}
if(file.getName().endsWith(".html") && !"index.html".equals(file.getName())){
System.out.println("要修改的文件:"+file.getName());
BufferedReader reader = new BufferedReader(
new InputStreamReader(new FileInputStream(file)));// 读取文件
BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(new FileOutputStream(targetFile)));
String line = reader.readLine();
while (null != line) {
/*
* 给引用的js自动添加版本号,全局版本号
*/
String regEx = "(\\s+<script|<script).*(src=\".*\")";
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(line);
if (m.find()) {
String srcStr = m.group(2);
String dstStr = srcStr
.substring(0, srcStr.length() - 1)
+ "?v="
+ versionNum + "\"";
line = line.replaceAll(srcStr, dstStr);
}
/*
* 给引用的css自动添加版本号,文件修改时间最为版本号
*/
String linkRegEx = "(\\s+<link|<link).*(href=\".*?\")";
p = Pattern.compile(linkRegEx);
m = p.matcher(line);
if (m.find()) {
String srcStr = m.group(2);
System.out.println(" 修改前"+srcStr);
//获取CSS文件,用于获取最后修改时间;targetFileCss.lastModified()获取时间戳
File targetFileCss = new File(webRoot+webRootName+"/" + srcStr
.substring(6, srcStr.length() - 1));
String dstStr = srcStr
.substring(0, srcStr.length() - 1)
+ "?v="
+ targetFileCss.lastModified() + "\"";
System.out.println(" 修改后"+dstStr);
line = line.replaceAll(srcStr, dstStr);
}
/*
* 给引用的img自动添加版本号
*/
String imageRegEx = ".*<img.*(src=\"https:.*?\")";
p = Pattern.compile(imageRegEx);
m = p.matcher(line);
if (m.find()) {
String srcStr = m.group(1);
System.out.println(srcStr);
String dstStr = srcStr
.substring(0, srcStr.length() - 1)
+ "?v="
+ versionNum + "\"";
line = line.replaceAll(srcStr, dstStr);
}
writer.write(line + "\r\n");
line = reader.readLine();
}
reader.close();
writer.close();
}else{
System.out.println("不需要修改的文件:"+file.getName());
FileUtils.copyFile(file, targetFile);
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
}