最近开发webview嵌套开发,遇到资源重载的问题,具体表现在:css缓存强硬,js缓存强硬,无法事实更新静态资源,但若是禁止页面使用缓存策略的话,对服务器的占用比就会提高,访问少的时候,还好,访问量几何上升时,服务器就GG了。
经过多方查找发现除去glup,webpack,node,以及服务器做资源版本之外,并没有一个简单省事的方法,但项目时单纯的html页面,并没有什么框架使用,如若使用打包方式增加版本号更新缓存的话,相比较会麻烦一些,所以自己扣置了个小玩意。
由于script标签更新src之后并不会资源重载,所以使用了标签重新插入,link标签在更新href之后,资源会重新进行加载,所以直接替换路径
废话不多说,直接上代码:
function EditionFn (edition){
if(edition.notUrl){
edition.notUrl = edition.notUrl.split(",")
}else{
edition.notUrl = ["///"]
}
edition.notHtml = edition.notHtml || "///";
edition.isHtml = edition.isHtml || location.pathname;
if(location.pathname.indexOf(edition.notHtml) > -1 && location.pathname.indexOf(edition.isHtml) <0){
return false
}
var COOKIE &#61; document.COOKIE
COOKIE &#61; COOKIE.split(";")
COOKIE.forEach(function(item){
item &#61; item.replace(/\s*/g, "")
var thistime &#61; item.split("&#61;");
COOKIE[thistime[0]]&#61; thistime[1]
})
function loadJS(script){
var src &#61; script;
var script_dom &#61; document.createElement(&#39;script&#39;);
script_dom.src &#61; src;
script_dom.language &#61; &#39;Javascript&#39;;
script_dom.type &#61; &#39;text/Javascript&#39;;
var head &#61; document.getElementsByTagName(&#39;head&#39;).item(0);
head.appendChild(script_dom);
}
var scrUrl &#61; [];
$(&#39;script&#39;).each(function(){
if($(this).attr("charset") &#61;&#61; "utf-8" && $(this).attr("src") && COOKIE.edition && COOKIE.edition !&#61; edition.edition){
var src &#61; $(this).attr("src")&#43; &#39;?v&#61;&#39; &#43; edition.edition;
scrUrl.push(src)
$(this).attr("src","");
}
})
if(scrUrl.length > 0){
scrUrl.forEach(function(item){
var thisType &#61; true;
edition.notUrl.forEach(function(items){
if(item.indexOf(items) > -1){
thisType &#61; false;
}
})
if(thisType){
loadJS(item)
}
})
}
$(&#39;link&#39;).each(function(){
if($(this).attr("type") &#61;&#61; "text/css" && $(this).attr("href") && COOKIE.edition && COOKIE.edition !&#61; edition.edition){
var src &#61; $(this).attr("href")&#43; &#39;?v&#61;&#39; &#43; edition.edition;
var thisType &#61; true;
edition.notUrl.forEach(function(items){
if(src.indexOf(items) > -1){
thisType &#61; false;
}
})
if(thisType){
$(this).attr("href",src)
}
}
})
var times &#61; new Date().getTime() &#43; 7*24*60*60*1000;
if(COOKIE.edition && COOKIE.edition !&#61; edition.edition){
document.COOKIE &#61; "edition&#61;"&#43;edition.edition&#43;"; expires&#61;"&#43;new Date(times)&#43;";" ;
}else{
document.COOKIE &#61; "edition&#61;"&#43;edition.edition&#43;"; expires&#61;"&#43;new Date(times)&#43;";";
}
}
调用如下&#xff1a;
EditionFn({
edition:edition,
notUrl:"base64.js",
notHtml: &#39;///&#39;,
isHtml: "cssAndjsSession"
})
代表参数如下&#xff1a;
edition: 版本号
notUrl&#xff1a;不重载更新资源&#xff0c;默认为空
notHtml&#xff1a;不重载更新路径&#xff0c;默认为空
isHtml&#xff1a;重载更新指定页面(目前只能指定单个页面&#xff0c;要想多个页面自己去改代码吧)&#xff0c;默认所有页面都会更新
第一次请求时&#xff0c;不会资源重载&#xff0c;只有版本号不符时&#xff0c;会进行资源重载
欢迎各位指教一二