前端性能优化之HTTP缓存
创始人
2025-05-29 20:35:21

前端缓存

前端缓存可分为两大类:HTTP 缓存浏览器缓存

我们今天重点是 HTTP 缓存,下面这张图是前端缓存的一个大致知识点:

前端缓存

HTTP 缓存

首先解决困扰绕人们的老大难问题:

一、什么是HTTP缓存?

HTTP 缓存会存储与请求关联的响应,并将存储的响应复用于后续请求。(MDN)

通俗的讲,HTTP 缓存指的是:当浏览器向服务器发起资源请求时,会首先抵达浏览器缓存,如果浏览器有当前请求资源的有效副本,就可以直接从浏览器缓存中取出资源并返回,不用再重新去服务器中获取了。

常见的 HTTP 缓存只能缓存 GET 请求的资源,对于其他类型的响应则无能为力,所以后续说的请求缓存都是指 GET 请求。

HTTP 缓存都是从第二次请求开始的,第一次请求资源时,服务器返回资源,并在 response headers 头中回传资源的缓存参数;第二次请求时,浏览器会判断这些参数,命中强缓存就直接返回 200,否则就把缓存相关参数添加到 request headers 中传给服务器,服务器判断是否命中协商缓存,命中则返回 304,否则服务器会返回 200 并返回新的资源。

浏览器第一次请求流程图:
第一次请求服务器

注意: 官网文档上用词为 fresh 和 stale,国内的文档上大多都用词为强缓存和协商缓存,此文也如此。

1. HTTP 缓存分类

根据是否需要向服务器重新发起请求来分类,可以分为强缓存协商缓存

注意: MDN上一般按照私有缓存和共有缓存来分来,但以上分类更适合于我们初学者了解缓存相关知识,所以本文按以上方式对缓存进行分类!

下图是强缓存和协商缓存的一些对比:

强缓存与协商缓存对比

1.1 强缓存

强缓存是指在缓存数据未失效的情况下(即 Cache-Controlmax-age 没有过期或者 Expires 的缓存时间没有过期),那么就会直接使用浏览器的缓存数据,而不会请求服务器。

强缓存生效时,HTTP 状态码为 200。

优点:这种方式页面加载速度是最快的,性能也是很好的。
缺点:如果在这期间服务端资源有更新,页面上是拿不到更新后的数据的。 这种情况我们在开发中也是经常遇见的,比如我们修改了页面的某个样式,在页面上刷新了但没有生效,因为走的是强缓存,所以 Ctrl + F5 一顿操作过后就好了。

跟强缓存相关的 header 头属性有(Pragma / Cache-Control / Expires)

强缓存相关的 header 头属性
强缓存流程图:
强缓存

1.2 协商缓存

当以下条件满足一个或多个时:

  1. 当第一次请求时,服务器返回的响应头中没有设置 Cache-Control 和 Expires 字段;
  2. Cache-Control 和 Expires 过期;
  3. Cache-Control 和 Pragma 设置为:no-cache;

那么浏览器第二次请求时,就会与服务器进行协商,与服务端对比判断资源是否进行了更新。

如果服务端资源未更新,则会返回 304 状态码,告诉浏览器当前缓存可继续使用;如果服务端资源有更新,则会返回 200 状态码,并同时返回更新后的资源和缓存信息字段。

与协商缓存相关的字段有 ETag / If-None-Match、Last-Modified / If-Modified-Since,此时请求头与响应头需要成对出现。
在这里插入图片描述

协商缓存流程示意图如下:
协商缓存

二、如何使用 HTTP 缓存?

一般需要缓存的资源有 HTML 页面和其他一些静态资源:

  1. HTML 页面缓存的设置主要是在 标签中嵌入 字段,这种方式只对页面有效,对页面上的资源无效。

    1.1 HTML 页面禁用缓存的设置如下:

    
    
     
    

    2.2 HTML 设置使用缓存如下:

    
    
    
  2. 静态资源的缓存一般是在web服务器上配置的,常用的web服务器有:nginx、apache。具体的配置这里不做详细介绍,大家自行查阅。

三、HTTP 缓存的几个注意点

  1. 强缓存情况下,只要缓存还没过期,就会直接从缓存中读取数据,就算服务端有变化,也不会从服务端获取更新后的数据,这就就会导致无法获取到最新的数据。

    解决的办法有:在修改后的资源加上随机数,确保不会从缓存中读取。

    例如:
    http://www.example.com/common.css?v=110
    http://www.example.com/common.111.css

  2. 尽量减少 304 的请求,因为我们知道,协商缓存每次都会与后台服务器进行交互,所以性能上不是很好,从性能上来看尽量多使用强缓存。

  3. 在 Firefox 浏览器上,使用 Cache-Control: no-cache 是不生效的,其识别的是 no-store。这样能达到其他浏览器使用 Cache-Control: no-cache 的效果,所以为了兼容 Firefox 浏览器,经常会写成 Cache-Control: no-cache, no-store。

  4. 与缓存相关的几个 header 属性:Vary、Date / Age。

    Vary:
    Vary 本身是“变化”的意思,而在 HTTP 报文中更趋于是“vary from”(与。。。不同)的含义,它表示服务端会以什么基准字段来区分、筛选缓存版本。

    在服务端有着这么一个地址,如果是 IE 用户则返回针对 IE 开发的内容,否则返回另一个主流浏览器版本的内容。

    格式:Vary: User-Agent

    知会代理服务器需要以 User-Agent 这个请求首部字段来区分缓存版本,防止传递给客户端的缓存不正确。

    Date / Age:

    响应报文中的 Date 和 Age 字段:区分其收到的资源是否命中了代理服务器的缓存。

    Date 理所当然是原服务器发送该资源响应报文的时间(GMT格式),如果你发现 Date 的时间与“当前时间”差别较大,或者连续F5刷新发现 Date 的值都没变化,则说明你当前请求是命中了代理服务器的缓存。

    Age 也是响应报文中的首部字段,它表示该文件在代理服务器中存在的时间(秒),如文件被修改或替换,Age会重新由0开始累计。

相关内容

热门资讯

八个字的成语励志,奋斗的八字成... 八个字的成语励志目录八个字的成语励志奋斗的八字成语有哪些励志的8字成语八个字的成语励志 志存高...
进口汽车排量税怎么算(进口车辆... 本篇文章极速百科给大家谈谈进口汽车排量税怎么算,以及进口车辆排量税怎么算对应的知识点,希望对各位有所...
三星s6edge怎么更换电池,... 三星s6edge怎么更换电池目录三星s6edge怎么更换电池三星S6 Edge换电池:如何轻松DIY...
侏儒类仓鼠是哪些,侏儒仓鼠种类... 侏儒类仓鼠是哪些目录侏儒类仓鼠是哪些侏儒仓鼠种类仓鼠分多少种侏儒类仓鼠是哪些(侏儒类仓鼠有哪些)侏儒...
什么是BI ?企业数字化的规划... BI技术是使现代企业能够利用数据做出合理,基于事实和可行的决策以改善其运营和利润率的工...
手机上怎么查移动详单,如何查中... 1. 下载并打开中国移动APP。 3. 点击底部导航栏的“分类”。 4. 在“分类”页面...
最近有什么好看的电影吗,最近有... 最近有什么好看的电影吗目录最近有什么好看的电影吗最近有什么好看的电影啊(推荐几部必看的影片)最近有哪...
iphone8p尺寸多大,苹果... iphone8p尺寸多大目录iphone8p尺寸多大苹果8pIus屏幕长宽多少厘米?不是机身尺寸!是...
半夜影院开吗,电影院晚上几点关... 半夜影院开吗目录半夜影院开吗电影院晚上几点关门?凌晨两点多还能进电影院吗西宁凌晨能开的电影院有哪些半...
Python科研绘图——介绍 “在做科研的路上,避免不了制作结果图,像常见的作图软件如Prism&#x...
MySQL查看正在运行的SQL MySQL查看正在运行的SQL 前言 ​ 在安装MySQL的时候会默认初始化几个MySQL运行所需的...
秒杀限制人群,如何设计秒杀服务... 对于秒杀业务,大家应该比较熟悉了。比如,“某商品原价 1299 元&#x...
张国荣是怎么走的,张国荣怎么死... 张国荣是怎么走的目录张国荣是怎么走的张国荣怎么死的 张国荣去世原因张国荣是怎么去世的张国荣是怎么死的...
跨年之夜的说说,关于跨年夜的心... 跨年之夜的说说目录跨年之夜的说说关于跨年夜的心情说说 一个人跨年的伤感说说(精选28句)2022年跨...
三连是什么梗,网络用语三连是什... 三连是什么梗目录三连是什么梗网络用语三连是什么意思?小红书评论三连是什么意思?三连是什么梗 三...
博迪学校怎么招生,西安博迪小学... 博迪学校怎么招生目录博迪学校怎么招生西安博迪小学入学条件是什么教育培训机构如何去招生?博迪学校怎么招...
100天精通Python(可视... 文章目录0. 专栏导读1. 普通折线图2. 网格折线图3. 趋势折线图4. 对比折线图5. 百分比折...
基础和高级的ACL的基础配置和... 基础和高级的ACL的基础配置和原理 需求 如图配置设备的IP地址售后服务部不允许访问财务部服务器&#...
linux入门---gdb的使... 目录标题gdb是什么如何使用gdb打开文件如何查看release和debug的不同正式调试l断点运行...
会计做账步骤是什么,财务做账要... 会计做账步骤是什么目录会计做账步骤是什么财务做账要怎么做账会计做账的步骤一般是怎么样的呢?会计手工做...
大学生可以贷款吗,大学生可以向... 大学生可以贷款吗目录大学生可以贷款吗大学生可以向银行贷款吗在校大学生能贷款么?大学生可以贷款吗 ...
社交新时代,元宇宙结合游戏应用... 人是社会动物,需要进行社交。社交的本质是人与人之间通过某种方式或工具传递信息ÿ...
超市买的腊肠可以直接吃吗,超市... 超市买的腊肠可以直接吃吗目录超市买的腊肠可以直接吃吗超市买来的腊肠直接可以吃吗?腊肠买回来就能吃吗?...
讣告什么意思,讣告 [fù g... 讣告什么意思目录讣告什么意思讣告 [fù gào]什么意思?近义词和反义词是什么?英文翻译是什么?讣...
【JVM】字节码指令全解 文章目录 入门案例原始 java 代码编译后的字节码文件常量池载入运行时常量池方法字节码载入方法区m...
电动自行车后轮轴承怎么拆,拆装... 电动自行车后轮轴承怎么拆目录电动自行车后轮轴承怎么拆拆装电动车后轮及轴承视频教程电动车后轮轴承怎么拆...
奇葩说六季冠军分别是谁,奇葩说... 奇葩说六季冠军分别是谁目录奇葩说六季冠军分别是谁奇葩说第一届冠军是谁?
移动有什么套餐流量多,中国移动... 移动有什么套餐流量多目录移动有什么套餐流量多中国移动流量套餐有哪些?移动有什么流量多的套餐吗?移动有...
蓝桥杯刷题冲刺 | 倒计时20... 作者:指针不指南吗 专栏:蓝桥杯倒计时冲刺 🐾马上就要蓝...
标婷维e乳可以擦脸吗,标婷维生... 标婷维e乳可以擦脸吗目录标婷维e乳可以擦脸吗标婷维生素e乳可以擦脸吗标婷维生素E乳可以白天擦脸用吗?...