javascript - 請問 chrome 為什么會重復加載圖片資源?
問題描述
如圖所示,發現預加載圖片后,重復調用圖片的時候觸發了重復的圖片資源( 確定圖片資源路徑是一致的 )加載。
在手機端沒有發現這樣的情況,但是在 chrome 上很容易出現類似的情況,每次重復加載的圖片資源不相同。
重復請求一兩次后,便不會再重復請求。
請問是什么原因導致了這樣的情況出現?
html 頭部
<meta name='viewport' content='width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0'><meta name='format-detection' content='telephone=no, date=no, address=no, email=no, url=no'><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'>
stackoverflow 上相同問題:https://stackoverflow.com/que...
問題解答
回答1:http請求是304,實際上這張圖片是從瀏覽器緩存里面加載的
引用: 對 HTTP 304 的理解
最近和同事一起看Web的Cache問題,又進一步理解了 HTTP 中的 304 又有了一些了解。 304 的標準解釋是:Not Modified 客戶端有緩沖的文檔并發出了一個條件性的請求(一般是提供If-Modified-Since頭表示客戶只想比指定日期更新的文檔)。服務器告訴客戶,原來緩沖的文檔還可以繼續使用。 如 果客戶端在請求一個文件的時候,發現自己緩存的文件有 Last Modified ,那么在請求中會包含 If Modified Since ,這個時間就是緩存文件的 Last Modified 。因此,如果請求中包含 If Modified Since,就說明已經有緩存在客戶端。只要判斷這個時間和當前請求的文件的修改時間就可以確定是返回 304 還是 200 。對于靜態文件,例如:CSS、圖片,服務器會自動完成 Last Modified 和 If Modified Since 的比較,完成緩存或者更新。但是對于動態頁面,就是動態產生的頁面,往往沒有包含 Last Modified 信息,這樣瀏覽器、網關等都不會做緩存,也就是在每次請求的時候都完成一個 200 的請求。 因此,對于動態頁面做緩存加速,首先要在 Response 的 HTTP Header 中增加 Last Modified 定義,其次根據 Request 中的 If Modified Since 和被請求內容的更新時間來返回 200 或者 304 。雖然在返回 304 的時候已經做了一次數據庫查詢,但是可以避免接下來更多的數據庫查詢,并且沒有返回頁面內容而只是一個 HTTP Header,從而大大的降低帶寬的消耗,對于用戶的感覺也是提高。 當這些緩存有效的時候,通過 HttpWatch 查看一個請求會得到這樣的結果:
相關文章:
1. javascript - 在top.jsp點擊退出按鈕后,right.jsp進行頁面跳轉,跳轉到login.jsp2. android - 哪位大神知道java后臺的api接口的對象傳到前端后輸入日期報錯,是什么情況?求大神指點3. java - spring-data Jpa 不需要執行save 語句,Set字段就可以自動執行保存的方法?求解4. css3 - 在sublime text里, 如何讓emmet生成的帶前綴css屬性垂直對齊?5. mac連接阿里云docker集群,已經卡了2天了,求問?6. [前端求職必看]前端開發面試題與答案精選_擴展問題7. javascript - js 有什么優雅的辦法實現在同時打開的兩個標簽頁間相互通信?8. javascript - jquery怎么給select option一個點擊時觸發的事件,如圖 如果選擇自定義觸發一個時間?9. css3 - Typecho 后臺部分表單按鈕在 Chrome 下出現靈異動畫問題,求解決10. html - CSS如何處理圖片縮放問題?
