fetch 不自动去重,需通过三层缓存策略避免重复请求:浏览器级 http 缓存(靠 cache 选项和响应头)、内存级 promise 缓存(复用同一 url 的 promise 实例)、应用级数据缓存(localstorage + ttl)。

Fetch 本身不自动去重,但配合缓存策略能有效避免重复请求——关键不在“拦住请求”,而在于“让重复请求不发出去”或“发出去也立刻返回缓存”。核心思路分三层:浏览器级 HTTP 缓存、内存级 Promise 缓存、应用级数据缓存。
用 cache 选项控制请求行为
Fetch 的 cache 配置项直接干预浏览器是否走网络,适合明确控制刷新逻辑的场景:
- cache: 'no-store':完全禁用缓存,每次都是全新请求(等价于手动加时间戳参数)
- cache: 'reload':强制跳过本地缓存,发起新请求(适合用户点“刷新”按钮)
- cache: 'only-if-cached':只读缓存,不发网络请求;若缓存不存在,请求失败(适合离线兜底)
- cache: 'default':遵循 HTTP 响应头(如 Cache-Control),最常用
用 Promise 缓存实现“同一 URL 只 fetch 一次”
当多个组件/函数同时调用 fetch('/api/config'),靠浏览器缓存无法阻止并发请求;此时需在 JS 层缓存 Promise 实例:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 用 ??= 操作符初始化单例 Promise,后续调用直接复用已触发的 Promise
- 成功或失败结果都会被缓存,避免重复请求和状态不一致
- 适合配置类、权限类、特征开关等低频变更、高并发读取的接口
用 localStorage + 过期时间做数据层缓存
对需要跨页面、跨会话复用的数据(如用户偏好、静态字典),可结合本地存储与 TTL 策略:
- 请求前先查
localStorage,命中且未过期则直接返回 - 请求成功后,把数据 + 当前时间戳 + 过期毫秒数一起存入
- 生成 key 时包含 method、url、参数序列化结果,确保不同请求互不干扰
配合服务端响应头实现长效缓存
前端缓存效果高度依赖服务端配置。关键响应头要设对:
- Cache-Control: public, max-age=3600:资源可被 CDN 和浏览器缓存 1 小时
- Cache-Control: immutable:搭配哈希文件名使用,告诉浏览器该资源永不变化
- ETag 或 Last-Modified:启用协商缓存,强缓存失效后可 304 响应,省流量不省时间
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










