JS 緩存的問題一直都是我們又愛又恨的東西。也是我們比較頭痛的問題,
一方面為了提高網站響應速度,減少服務器的負擔,和節省帶寬,將需要將靜態資源緩存在客戶端,
但是另一方面,當js 文件有改動的時候,如何快速的將客戶端緩存的js文件都失效,這是非常頭痛的問題。
以至於每次客戶反饋問題的時候,我們第一個解決辦法都是清理瀏覽器緩存。
那么如何解決呢。
1. 直接禁止全部的靜態文件緩存
在html 頭部加上如下代碼:
<META HTTP-EQUIV="pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate">
<META HTTP-EQUIV="expires" CONTENT="0">
這樣所有的js 文件都不會被緩存。這顯然是不可取的。
2.加版本號,在每個js的后面,都加上js 的版本號,
<script src="test.js?v=101"></script>
當某個js文件有變動時,則修改該js文件的版本號。這樣就能解決js 沒有更新時,能夠緩存js文件,有變動的時,也能更新到最新的js的問題。
但是每次js 有變動時,所有引用到改js的地方都得改一遍,這太麻煩了吧。
有辦法:
1.創建公共js文件,將所有需要控制的js文件加入到JSHash 里面
//// js files map 本文件可獨立運行,無需依賴於其他文件
var strSite = window.location.protocol + "//" + window.location.host + "/"; //// 網站主機頭
var JSHash = {
test: { url: strSite + "test.js",type:"javascript", version: "v0001" },
}
function loadJS(keys) {
if (keys) {
for (var i = 0; i < keys.length; i++) {
var jsnode = JSHash[keys[i]];
if(jsnode.type="javascript")
{
document.writeln("<script type=\"text/javascript\" src=\"" + jsnode.url + "?" + jsnode.version + "\"></script>");
}
else
{
document.writeln("<link type="text/css" href=\"" + jsnode.url + "?" + jsnode.version + "\" />");
}
}
}
}
2. 在相關頁面引用js 的方改為:loadJS(["test"]);
這樣每一次更新的時候,只需要調整相關JS的版本號即可。