我得到一個js來監控網絡廣告。由於瀏覽器緩存,當我更新js在服務器端,客戶端js不會立即刷新。如何強制刷新客戶端JS一旦我更新服務器端的JS?
p.s.添加版本號策略在我的情況下是沒有用的。
我得到一個js來監控網絡廣告。由於瀏覽器緩存,當我更新js在服務器端,客戶端js不會立即刷新。如何強制刷新客戶端JS一旦我更新服務器端的JS?
p.s.添加版本號策略在我的情況下是沒有用的。
您可以使用HTTP的cache-control mechanisms來控制瀏覽器的緩存。
當提供JS文件的副本時,在響應中包含一個ETag和/或Last-Modified標題。還包括「Cache-Control:必須重新驗證」標題。這告訴瀏覽器它必須每次都檢查服務器,並且它可以在將來的請求中發送一個If-None-Match和/或If-Modified-Since標頭,以請求服務器僅在發生更改時才發送文件。
如果你想避免瀏覽器與服務器每次檢查的負擔,併爲改變不會立即生效沒關係,你還可以包括Date頭部與當前時間和Expires報頭組到未來的某個時刻 - 也許是12或24小時。這允許瀏覽器在必須重新檢查服務器之前,在指定的時間內使用其緩存副本。
HTTP的緩存控制功能非常強大,但有很多細微差別,例如中間緩存的控件(例如其他系統,您的服務器和用戶的瀏覽器之間的)。您需要全面閱讀caching in HTTP,而不僅僅是我提到的具體標題字段。
簡單策略 - 將版本號作爲查詢字符串添加到您的js文件中,並更改編號。這將導致瀏覽器再次讀取您的js文件 -
<script src="mysource.js?version=123"></script>
無論何時更改服務器上的腳本,也更改HTML此版本號。或者更好的是,每次請求此腳本時,都應用一個隨機數作爲version
的值。
這個策略不能用於我的情況。我的js被不同的項目使用,這個策略意味着一旦我更新了我的js,一羣人必須更新他們的代碼,它的代價太大了。謝謝。 – Allerson
@Allerson:可能沒有。使用腳本的其他人可以附加一個隨機數作爲版本值。這樣,每次請求腳本時,都會被請求一個新值(如果這個數字真的很大,那麼產生兩次隨機數的機會非常低)。所以他們不需要手動做任何事情。這是一些JavaScript框架(即Sencha Touch)加載其JS組件的方式。 –
一個新問題:因爲我們追加一個隨機數作爲版本值,這意味着js不能被緩存,我們的服務器會收到更多的請求。這個js將被要求2000萬次以上,而且我們只有3個服務器。這樣,壓力會很大。 – Allerson
您可以通過更改文件的名稱來完成此操作。添加一些版本號(可能與參數類似,例如用於PHP的filename.js?v=time();
),或者在文件名末尾添加一些隨機數。
其實我不確定你是否可以強制客戶端刷新這種類型的文件。但是當更改文件名時,您將強制瀏覽器獲取最新版本。
非常感謝。 – Allerson