要解決問題,有先決的理論知識先要了解
分兩種:
這種機制下,瀏覽器會先找本地緩存,命中則不會從伺服器請求,並返回200狀態碼,且附有 disk cache 或者 memory cache 字樣
這種機制,強緩存失效後,瀏覽器物培會攜帶緩存標識向伺服器發起請求,伺服器根據標識決定是否使用緩存
首先一點,就是 「瀏覽器會攜帶緩存標識」 ,這個標識是什麼,有兩種
好,原理講了,現在凡是用到nginx的罩寬唯,基本上自動都會實現了ETag和Last-Modified,也就是說,這部分實現機制,已經是默認的!不需要你另加處理。
好,問題來了,如何處理前端SPA應用的緩存問題呢?
現在的SPA要麼Vue要麼React要麼Angular
默認情況下,我們會看到:
即所有資源第一次進,強緩存,第二次進,無意外情況下,會執行協商緩存。
之所以會出現SPA緩存問題,在於index.html是304,那麼客戶端讀取到的,有可能是本地的Not Modified,那麼繼續下去,讀的依舊是本地的disk cache
如何解決問題呢?
這里有個特性,SPA通過webpack打包,一般默認會帶有contenthash值,即當對應文件有改動,這個contenthash值才會改變,進而改變打包出來巧賀的文件名,意味著 只有改變了的文件,文件名才會變,沒有改變的文件是不會變的
如果需要對特殊的文件特殊處理,比如文字類型的文件設置更大的緩存時間或者別的,可以參考上述語法單獨加映射
修改後, service nginx reload 一下,瀏覽器可以看到差別:
index.html一直是200,且從伺服器直接讀取,而所有其他的靜態文件,均從memory or disk cache讀取
好,那麼接下來如果有更新,可以想像,變化的文件有
而由於index.html一直是請求伺服器的,那麼得到的入口js也必然是最新的,意味著如果沒改動的,走本地強緩存,有改動的,會請求最新的,之後請求會走本地強緩存。
Problem solved.
解決前端SPA緩存問題:
⑵ 如何解決前端開發中的緩存問題
function loadFile(arr) {
let now = new Date();
let timestamp = "?t=" + now.getTime();
let head = document.getElementsByTagName("head")[0];
}
$(function(){
var js_arr=["alert.js","alert.css"];
loadFile(js_arr);
});現在的大多數瀏覽器都有緩存機制,目的是減少客戶端的訪問次數,減輕伺服器的壓力。但是在開發工程中或者是版本更新過程中,緩存機制的存在會使得程序版本已經更新,但是效果不能出現的狀況,需要開發人員頻繁的清除緩存,並不友好,特此總結以下幾種方式(以谷歌為例),僅供參考,如有雷同,不甚榮幸。
1.對於開發者來說,只需要關閉瀏覽器緩存就可以了。步驟是:瀏覽器右鍵打開檢查,找到network,下邊有Disable cache選項,只要將其打勾即可
2.開發者可以關閉緩存,但是並不能要求所有用戶都進行此類操作,此時可以在引用的文件之後拼接隨機數或者日期都可以,瀏覽器就會認為是新的請求,而不會使用緩存中的文件,具體如下(只演示大概思路,具體使用,具體修改):
⑶ 能用JS或者前端的什麼方法實現清除瀏覽器緩存嗎
原生JavaScript無法清除瀏覽器緩存,但部分瀏覽器開發了清除緩存的js調用介面
但這些方法只在特定頁面可以調用,只能由瀏覽器廠商製作的頁面調用,其他域名是無法調用這些高級API的
另外,Chrome擴展有清除瀏覽器緩存的API,必須由用戶安裝才可使用,無法在頁面上直接調用
⑷ Asp.Net WEb中怎麼清空緩存
我也想知道- -!!
如果要清空也頁面輸出緩存,可以通過增加幾行代碼實現
Response.Buffer = true;
Response.Expires = 0;
Response.ExpiresAbsolute = DateTime.Now.AddDays(-1);
Response.AddHeader("pragma", "no-cache");
Response.AddHeader("cache-control", "private");
Response.CacheControl = "no-cache";
或者設置<%@ OutputCache %> //具體的設置搜索下吧..
如果是ajax請求的,可以在請求的地址後面加隨機參數
如果是Cache里的緩存,剛看到幾行代碼
IDictionaryEnumerator cacheEnmu = HttpRuntime.Cache.GetEnumerator();
while (cacheEnmu.MoveNext())
{
HttpRuntime.Cache.Remove(cacheEnmu.Key.ToString());
}