如果修改了js文件中的js代碼,發布代碼到線上后。用戶的瀏覽器使用的還是原來js緩存。所以並不會馬上生效。
如何才能讓瀏覽器使用最新的js文件呢?
很多人想到的第一反應是,在<script type="text/javascript" src="/js/common.js" ></script>在后面加一個時間戳來解決。這樣url地址每次變化,瀏覽器就會請求服務端的js,而不會使用緩存。
這樣是解決了。但是會導致瀏覽器每次都要去請求服務端的js文件。占用帶寬。作為技術,能不能有種更好的辦法呢?既能避免用戶的瀏覽器每次去請求服務端獲取js文件。又能在發布新的js代碼后,能夠使用最新的js文件?
據說,在問號后面加版本號,現在很多網站都這么干。加個版本號能夠解決問題嗎?
網上查詢資料,縱觀大家的解決思路總結如下:
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文件的內容修改了,可以加個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文件,保留原來的值不動即可。
思考:這樣子是不是很麻煩,有更好的方式嗎。目前我沒想到更好的辦法了。這種方式湊合能用。既能夠按需修改,也能夠保證瀏覽器使用緩存。達到了折衷和平衡。