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

前端开发中的资源缓存详解

资源缓存用于缓存静态资源,良好的缓存策略可以减少资源重复加载进而提高网页的整体加载速度。

通常浏览器缓存策略分为两种:强缓存和协商缓存,当然还包括 service worker。

  • 浏览器在资源加载时,根据请求头中的 expires 和 cache-control 值来判断是否命中强缓存,命中则直接从本地缓存中读取资源,这一过程不需请求服务器。

  • 如果未命中强缓存,浏览器则会发送请求到服务器,服务器通过 last-modified 和 etag 值来验证资源是否命中协商缓存,若命中,则服务器会将这个请求返回,但是不会返回这个资源的数据,浏览器接收到该请求响应后依然从本地缓存中读取资源。

  • 若强缓存和策略缓存都未命中,那么浏览器将请求服务器获得资源并加载。

强缓存和策略缓存如果命中,都是直接从客户端缓存加载对应资源。但不同点是:强缓存自比较开始至缓存命中不会请求服务端,而策略缓存的是否使用本地缓存这一决定是需要服务端参与的,换言之策略缓存需要请求服务端来完成的。

1. 强缓存

强缓存通过 Expires 和 Cache-Control 响应头实现。两者详细说明如下:

1.1. Expires

中文释义为:到期,表示缓存的过期时间。expire 是 HTTP 1.0 提出的,它描述的是一个绝对时间,该时间由服务端返回。因为 expire 值是一个固定时间,因此会受本地时间的影响,如果在缓存期间我们修改了本地时间,可能会导致缓存失效。

通常表示如下:

Expires: Wed, 11 May 2018 07:20:00 GMT

1.2. Cache-Control

中文释义为:缓存控制。cache-control 是 HTTP 1.1 提出的,它描述的是一个相对时间,该相对时间由服务端返回。

通常表示如下:

Cache-Control: max-age=315360000

该属性还包括访问性及缓存方式设置,列举如下:

  • no-cache 存储在本地缓存取中,只是在与服务器进行新鲜度再验证之前,缓存无法使用。

  • no-store 不缓存资源到本地。

  • public 可被所有用户缓存,多用户进行共享,包括终端或 CDN 等中间代理服务器。

  • private 仅能被浏览器客户端缓存,属于私有缓存,不允许中间代理服务器缓存相关资源。

缓存与使用缓存流程说明如下:

2. 协商缓存

浏览器加载资源时,若强缓存未命中,将发送资源请求至服务器。若协商缓存命中,请求响应返回304状态码。

协商缓存主要使用到两对请求响应头字段,分别是:

  • Last-Modified 和 If-Modified-Since

  • Etag 和 If-None-Match

2.1. Last-Modified 与 If-Modified-Since

Last-Modified 由上一次请求的响应头返回,且该值会在本次请求中,通过请求头If-Modified-Since传递给服务端,服务端通过 If-Modified-Since与资源的修改时间进行对比,若在此日期后资源有更新,则将新的资源发送给客户端。

不过,通过文件的修改时间来判断资源是否更新是不明智的,因为很多时候文件更新时间变了,但文件内容未发生更改。

这样一来,就出现了 ETag 与 If-None-Match。

http://www.xdnf.cn/news/15267.html

相关文章:

  • 面试现场:奇哥扮猪吃老虎,RocketMQ高级原理吊打面试官
  • Spring Ai Alibaba Gateway 实现存量应用转 MCP 工具
  • AI领域的黄埔军校:OpenAI是新一代的PayPal Mafia,门生故吏遍天下
  • 浅谈 Python 中的 yield——生成器对象与函数调用的区别
  • 力扣 hot100 Day42
  • 若依前后端分离Vue3版本接入阿里云OSS
  • 20250712-1-Kubernetes 监控与日志管理-K8s日志管理与维护_笔记
  • Softmax回归(多类逻辑回归)原理及完整代码示例实现
  • 一个基于数据库的分布式锁:乐观与悲观实现
  • 贪心算法题解——跳跃游戏【LeetCode】
  • Windows 用户账户控制(UAC)绕过漏洞
  • python学习笔记【1】对字符串的处理
  • 《Java Web程序设计》实验报告六 JSP+JDBC+MySQL实现登录注册
  • [vroom] 启发式算法(路径评估) | 局部搜索优化引擎 | 解决方案输出解析
  • 自助KTV选址指南与优化策略
  • 系统分析师-计算机系统-输入输出系统
  • 十三、K8s自定义资源Operator
  • 仅27M参数!SamOutVX轻量级语言模型刷新认知,小身材也有大智慧
  • 2025.7.12总结
  • Vue 项目打包部署还存在问题?你知道怎么做吧?
  • JVM回收
  • 内部类 示例
  • 【java安全】springBoot配置文件属性名自定义及属性值加密
  • 【6.1.0 漫画数据库技术选型】
  • 建造者模式(Builder)
  • 【Datawhale AI 夏令营】 用AI做带货视频评论分析(二)
  • 微服务环境下的灰度发布与金丝雀发布实战经验分享
  • 【电脑】硬盘驱动器(HDD)的基础知识
  • 消息认证码(message authentication code)MAC
  • skywalking镜像应用springboot的例子