1. 程式人生 > >工作總結之上線版本頁面快取問題

工作總結之上線版本頁面快取問題

路徑後面加js的版本號。這樣是業界比較成熟的做法。(重點)

 

我們的使用者量大,修改js檔案後,使用者反饋登入出現問題。實際上重新整理一下就沒事了。就是因為使用者的瀏覽器使用的還是本地快取的js程式碼。         強制重新整理一般就會重新去伺服器獲取新的js程式碼。但不能讓使用者每次都這樣子去做。     於是我思考一個問題:

如果修改了js檔案中的js程式碼,釋出程式碼到線上後。使用者的瀏覽器使用的還是原來js快取。所以並不會馬上生效。


如何才能讓瀏覽器使用最新的js檔案呢?

很多人想到的第一反應是,在<script type="text/javascript" src="/js/common.js" ></script>在後面加一個時間戳來解決。這樣url地址每次變化,瀏覽器就會請求服務端的js,而不會使用快取。

這樣是解決了。但是會導致瀏覽器每次都要去請求服務端的js檔案。佔用頻寬。作為技術,能不能有種更好的辦法呢?既能避免使用者的瀏覽器每次去請求服務端獲取js檔案。又能在釋出新的js程式碼後,能夠使用最新的js檔案?

據說,在問號後面加版本號,現在很多網站都這麼幹。加個版本號能夠解決問題嗎?       加個版本號,js有個版本。如果每次釋出新的js程式碼。後面就會附加新的版本號。然後使用者載入html頁面的時候。版本號附加在在   <script type="text/javascript" src="/js/common.js?v=99" ></script>   如果沒有修改,那麼版本號還是原來的,這樣做到了:不釋出程式碼的時候,瀏覽器使用的是本地快取。因為版本號沒有變化。   現在疑問是,js的版本號如何生成呢?   生成一個日期嗎?   當天的日期比較好。   這樣的確解決了問題。讓使用者可以使用。   只不過出現一個新的問題來臨了。   js檔案加上當天的釋出日期作為版本號即可了。     有些人針對url後面帶時間戳的做法,會導致瀏覽器每次請求都不會快取,因為每次請求時間都會變化,url就變化了,於是瀏覽器認為是一個新的地址了。   有人針對這個問題的解決辦法是:這裡URI不是靜態,可能會造成某些瀏覽器不會進行快取,可以採用偽靜態配合URL重寫來解決
 
 

 網上查詢資料,縱觀大家的解決思路總結如下:

 

1、修改js的檔名。我覺得這樣很麻煩。造成版本系統的維護困難。不建議。除非是完全ftp。不過每次釋出都修改檔名稱。的確造成維護的時候很茫然,接手的人看到檔名稱變化,會比較難維護

 

2、路徑後面加時間戳或者隨機數的方式。


 一般都是在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檔案,不會使用瀏覽器本地的快取。佔用頻寬,影響速度

 

 

3、路徑後面加js的版本號。這樣是業界比較成熟的做法。

 

關鍵是這個版本號,怎麼做版本? 難道真的納入版本系統裡面去?不是的。我突然靈感來,想到一種程式設計師自己控制的辦法。

自己主動加時間,如果本次釋出,修改了哪幾個js檔案。那麼就在後面加上一個時間點:年月日

如果一天會發布多次對js檔案的修改,那麼程式設計師還要精確點。年月日時分秒即可。

 

 

 如下:

 

<script type="text/javascript" src="/js/common.js?time=20150518" ></script>

 

我去看了一下淘寶,發現也是這樣一種方式額,不知道對不對?

 

如下:

 

 

 

 

 15年8月12日補充:

 

  公司有好幾千萬註冊會員,於是第三方應用使用我們網站會員帳號實現在第三方網站登入,需要設計oauth2.0授權的平臺,於是需要參考微博的oauth體制。

 

  無意中發現他們的css也是使用年月日來控制

 

 

 

進一步思考:

 

這種加時間方法是可行。。不是系統生成的時間,不是所有js檔案都加。

 

是不是可以進一步考慮一種辦法,用程式來進行開關呢?

 

自己勾選。如果這個檔案修改了。那麼就設定為更新。模版中判斷,就根據這個開關,把時間戳自動打上去?

 

不過這樣子覺得沒必要。因為還沒到那麼重大。其實初期,完全可以程式手動把日期打上去即可了。

 

該了什麼js檔案,就給哪個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檔案,保留原來的值不動即可。