前端緩存踩坑指南:如何優雅地解決瀏覽器緩存問題?

瀏覽器緩存,配置得當,它能讓頁面飛起來;配置錯了,一次小小的上線,就能把你扔進線上 bug 的坑里。你可能遇到過這些情況:

  • 部署上線了,結果用戶還在加載舊的 JS;
  • 接口數據改了,頁面卻還拿著幾分鐘前的老版本;
  • Service Worker 緩了一大堆東西,結果連新頁面都加載不出來……

一、瀏覽器緩存到底是怎么一回事?

別被“緩存”兩個字騙了,它不只是簡單地“存一下資源”。

瀏覽器的緩存機制其實是分層的,而且各層的策略和觸發條件都不一樣:

1.1 三類緩存存儲層

緩存類型

生命周期

典型用途

Memory Cache

頁面打開期間,關閉即清

JS/CSS 快速復用

Disk Cache

瀏覽器層面,長期有效

HTML、圖片等

Service Worker Cache

自定義、可離線

PWA 場景或定制緩存策略

1.2 兩種核心緩存邏輯

瀏覽器判斷一個資源能不能用緩存,基本分這兩種邏輯:

? 強緩存(直接用,不發請求)

通過 HTTP 響應頭:

Cache-Control: max-age=31536000

或者:

Expires: Wed, 21 Oct 2025 07:28:00 GMT

只要瀏覽器還在有效期內,連請求都不發,直接從緩存取資源。

? 協商緩存(發請求,看是否要更新)

如果沒命中強緩存,瀏覽器會嘗試和服務器協商資源是否變了:

If-None-Match: "e1d3f...etag"

如果服務器返回 304,說明資源沒變,瀏覽器用本地緩存;否則重新拉。


二、常見“緩存坑”還原現場

🧨 場景一:JS 改了,用戶卻還是老頁面

怎么踩的?

前端用了默認打包配置,JS 文件名不變,瀏覽器命中了強緩存,用戶根本沒加載到新版資源。

怎么救?

  • 打包輸出文件名加上 hash,比如:
app.3e9fbd.js

Vite/Webpack 都支持 [contenthash]

  • 確保 HTML 不緩存!因為 HTML 決定了要加載哪個 JS 文件,如果 HTML 沒更新,JS 永遠也更新不了。
Cache-Control: no-store
  • 如果用了 CDN,還要記得清緩存或者上版本號。

🧨 場景二:接口數據老是卡住,怎么刷新都不變?

怎么踩的?

很多時候是 GET 請求被瀏覽器或者中間代理緩存了。

比如:

GET /api/user/info

但服務端沒寫清楚 Cache-Control,瀏覽器自動緩存了響應。

怎么救?

  • 后端返回頭加上:
Cache-Control: no-cache, no-store, must-revalidate
  • 前端請求的時候,給 URL 加時間戳,強制打破緩存:
fetch(`/api/user/info?_t=${Date.now()}`)

🧨 場景三:Service Worker 緩了個寂寞,更新根本不生效

怎么踩的?

你可能用了 Workbox 或手寫了 SW 緩靜態資源,但是沒處理好版本更新流程,結果用戶永遠在舊版本里打轉。

怎么救?

  • 每次構建產出時更新 SW 文件里的版本號:
const CACHE_NAME = 'my-app-v2.0.1';
  • install 階段調用 self.skipWaiting(),跳過等待狀態。
  • activate 階段用 clients.claim() 接管所有頁面。
  • 頁面上監聽 SW 更新事件,給用戶提示“有新版本啦,點我刷新”。

三、前端緩存怎么設計才靠譜?

我們總結一個簡化但實用的資源緩存模型:

資源類型

緩存策略

原因

index.html

no-store

確保每次加載最新入口

JS/CSS(打包產物)

max-age=1y, immutable

文件名唯一,放一年都沒問題

圖片 / 字體

CDN 強緩存

資源大且變化少

接口數據

no-cache

/ 加時間戳

實時性要求高

PWA 離線資源

SW 控制

手動緩存 + 可更新


四、工程化落地建議

別只靠腦子記,我們得把緩存策略寫進構建流程里:

4.1 打包配置文件指紋

Webpack/Vite:

output: {filename: '[name].[contenthash].js'
}

4.2 HTML 注入正確的資源引用

Webpack 用 HtmlWebpackPlugin;Vite 自動處理。

4.3 CDN 清緩存腳本

比如:

npx aliyun-cdn-purge path/to/index.html

或者自動腳本 + Git Hook 聯動清緩存。


五、Service Worker

建議不要上來就用 SW 緩全站資源,除非你非常清楚它的行為。

常用策略:

  • 圖片、靜態文件:Cache First
  • 接口數據:Network First
  • HTML 入口:Network Only
  • 通知/消息等:Network Only + fallback

搭配 Workbox,配置如下:

workbox.routing.registerRoute(/\.(?:png|jpg|jpeg|svg)$/,new workbox.strategies.CacheFirst({cacheName: 'images',})
);

更新版本時,只需要更新緩存名,比如:

const CACHE_NAME = 'v2.0.3';

頁面監聽更新:

navigator.serviceWorker.onupdatefound = () => {// 顯示刷新提示
}

六、調試緩存的幾種方法

  1. Chrome DevTools → Network 里看資源的 Status 是不是 (from disk cache)(from memory cache)
  2. 查看 Response Headers 是否有 Cache-ControlETag
  3. curl -I 直接看 HTTP 響應頭
  4. Service Worker 狀態 → Chrome DevTools → Application → Service Worker

總結

瀏覽器緩存細節極多,尤其是前端更新策略和 CDN/服務器協作時,要明確方向:

  • 明確哪些資源該緩存、緩存多久
  • 更新機制清晰、可控、不怕上線
  • 構建流程自動化,不靠人肉維護

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/78989.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/78989.shtml
英文地址,請注明出處:http://en.pswp.cn/web/78989.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2022年8月,?韓先超對中移信息進行微服務架構原理(Docker+k8s+DevOps+Go等)培訓

2022年8月,?韓先超對中移信息進行微服務架構原理(Dockerk8sDevOpsGo等)培訓 2022年8月,在企業數字化轉型和云原生架構加速演進的背景下, 中移信息技術有限公司特別邀請云原生與DevOps領域專家 韓先超老師&#xff0c…

ComfyUI 學習筆記,案例 6 :FLUX 模型文生圖

背景 剛開始了解 Comfy UI 的時候,隨便找了一個資料,對著這篇 《Flux在ComfyUI里的下載與安裝》 進行操作的,下載了這里面的模型到本機。 玩了幾天,大概對 ComfyUI 有了一點了解,知道了 Flux 這是一個模型&#xff0…

Docker + Watchtower 實現容器自動更新:高效運維的終極方案

文章目錄 前言一、Watchtower 簡介二、Watchtower 安裝與基本使用1. 快速安裝 Watchtower2. 監控特定容器 三、Watchtower 高級配置1. 設置檢查間隔2. 配置更新策略3. 清理舊鏡像4. 通知設置 四、生產環境最佳實踐1. 使用標簽控制更新2. 更新前執行健康檢查3. 結合CI/CD流水線 …

從易發性分析到災后規劃,AI大模型如何顛覆傳統地質災害防治?

地質災害是指全球地殼自然地質演化過程中,由于地球內動力、外動力或者人為地質動力作用下導致的自然地質和人類的自然災害突發事件。在降水、地震等自然誘因的作用下,地質災害在全球范圍內頻繁發生。我國不僅常見滑坡災害,還包括崩塌、泥石流…

第37次CCF第三題--模板展開--stringstream讀取字符串

1 a hello 1 b world 2 c $a $b 1 d good $c 1 a hi 1 e good $c1 a hello 1 b world 2 c $a $b 3 c 1 a hi 3 c將會輸出:10 和 7,對應的變量的值為: helloworld hiworld 需要注意的是,在使用間接賦值語句時,在變量的…

深度學習:智能車牌識別系統(python)

這是一個基于opencv的智能車牌識別系統,有GUI界面。程序能自動識別圖片中的車牌號碼,并支持中文和英文字符識別,支持選擇本地圖片文件,支持多種圖片格式(jpg、jpeg、png、bmp、gif)。 下面,我將按模塊功能對代碼進行分段說明: 1. 導入模塊部分 import tkinter as tk…

Missashe考研日記-day35

Missashe考研日記-day35 1 專業課408 學習時間:3h學習內容: 完結撒花!!今天把OS最后一節的內容學完了,操作系統也算是告一段落了,接下來是計網時間!不過計網我是上學期才學過的,當…

【Bootstrap V4系列】學習入門教程之 組件-下拉菜單(Dropdowns)

Bootstrap V4系列 學習入門教程之 組件-下拉菜單(Dropdowns) 下拉菜單(Dropdowns)一、Overview 概述二、Accessibility 可訪問性三、Examples3.1 Single button 單按鈕3.2 Split button 分割按鈕 四、Sizing 尺寸 下拉菜單&#x…

紅外遙控與NEC編碼協議詳解

在我們日常生活中,電視遙控器、空調遙控器、風扇遙控器,幾乎都離不開“紅外遙控”這項技術。雖然我們每天都在用,但你知道里面是怎么通信的嗎?本篇文章將帶你了解紅外遙控的工作原理,重點解析目前應用最廣泛的紅外編碼…

深入剖析 I/O 復用之 select 機制

深入剖析 I/O 復用之 select 機制 在網絡編程中,I/O 復用是一項關鍵技術,它允許程序同時監控多個文件描述符的狀態變化,從而高效地處理多個 I/O 操作。select 作為 I/O 復用的經典實現方式,在眾多網絡應用中扮演著重要角色。本文…

【Linux系列】目錄大小查看

💝💝💝歡迎來到我的博客,很高興能夠在這里和您見面!希望您在這里可以感受到一份輕松愉快的氛圍,不僅可以獲得有趣的內容和知識,也可以暢所欲言、分享您的想法和見解。 推薦:kwan 的首頁,持續學…

《AI大模型應知應會100篇》第48篇:構建企業級大模型應用的架構設計

第48篇:構建企業級大模型應用的架構設計 摘要:本文將提供企業級大模型應用的端到端架構設計方案,從系統設計原則到技術棧選擇,從高可用保障到安全合規,全面覆蓋構建穩健、可擴展、安全的大模型應用所需的工程實踐。適合…

人協同的自動化需求分析

多人協同的自動化需求分析是指通過技術工具和協作流程,讓多個參與者(如產品經理、開發人員、測試人員等)在需求分析階段高效協作,并借助自動化手段提升需求收集、整理、驗證和管理的效率與質量。以下是其核心要點: 1. …

【戰略合作】開封大學_閥門產業學院+智橙PLM

12月20日,在核電廠閥門系列團體標準啟動會上,開封大學閥門產業學院與橙色云互聯網設計有限公司達成戰略合作。 以平臺賦能行業,讓閥門教育“有的放矢” 會議與會者包括: 開封大學副校長 李治 中國國際科技促進會標準化工作委員…

element-ui日期時間選擇器禁止輸入日期

需求解釋:時間日期選擇器,下方日期有禁止選擇范圍,所以上面的日期輸入框要求禁止輸入,但時間輸入框可以輸入,也就是下圖效果,其中日歷中的禁止選擇可以通過【picker-options】這個屬性實現,此屬…

計算機網絡:深入分析三層交換機硬件轉發表生成過程

三層交換機的MAC地址轉發表生成過程結合了二層交換和三層路由的特性,具體可分為以下步驟: 一、二層MAC地址表學習(基礎轉發層) 初始狀態 交換機啟動時,MAC地址表為空,處于學習階段。 數據幀接收與源MAC學習 當主機A發送數據幀到主機B時,交換機會檢查數據幀的源MAC地址。…

【開源解析】基于Python的智能文件備份工具開發實戰:從定時備份到托盤監控

📁【開源解析】基于Python的智能文件備份工具開發實戰:從定時備份到托盤監控 🌈 個人主頁:創客白澤 - CSDN博客 🔥 系列專欄:🐍《Python開源項目實戰》 💡 熱愛不止于代碼&#xff0…

Windows 環境變量完全指南:系統變量、用戶變量與 PATH 詳解

1. 什么是環境變量? 環境變量(Environment Variables)是 Windows 系統中用于存儲配置信息的鍵值對,它們可以影響系統和應用程序的行為。例如: PATH:告訴系統在哪里查找可執行文件(如 python、j…

詳解RabbitMQ工作模式之工作隊列模式

目錄 工作隊列模式 概念 特點 應用場景 工作原理 注意事項 代碼案例 引入依賴 常量類 編寫生產者代碼 編寫消費者1代碼 編寫消費者2代碼 先運行生產者,后運行消費者 先運行消費者,后運行生產者 工作隊列模式 概念 在工作隊列模式中&#x…

數據結構-非線性結構-二叉樹

概述 /** * 術語 * 根節點(root node):位于二叉樹頂層的節點,沒有父節點。 * 葉節點(leaf node):沒有子節點的節點,其兩個指針均指向 None 。 * 邊(edge)&…