其中:
緩存是否過時參考Cache-Control, Expires
緩存是否有效參考Last-Modified,Etaghtml
從流程中咱們能夠發現webpack
綜上所訴:咱們可讓資源請求變成200 from cache的狀態,以提升性能。在資源發生變更時,能夠利用更改文件名的方法從新獲取,如今不少的打包框架都支持這種方式,好比gulp,webpack,fis3等nginx
Cache-Controlweb
HTTP1.1中實現。用來控制文件在本地緩存的有效時長。共有如下屬性值:gulp
Expires
HTTP1.0的屬性,用來指名文件的過時事件,是一個絕對的時間點。因爲服務器事件和客戶端事件可能存在不一致的狀況,因此以後在HTTP 1.1中Cache-Control添加了max-age屬性
。
Last-Modified
Last-Modified是標識文件在服務器上的最新更新時間。下次再次獲取的時候,若是緩存已通過期,則請求頭部會帶上If-Modified-Since字段給服務器,服務器根據該字段和文件的更新事件進行對比,一致則返回304, 不一致將對應文件做爲response返回瀏覽器
ETag
Etag由服務器端生成,客戶端經過If-Match或者說If-None-Match這個條件判斷請求來驗證資源是否修改,常見的是使用If-None-Match。緩存
參考:https://blog.csdn.net/lydia88...服務器
用戶點擊刷新:瀏覽器發送Cache-Control:max-age=0 給瀏覽器網絡
手動刷新頁面(F5),瀏覽器會直接認爲緩存已通過期(可能緩存尚未過時),在請求中加上字段:Cache-Control:max-age=0,發包向服務器查詢是否有文件是否有更新。
強制刷新頁面(Ctrl+F5),瀏覽器會直接忽略本地的緩存(有緩存也會認爲本地沒有緩存),在請求中加上字段:Cache-Control:no-cache(或 Pragma:no-cache),發包向服務從新拉取文件。框架
在默認的nginx配置下(去掉了Etag),第一次頁面訪問的時候,返回200 OK,請求的Cache-Control是max-age=0, 返回的Last-Modified 是對應文件的最後修改日期。對應的content-Length是10027
點擊刷新後,發送請求的時候,帶了If-Modified-Since字段,服務器對比If-Modified-Since的值和文件的最後修改日期,二者同樣,因此返回了304 Not Modified
請求的大小是158B,已經不多了,可是,若是連請求都不用,直接200 from-cache就更好了
nginx配置expires
location / { expires max; etag off; root html; index index.html index.htm; }
重啓nginx
nginx -s reload
第一次請求
Response 頭部的Cache-Control 變成max-age=315360000,Expires變成了2037年
第二次請求(瀏覽器新開一個tab請求)
完成配置