現現在,瀏覽器大戰下,各個瀏覽器也是拼了命的提升性能,升級JS解析引擎,更好的處理瀏覽器的頁面緩存,讓用戶的瀏覽體驗更快,佔用更小的PC資源。那麼,問題就出如今JS和CSS緩存,甚至頁面緩存上。至於瀏覽器對頁面的緩存,咱們通常經過在服務端發送頁面的時候設置頁面的生存期,通常幾個小時就能緩解很大的服務器壓力,而且,對瀏覽者來說,本地頁面晚更新幾個小時可能問題也不大。但,問題是,若是頁面發生了更新,可是該頁面連接的JS和CSS文件卻被瀏覽器緩存下來,只有待瀏覽器重啓後才能被刪除,甚至有些瀏覽器重啓後也不主動刪除JS和CSS的緩存文件。這樣頁面與JS和CSS文件就可能發生脫節了,從而出現某種異常現象,甚至頁面崩潰。更坑爹的現象是,如今用戶爲了保存本身的工做(娛樂)狀態,根本就長時間不關機,固然也不關閉瀏覽器。從而使得該問題變得更加嚴重。javascript
這裏提供一種簡單而且經常使用的JS和CSS的緩存解決方案。咱們看新浪微博的首頁。css
該頁面加載完畢後的頭部代碼以下(使用Fiirbug等Ajax調試工具打開):java
注意上面的每一個JS文件和CSS文件都加上了一個時間戳做爲版本號。瀏覽器
即緩存
<script type=」text/javascript」 src=」{JS文件鏈接地址}?version=XXXXXXXX」></script>服務器
或
<link rel=」stylesheet」 type=」text/css」 href=」{CSS文件鏈接地址}?version=XXXXXXXX」>函數
由於瀏覽器緩存的時候是以URL做爲存儲單位(還記得POST頁面的返回按鈕的問題吧?),工具
從而當每次首頁的文件發生更新的時候只須要更改上面的版本號,就能提醒瀏覽器從新下載該文件了。
網上查詢資料,縱觀你們的解決思路總結以下:
一、修改js的文件名。我以爲這樣很麻煩。形成版本系統的維護困難。不建議。除非是徹底ftp。不過每次發佈都修改文件名稱。的確形成維護的時候很茫然,接手的人看到文件名稱變化,會比較難維護
二、路徑後面加時間戳或者隨機數的方式。
通常都是在html模版中使用一個時間戳或者隨機數函數生成一個值。
<script type="text/javascript" src="{{passport_host}}js/common.js?t={{date("Y-m-d")}}" ></script> 今天和明天的值不一樣了,從新請求服務器。
<script type="text/javascript" src="{{passport_host}}js/common.js?t={{time()}}" ></script> 使用時間戳,每刷新一次html,值都不一樣。隨機數也是同樣的
不推薦使用這種方式。
由於這樣的方式致使的問題是,每次刷新html,時間戳都是變化的,url就老是惟一的,因而瀏覽器老是去請求服務端獲取js文件,不會使用瀏覽器本地的緩存。佔用帶寬,影響速度
三、路徑後面加js的版本號。這樣是業界比較成熟的作法。
關鍵是這個版本號,怎麼作版本? 難道真的歸入版本系統裏面去?不是的。我忽然靈感來,想到一種程序員本身控制的辦法。
本身主動加時間,若是本次發佈,修改了哪幾個js文件。那麼就在後面加上一個時間點:年月日
若是一天會發布屢次對js文件的修改,那麼程序員還要精確點。年月日時分秒便可。
以下:
<script type="text/javascript" src="/js/common.js?time=20150518" ></script>
我去看了一下淘寶,發現也是這樣一種方式額,不知道對不對?
以下:
15年8月12日補充:
公司有好幾千萬註冊會員,因而第三方應用使用咱們網站會員賬號實如今第三方網站登陸,須要設計oauth2.0受權的平臺,因而須要參考微博的oauth體制。
無心中發現他們的css也是使用年月日來控制
進一步思考:
這種加時間方法是可行。。不是系統生成的時間,不是全部js文件都加。
是否是能夠進一步考慮一種辦法,用程序來進行開關呢?
本身勾選。若是這個文件修改了。那麼就設置爲更新。模版中判斷,就根據這個開關,把時間戳自動打上去?
不過這樣子以爲不必。由於還沒到那麼重大。其實初期,徹底能夠程序手動把日期打上去便可了。
總結思路:
js文件的內容修改了,能夠加個t參數代表一下日期,用這個日期來做爲版本號,看到日期也能知道是哪天發佈的。
沒有修改js文件根本就不用修改日期。
實踐:
<script type="text/javascript" src="{{passport_host}}js/common.js?t=20150622" ></script>
若是下一次修改了這個js文件,那麼發佈的時候,就修改日期
<script type="text/javascript" src="{{passport_host}}js/common.js?t=20150628" ></script>
沒有修改的js文件,保留原來的值不動便可。