當用戶上報一個線上的bug后,開發者修改前端代碼的bug上新后,用戶反映問題依舊存在的問題...這種情況是不是曾經遇到過,這個問題跟瀏覽器的緩存機制有很大關系(強制緩存和協商緩存,這里我就不介紹具體的緩存機制了,網上資料一搜一大把,並且講的很詳細),這里我來說下我們是如何解決這個問題的。。。
最簡單粗暴的辦法就是禁止強制緩存,我們本地開發的時候經常打開chrome這個功能,啟用方法如下,這樣我們每次刷新頁面都是最新的代碼,瀏覽器不會緩存任何靜態資源(不知道這么說是不是真的合理...)

當然這種方法是不使用於生產環境的情況:用戶每次打開頁面都請求所有的資源(假設我們每次不會改所有文件),那每次打開太慢了,這你受的了嗎?(陳震腔)。我們在生產環境是強制緩存和協商緩存並用的,其實大部分資源走協商緩存,只有少數文件禁止強制緩存(其中就包括*.html文件)。
我們知道瀏覽器請求資源是根據url來判定的,如果url變了,就會使本地緩存失效,向服務器請求新的資源,我們現在在使用的前端框架大部分使用webpack構建項目,而webpack中的loader提供針對css和js文件添加hash值得方法,這樣我們在發布新版本后,就會使瀏覽器緩存失效,從而用戶能獲取新的資源...但是index.html文件就悲催了(我沒見過有對html文件添加hash值的...),針對html文件的緩存的策略一般是禁止強制緩存,每次請求都向服務器請求最新的資源(聽說大廠spa基本都是這樣,我看掘金網這樣的...)。然而針對html強制不緩存有兩種方法:
第一種方法就是在html文件中添加meta標簽,告訴瀏覽器強制不緩存此文件。這種方法有一個致命問題就是添加的meta只有瀏覽器認識,如果中間環節恰好有緩存服務器,緩存服務器是會緩存的....,其他的問題就應該瀏覽器的兼容性問題,畢竟這html5的新標簽。
<meta http-equiv=Cache-Control content="no-cache, no-store, must-revalidate"> <meta http-equiv=Pragma content=no-cache> <meta http-equiv=Expires content=0>
第二種方法就是在nginx服務器location配置不緩存html類型的文件。
其實以上方法就可以開頭我們提到的問題了...在最后我貼一個nginx針對一個特定文件的強制不緩存策略配置,我們在項目中遇到了,我們使用了一個dyConfig.js,這個文件暫時沒想到版本控制加hash辦法,這個文件是獨立於代碼的。。。
location / { root html; index index.html index.htm;
if ($request_filename ~* .*dyConfig\.js$) { add_header Cache-Control "private, no-store, no-cache, must-revalidate, proxy-revalidate"; } }
最后,提醒下大家,在location中使用if指令要多加小心,if這個指令是有坑的,nginx官方wiki有介紹:If Is Evil
參考資料:如何解決靜態資源的緩存問題
