当前位置: 首页 > news >正文

如果服务端有数据更新,浏览器缓存同时也没有过期,如何直接使用最新的数据

🔹 背景

浏览器缓存分两种:

  1. 强缓存(强制缓存)

    • Cache-Control: max-age=xxxExpires 控制。
    • 命中强缓存时,且 url 没变,浏览器直接用本地缓存,不会请求服务端。
  2. 协商缓存

    • ETag / If-None-MatchLast-Modified / If-Modified-Since 控制。
    • 缓存没过期时,浏览器会发请求到服务器确认资源是否有更新。
    • 如果没更新,返回 304 Not Modified

👉 问题中的情况:强缓存还没过期,但服务端数据已经更新 → 浏览器还在用旧数据。


🔹 解决方案(实际开发中常用)

1. 改变资源 URL(推荐)

url 不变,且命中强缓存,才会直接使用本地缓存。url 一旦改变,就必须需要请求新的数据。

hash 不是浏览器自己更新的,而是构建工具更新的。

  • 文件名加 hash
    构建时给静态资源加版本号,比如:

    main.js → main.8f3d2c.js
    

    这样每次代码更新,URL 就变了,浏览器一定会重新下载。

  • 动态参数

    /api/data?ts=1691234567890
    /api/data?version=2
    

    在请求时加上时间戳或版本号,绕过强缓存。

过程说明:

比如第一次构建时生成:

main.abc123.js

浏览器强缓存这个文件后,下一次再请求相同的 URL /static/main.abc123.js,就直接命中缓存,不会再请求服务器。

当你修改了代码并重新构建时,构建工具会生成一个新的文件:

main.xyz789.js

HTML 模板里的引用也会更新为:

<script src="/static/main.xyz789.js"></script>

因为 URL 变了(文件名不同),浏览器会认为这是一个全新的资源,不会命中旧缓存,从而重新请求最新的文件。

👉 所以,hash 是让浏览器去加载“一个新的 URL”,绕过强缓存。旧的 main.abc123.js 即使被强缓存了也没关系,因为 HTML 已经不再引用它。


2. 控制缓存策略

  • 关键业务数据(如接口数据):不要走强缓存,改为 协商缓存

    Cache-Control: no-cache
    

    👉 意味着每次都会去服务端确认数据是否更新。

  • 静态资源(图片、JS、CSS):走强缓存 + 文件名 hash,保证版本更新时资源刷新。


3. 手动控制请求

  • Ajax/Fetch 请求时,自己加请求头:

    fetch('/api/data', {headers: {'Cache-Control': 'no-cache'}
    })
    
  • 或者在 URL 后拼接时间戳,强制绕过缓存:

    fetch(`/api/data?t=${Date.now()}`)
    

✅ 总结

如果服务端数据更新了,但浏览器强缓存还没过期,浏览器默认还是会用旧数据。
解决办法主要有三种:

  1. 资源 URL 加 hash 或版本号(构建层面解决,最常用)。
  2. 调整缓存策略:关键数据用 no-cache(协商缓存),静态资源走强缓存 + 文件名 hash。
  3. 请求层面手动绕过缓存:加时间戳参数或请求头。

文章转载自:

http://DwGiMBkr.krzrg.cn
http://KtXqejsp.krzrg.cn
http://oQOxUYiw.krzrg.cn
http://L8RdV1We.krzrg.cn
http://XGMEqshv.krzrg.cn
http://PdBNIAFw.krzrg.cn
http://y2rsOs6d.krzrg.cn
http://jV3bVSWW.krzrg.cn
http://tFWT6JIh.krzrg.cn
http://cSVUfavf.krzrg.cn
http://ZgBjy9eZ.krzrg.cn
http://SadqSwQT.krzrg.cn
http://D8NLTh4d.krzrg.cn
http://q9gIixem.krzrg.cn
http://YYuhfcXu.krzrg.cn
http://1A4cxz7Q.krzrg.cn
http://8PvHMcRN.krzrg.cn
http://53GM8eFi.krzrg.cn
http://t8YZVpJY.krzrg.cn
http://muqXzE6e.krzrg.cn
http://TBz5siyP.krzrg.cn
http://IqRxFEvo.krzrg.cn
http://B9qMjaoE.krzrg.cn
http://2nktF2vP.krzrg.cn
http://tIQoYIcr.krzrg.cn
http://ELPV0POI.krzrg.cn
http://KUXcXMpu.krzrg.cn
http://HftGa4cd.krzrg.cn
http://bmeGRlA2.krzrg.cn
http://nURAHpyP.krzrg.cn
http://www.dtcms.com/a/376009.html

相关文章:

  • 使用java编写一个基础的彩票抽奖程序
  • 算法题 Day5---String类
  • 【靶场练习】--DVWA第二关Command Injection(命令执行)全难度分析
  • 什么是Adobe Analytics?数据驱动营销的关键工具​
  • 使用Docker搭建MaxKB智能体平台
  • 【链表】3.重排链表(medium)
  • 免费!离线!免安装!Windows文件夹隐藏工具
  • 联邦学习及其相关创新SCI辅导
  • 466章:Python Web爬虫入门:使用Requests和BeautifulSoup
  • ES8集群部署与使用-zookeeper集群部署与使用
  • Nginx 优化与防盗链配置指南
  • 【数据结构】栈详解
  • 力扣周赛困难-3677. 统计二进制回文数字的数目(需要一定推理的经典二分)
  • 【硬件-笔试面试题-77】硬件/电子工程师,笔试面试题(知识点:滤波电路中截止频率的计算)
  • CUDA编程13 - 测量每个Block的执行时间
  • 仓颉编程语言青少年基础教程:特殊数据类型Unit类型和Nothing类型)
  • AFSim2.9.0学习笔记 —— 3、Wizard平台类型与ArkSIM平台介绍
  • 基于LTE标准的MIMO-OFDM仿真程序
  • 814章:Python Web爬虫入门:使用Requests和BeautifulSoup
  • 硬件开发(5)—ARM汇编
  • leetcode16(盛最多水的容器)
  • 《面向高速三维表面成像的微型深度学习轮廓术》论文总结
  • 基于Java的图书管理系统的设计与实现
  • 【Qt跬步积累】—— 初识Qt
  • 第十九章 使用LAMP架构部署动态网站环境
  • 谷歌nano banana官方Prompt模板发布,解锁六大图像生成风格
  • 转载:VSCODE 关闭文件和资源管理器关联
  • Windows 常用命令使用说明
  • Win_Server远程桌面(RDP)服务调用GPU并提上传输帧率和USB设备重定向
  • 【小呆的随机振动力学笔记】概率论基础