瀏覽器端緩存的一個小問題及解決方案


瀏覽器的緩存行為可以提高網頁的加載速度,但有時也會帶來一些困擾。當用jQuery的get方法異步調用服務端資源的時候,瀏覽器會把調用結果進行緩存,拿不到實時的數據影響代碼的邏輯實現,這種情況最簡單的解決方法是在請求的鏈接后加一個隨機數參數,或者用jQuery的ajax方法並設置cache為false。

但上面兩種總感覺不太完美,項目中大量的使用了ajax,每一個都加一個隨機參數,想想都蛋疼;使用$.ajax並設置cache為false的方式,多少有些繁瑣,而且難免有開發人員忽略這個問題使用了$.get引起bug。

於是決定使用jQuery.ajaxSetup()方法,全局禁用瀏覽器端緩存。在一個全局的js腳本中增加以下代碼:

 $.ajaxSetup({ cache: false });

新問題隨之而來,這種方式不僅禁用了一般請求的緩存,也禁用js腳本文件的緩存,項目中的js文件比較多,再加上使用了大量的第三方的前端組件,每次刷新頁面,這些js都要重新加載一遍,頁面響應直接由原來的流暢變為龜速了。

有沒有辦法禁用ajax的緩存,保留腳本文件的緩存呢?

在jQuery官方文檔上找到了這個方法 jQuery.ajaxPrefilter,可以對不同請求類型分別進行配置,於是可以全局禁用緩存,然后針對script開啟緩存,最終代碼如下:

$.ajaxSetup({ cache: false });
$.ajaxPrefilter('script', function (options) { options.cache = true; });

對於腳本的緩存,還有一個問題需要注意,如果瀏覽器緩存了該腳本,而服務端有修改了這個腳本,可能會引起一些錯誤。對腳本文件的url加一個版本號可以解決這個問題,每次修改了腳本后只需要遞增這個版本號即可。如果使用mvc的Bundle來管理js文件的話就不用考慮這個了,把web.config的開關設置為release之后,Bundle框架會自動處理js文件的版本問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM