当前位置:首页 > 技术分析 > 正文内容

五分钟教会你浏览器缓存的那些事儿

ruisui883个月前 (02-03)技术分析23

作为一名优秀前端的你是否还不清楚浏览器的缓存机制?那么此刻就请看看下面的内容吧~

浏览器缓存是把双刃剑,使用得当将极大提升你网页的用户体验,反之则可能制造出pbug

一、浏览器缓存是什么

浏览器缓存是为了加速浏览,浏览器在用户磁盘或内存中对请求过的资源进行存储,当用户再次请求相同资源时,浏览器就会从磁盘或内存中获取缓存资源而不再向服务端请求,从而节省了网络请求所花费的时间。

那么是不是为了达到以上目的,就对资源无脑进行缓存呢?

不是的。比如服务器的资源更新了,但是由于缓存原因,用户依旧使用的是缓存中的资源,这就会导致用户使用的资源不是最新的。

那么接下来就需要详细了解浏览器的缓存流程和机制。

二、浏览器缓存流程

首先,可以认为浏览器中有这样一张映射表,它存储的是资源(和缓存信息等)与本地磁盘文件的关系。如下图:


当浏览器请求“https://xxxx/a.js”时,会先去映射表中查找是否有该资源的缓存信息,如果找到并且缓存时间未过期,那么就从本地磁盘(或内存)中获取缓存的资源(比如:C:\xxxx\a.js)。如果映射表中没有请求资源的缓存信息,那么就会向服务器请求资源,然后服务器会在响应头中返回缓存规则给浏览器,浏览器再根据它决定是否缓存以及如何缓存该资源。

浏览器第一次请求资源流程:

问:上图提到的“缓存规则”是什么呢?

答:它的作用是告诉浏览器对于该资源是否需要缓存,该如何缓存,缓存多长时间等操作。往下看

三、浏览器缓存规则

浏览器缓存规则主要有两类:

  • 彻底缓存:expires、cache-control
  • 协商缓存:last-modified、etag

如下图,是一个请求的响应头(response headers),它就包含了彻底缓存和协商缓存所用到的字段信息。

什么是彻底缓存

定义:只要资源的缓存时间没有过期,就从缓存中获取,否则则从服务器获取

依据:expires、cache-control

早在http1.0时期,使用的是expires字段来规定资源的过期时间,该时间是由服务器产生的绝对时间(GMT格式,如上图所示),如果客户端的时间小于该时间,那么就使用缓存。但是我们都知道客户端时间是可以手动修改的,这就会导致可能缓存一直未使用。

为解决以上问题,从http1.1开始使用cache-control来规定彻底缓存规则,如下表所示其值和含义:

还记得“请求的响应头信息”图中有个"cache-control: max-age=2678400"吗?它表示的就是从请求开始该资源的缓存过期所经历的秒数为2678400s。

当响应头中同时含有expires和cache-control时,在使用缓存的判断上后者的优先级要高于前者。

什么是协商缓存

定义:请求未命中彻底缓存时,会向服务器发起请求,并在请求头上携带该资源在缓存映射表中的etag和last-modified信息(如果存在的话)。然后浏览器根据请求的响应状态码决定是否使用缓存。

依据:etag、last-modified

特点:不管资源有没有修改,都会向服务器发起请求

etag:文件的唯一标识,只要文件修改后,该值就会修改

last-modified:文件的最后修改时间

在第一次请求资源后,浏览器会将响应中的缓存规则存入缓存映射表。在第二次请求时,如果未命中彻底缓存(比如:max-age过期了,cache-control值为no-cache或no-store),并且缓存信息中含有etag或last-modified信息,浏览器就会在请求头上对应的携带这样两个信息:if-none-match: W/"
98e1-lY6zj2gtniVAqQ203cSuog"
if-modified-since: Fri, 25 Jun 2021 16:03:41 GMT

服务器就会根据这些值和最新的资源所产生的etag和last-modified值做对比,如果发现不相同,则返回最新资源和最新的etag或last-modified,浏览器将新的缓存规则更新到映射表中。反之则返回304状态码,浏览器就使用缓存数据。

问:为什么需要etag呢?有了last-modified不就可以了么?

答:其实主要有两个原因,第一,有时候文件的内容并未修改,仅仅改变了其修改时间,这时其实还是可以使用缓存的。第二,如果文件修改很频繁,并且频率在秒级以下,从“请求的响应头信息”图可发现last-modified精度只能到秒。所以if-modified-since只能感知秒级的修改。所以etag的存在还是很有必要的。

提示:etag的优先级会高于last-modified

总结

我们用一张流程图来概括以上所讲的浏览器缓存机制:

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/1103.html

标签: nocache
分享给朋友:

“五分钟教会你浏览器缓存的那些事儿” 的相关文章

Ubuntu 24.10发行版登场:Linux 6.11内核、GNOME 47桌面环境

IT之家 10 月 11 日消息,Canonical 昨日发布新闻稿,正式推出代号为 Oracular Oriole 的 Ubuntu 24.10 发行版。新版在内核方面升级到最新 6.11 版本,并采用 GNOME 47 桌面环境。Ubuntu 24.10 发行版调整了内核策略,开始选择最新的上游...

vue组件间的九种通信方式

前言Vue组件实例间的作用域是相互独立的,而通常一个页面是由很多个组件构成,这些组件可能又嵌套了组件,形成了一个关系网图,它们的关系可能是像下图中一样,大致分为两种使用场景,父子组件间通信和非父子组件间通信,父子组件间通信又分为直接父子关系和间接父子关系。vue提供了多种通信方法,针对不同的通信需求...

Gitlab 的使用和代码审查流程介绍

1、先简洁介绍下项目常用的信息-面板统计页面2、用户信息面板3、服务器信息4、项目信息5、重点介绍代码提交审核机制和授权合并机制开发人员推送代码的时候不能直接推送到master,否则就会报错。此时开发人员要本地新建分支然后在提交上来列出修改了哪些细节管理员可以管理这些分支合并到master6、指派合...

Python 幕后:Python导入import的工作原理

更多互联网精彩资讯、工作效率提升关注【飞鱼在浪屿】(日更新)Python 最容易被误解的方面其中之一是import。Python 导入系统不仅看起来很复杂。因此,即使文档非常好,它也不能让您全面了解正在发生的事情。唯一方法是研究 Python 执行 import 语句时幕后发生的事情。注意:在这篇文...

7 招教你轻松搭建以图搜图系统

作者 | 小龙责编 | 胡巍巍当您听到“以图搜图”时,是否首先想到了百度、Google 等搜索引擎的以图搜图功能呢?事实上,您完全可以搭建一个属于自己的以图搜图系统:自己建立图片库;自己选择一张图片到库中进行搜索,并得到与其相似的若干图片。Milvus 作为一款针对海量特征向量的相似性检索引擎,旨在...

别让“跑焦”毁所有!仅需这一项设置,即可显著改善镜头对焦精度

我常常会收到一些摄影爱好者的私信,也一直在努力的帮助大家解决更多摄影中常见问题。在我收到的所有问题中。有一个问题是最麻烦的,那就是“为什么我的图像看起来模糊?”。这个问题几乎每个人都遇到过,究其原因可以说是多种多样相对复杂。起初我一直认为是对焦问题所导致,也就有了我之前所写的“后按对焦”以及“对焦模...