当前位置:首页 > Web开发 > 正文

浏览器第一次请求数据时

2024-03-31 Web开发

Http 缓存机制作为 web 性能优化的重要手段,对付从事 Web 开发的同学们来说,应该是常识体系库中的一个根本环节,同时对付有志成为前端架构师的同学来说是必备的常识技能。

但是对付很多前端同学来说,仅仅只是知道浏览器会对请求的静态文件进行缓存,但是为什么被缓存,缓存是怎样生效的,却并不是很清楚。

在此,我会测验考试用简单明了的文字,像大家系统的介绍HTTP缓存机制,期望对列位正确的理解前端缓存有所辅佐。

在介绍HTTP缓存之前,作为常识铺垫,先简单介绍一下HTTP报文

HTTP报文就是浏览器和处事器间通信时发送及响应的数据块。

浏览器向处事器请求数据,发送请求(request)报文;处事器向浏览器返回数据,返回响应(response)报文。

报文信息主要分为两部分

包罗属性的首部(header):附加信息(cookie,缓存信息等)与缓存相关的法则信息,均包罗在header中

包罗数据的主体部分(body):HTTP请求真正想要传输的部分

缓存法则解析

为便利大家理解,我们认为浏览器存在一个缓存数据库,用于存储缓存信息。

在客户端第一次请求数据时,此时缓存数据库中没有对应的缓存数据,需要请求处事器,处事器返回后,将数据存储至缓存数据库中。

技术图片

HTTP缓存有多种法则,按照是否需要从头向处事器倡议请求来分类,我将其分为两大类(强制缓存,比拟缓存)

在详细介绍这两种法则之前,先通过时序图的方法,让大家对这两种法则有个简单了解。

已存在缓存数据时,仅基于强制缓存,请求数据的流程如下

技术图片

已存在缓存数据时,仅基于比拟缓存,请求数据的流程如下

技术图片

对缓存机制不太了解的同学可能会问,基于比拟缓存的流程下,不管是否使用缓存,都需要向处事器发送请求,那么还用缓存干什么?

这个问题,我们暂且放下,后文在详细介绍每种缓存法则的时候,会带给大家答案。

我们可以看到两类缓存法则的差别,强制缓存如果生效,不需要再和处事器产生交互,而比拟缓存不管是否生效,都需要与处事端产生交互。

两类缓存法则可以同时存在,强制缓存优先级高于比拟缓存,也就是说,当执行强制缓存的法则时,如果缓存生效,直接使用缓存,不再执行比拟缓存法则。

强制缓存

从上文我们得知,强制缓存,在缓存数据未掉效的情况下,可以直接使用缓存数据,那么浏览器是如何判断缓存数据是否掉效呢?

我们知道,在没有缓存数据的时候,浏览器向处事器请求数据时,处事器会将数据和缓存法则一并返回,缓存法则信息包罗在响应header中。

对付强制缓存来说,响应header中会有两个字段来标明掉效法则(Expires/Cache-Control)

使用chrome的开发者工具,可以很明显的看到对付强制缓存生效时,网络请求的情况

技术图片

Expires

Expires的值为处事端返回的到期时间,即下一次请求时,请求时间小于处事端返回的到期时间,直接使用缓存数据。

不过Expires 是HTTP 1.0的对象,此刻默认浏览器均默认使用HTTP 1.1,所以它的感化根基忽略。

另一个问题是,到期时间是由处事端生成的,但是客户端时间可能跟处事端时间有误差,这就会导致缓存命中的误差。

所以HTTP 1.1 的版本,使用Cache-Control替代。

Cache-Control

Cache-Control 是最重要的法则。常见的取值有private、public、no-cache、max-age,no-store,默认为private。

private: 客户端可以缓存
public: 客户端和代办代理处事器都可缓存(前真个同学,可以认为public和private是一样的)
max-age=xxx: 缓存的内容将在 xxx 秒后掉效
no-cache: 需要使用比拟缓存来验证缓存数据(后面介绍)
no-store: 所有内容都不会缓存,强制缓存,比拟缓存都不会触发(对付前端开发来说,缓存越多越好,so…根基上和它说886)

举个板栗

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/30285.html