前端缓存揭秘:5年前端技术的必备知识点

背景

本篇文章将详细讲述何为前端缓存,这也是前端工程师必备的知识点。

首先,我们不能少了干这事的目的,前端缓存有什么用?

缓存作用:加快资源获取速度,提高用户体验感,缓解服务端压力

我们带着这个目的,好好地梳理一番~


大纲

每个人对于前端缓存的理解都不一,就如 一千个人有一千个哈姆雷特 一样

我参考其他文献与自己的见解,将前端缓存分门别类,罗列出来,仅供大家参考:

screenshot-20240401-181550.png


一、HTTP缓存

HTTP缓存,就是利用HTTP响应头将所请求的资源在浏览器中进行缓存

HTTP缓存,共为2种形式,强缓存协商缓存,下面我们就详细了解一下。

这是HTTP缓存运作的一个整体流程图:
2640702-20221118161833360-1931340274.jpg

1.1 强缓存

强缓存又称(彻底缓存),指的是在缓存时间内不会向服务器发起请求,直接读取浏览器本地缓存,只有过期之后才会向服务器发起请求。

特性:

  • 状态码:200
  • 谁来决定:浏览器
  • 缓存强度:F5刷新无效,Ctrl+F5刷新清空
  • 存放位置:Disk Cache(磁盘缓存)、Memory Cache(内存缓存)
  • 判断缓存:由ExpiresCache-ControlPragma 这3个Header属性控制。

1.1.1 Expires

Expires是 HTTP/1.0 的产物。

ta的值是一个缓存的 过期时间(GMT),超过该时间,则重新请求。

且ta的 优先级 是这3个Header属性 最低 的。

缺点: 但Expires是根据本地时间来判断的,假设客户端和服务器时间不同,会导致缓存命中误差

为了解决以上问题(修改本地时间, 重新请求),HTTP/1.1 则增加了 Cache-Control 字段

1.1.2 Cache-Control

Cache-Control是 HTTP/1.1 的产物。

优先级,高于Expires,整体 第二

ta的值主要由 max-age 值来进行判断,常用的属性值:

  • max-age:单位(秒),从发起时间开始n秒后,缓存失效
  • no-cache:禁用强缓存,开启服务新鲜度判定
  • no-store:禁用缓存(包括协商缓存),每次请求最新
  • private/public:是否只能被单个用户保存

1.1.3 Pragma

Pragma也是 HTTP/1.0 的产物。

且ta的 优先级 是这3个Header属性 最高 的。

ta的值主要由 no-cache(实际上也是唯一取值)。

  • no-cache:禁用强缓存,开启服务新鲜度判定

主要作用:是保持 HTTP1.0 向后兼容,因为缓存技术是在HTTP1.1中才出现的。


1.2 协商缓存

协商缓存都会向 服务器 发送请求,由 服务器 来确定缓存资源是否可用,所以客户端与服务器端要通过某种标识来进行通信。

这主要涉及到下面两组header字段,这两组搭档都是 成对出现 的。

特性:

  • 状态码:304
  • 谁来决定:服务器
  • 缓存强度:F5刷新和Ctrl+F5刷新都清空
  • 判断缓存:由Last-Modified / If-Modified-SinceETag / If-None-Match 这2个Header 成对属性 控制。

1.2.1 Last-Modified / If-Modified-Since

ta的值为 GMT时间(最后修改时间)

第一次请求资源,服务器返回的header中会加上 Last-Modify,再次请求,request的请求头中会包含 If-Modify-Since,且该值为之前返回的 Last-Modify

命中缓存判断:

  • 服务器会通过收到 If-Modify-Since,判断最后修改时间,是否命中缓存。

  • 若命中缓存,则返回 304 状态码,若没有,则不会返回 Last-Modify 字段

1.2.2 ETag / If-None-Match

ta的值为一串 hash 码,用来标识资源,当服务端的文件变化时,hash 码也会随之改变。

命中缓存判断:

  • 通过请求头中的 If-None-Match 和当前文件的 hash 值进行比较,如果相等则表示命中协商缓存

二、浏览器缓存

浏览器缓存,简而言之就是,除了HTTP缓存的 其他浏览器缓存

里面包含了3种缓存,分别为 默认缓存本地缓存离线缓存(应用缓存)

2.1 默认缓存

默认缓存,又被称为 Bf Cache 往返缓存。

作用:是为了页面前进后退,提升页面渲染的一种策略(默认行为)

当用户前往新页面时,将当前页面的浏览器DOM状态保存到 Bf Cache 中;当用户点击后退按钮的时候,将页面直接从 Bf Cache 中加载,节省了网络请求的时间。

2.2 本地缓存

本地缓存,实则是对于 本地数据 层面上的一种缓存策略。

例如我们经常使用的 WebStorageCookieIndexDBWebSql

2.2.1 WebStorage

  • 大小跟浏览器相关,一般是 5MB
  • LocalStorage:
    • 浏览器提供的 本地持久化存储,用于在浏览器中长期保存数据。
    • 数据会一直保存在用户的浏览器中,除非 被显式清除
    • 数据 可跨页面,跨浏览器
  • SessionStorage:
    • 浏览器提供的 会话级别的临时存储,用于在单个会话期间保存数据。
    • 数据在会话结束后被清除,也就是 关闭页面清除
    • 数据 不可跨页面,跨浏览器

2.2.2 Cookie

Cookie主要用于用户信息的存储,Cookie的内容可以自动在请求的时候被传递给服务器,大小 4KB

2.2.3 IndexDB

浏览器提供的客户端数据库,用于在浏览器中存储大量结构化数据。它支持事务操作和索引,可以提供较高级的数据存储和查询功能,大小 无限

2.2.4 WebSql

websql是较新的chrome浏览器支持,并以独立规范形式出现,引入了一组使用 SQL 操作客户端数据库的 APIs。

  • Web Sql数据库 API 不是HTML5的一部分,在H5之前就已经存在了。
  • 将数据以数据库的形式存储在客户端,按需读取。
  • 数据便于检索,允许使用sql语句。
  • 可以使浏览器实现小型数据库存储功能。

2.3 离线缓存

离线缓存,又称为 应用缓存

其作用:在离线(脱机)模式下,能请求到静态资源

我们一般说的离线缓存/应用缓存,其实主要是 Application Cache

2.3.1 Application Cache

Application Cache 为静态资源缓存,一种离线缓存技术,h5的新特性。

大部分的图片、js、css等资源放在mainfest文件配置中,页面打开时通过mainfest文件读取本地文件或请求服务器资源,通常用于静态页面的缓存。

2.3.2 PWA

基于App ManifestService WorkerPush Notification,实现的渐进式Web应用技术。

因此具备应用和页面二合一的特性:可跨平台、可安装、离线访问、推送通知、快速加载、可搜索、热更新等。


总结

前端缓存,是性能优化的一个大头,是区分一个优秀前端开发的重要指标。

世间万物万变不离宗,获取知识如缓存一般,与前端缓存的作用遥相对应。

加快技术层面的理解力,提升知识广度与深度,缓解无知/未掌控的压力

写博客,这或许是我缓解压力,以及提升技术的最佳合理摸鱼方式了。


参考文献:

  • 图解 HTTP 缓存 - 掘金 (juejin.cn)
  • 什么是Web缓存,HTTP缓存和浏览器缓存的区别-电子发烧友网 (elecfans.com)
  • 深入理解浏览器的缓存机制之协商缓存与强缓存-CSDN博客
  • http缓存和浏览器缓存_http缓存跟浏览器缓存是一个东西吗-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/586033.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用python,将有道词典中的生词导入扇贝单词

我试过有道词典和扇贝单词,个人感觉扇贝单词记忆功能非常好用,但是扇贝单词没有pc版,而有道在这方面就做的很好。博主平时都是用有道查生词,那有没有办法将有道词典中的生词导入扇贝中呢?下面的过程看上去很复杂&#…

Python中的相关规则:注释,参数,模块和包

Python中的相关规则:注释,参数,模块和包 注释参数模块包(package)数据类型其他一些编写代码小技巧 注释 crtl/注释,多行注释(三对单引号或双引号):多行注释一般放在文件开头,标明整个…

现在做抖音小店还赚钱吗?真实收益展现!新手不看绝对后悔!

哈喽~我是电商月月 抖音小店,电商这个行业已经走入大众眼前 它确实能赚钱,但经过四五年的时间打磨,部分人心里的顾虑基本都是:现在才开始做抖音小店还赚钱吗,花费大不大 首先,新媒体的时代,现…

YPay源支付V7开源版

YPay_V7版本即将停止维护更新,同时我们将开放最新版开源代码供学习和参考。虽然首批阶段的【function_8.1.php文件是加密的】,但授权已经除去,该代码将在新版YPay上线时开放给大家。我们也会定期进行迭代更新,随后将创建对应仓库&…

Python多任务处理---多进程

在Python中,进程(Process)是操作系统分配资源和调度的基本单位。每个进程都拥有自己独立的内存空间和资源,进程之间的通信需要特殊的机制来实现,比如管道(pipe)、信号(signal&#x…

nRF52832/52840怎么将NFC引脚配置成通用IO(P0.09,P0.10)

对于Nordic SDK的程序架构来说,引脚的NFC功能和Reset功能主要是在system_nrf52.c,跳转进main函数前执行SystemInit进行初始化的。代码如下 void SystemInit(void) {....../* Configure NFCT pins as GPIOs if NFCT is not to be used in your code. If …

Kimi和ChatGPT做古诗词阅读理解,谁更胜一筹?

前几天发过一篇Kimi整理会议的体验教程,没想到大家很感兴趣,这次再来拿Kimi做古诗词阅读理解看看,同时也对比下ChatGPT的效果。 ChatGPT是几乎家喻户晓的AI大模型,Kimi和它对比有哪些异同点呢? 首先它们都是基于对话…

docker容器添加新端口映射的步骤及`wsl$`目录的作用

在Docker容器已经创建后,需要添加新的端口映射,即对已经存在的Docker容器添加新的端口映射,可以通过以下步骤来添加,即通过修改配置文件的方法。 如何新增端口映射? 查找容器的hash值 docker inspect [容器id或名称…

docker-compse安装es(包括IK分词器扩展)、kibana、libreoffice

Kibana是一个开源的分析与可视化平台,设计出来用于和Elasticsearch一起使用的。你可以用kibana搜索、查看存放在Elasticsearch中的数据。 Kibana与Elasticsearch的交互方式是各种不同的图表、表格、地图等,直观的展示数据,从而达到高级的数据…

DTW-KNN 用于液压故障检测(python)

1 介绍 本文提取特征,然后用于液压故障检测,每一条特征都是时间序列问题,所以使用了DTW-KNN模型,该模型的原来不做解释,大家可以自行查找。 2 数据集介绍 所有数据都在文件夹下,这是一个公开数据集&…

PFA(可溶性聚四氟乙烯)弯嘴洗瓶

PFA材质,又称可溶性聚四氟乙烯,是进口的高纯原材料,耐强酸强碱耐腐蚀和各种有机溶剂。 常用规格:30ml/60ml/100ml/250ml/500ml 产品特性 1、耐高低温:使用温度可达-200~260℃; 2、可打刻度,高度透明&#x…

【Linux】自定义协议+序列化+反序列化

自定义协议序列化反序列化 1.再谈 "协议"2.Cal TCP服务端2.Cal TCP客户端4.Json 喜欢的点赞,收藏,关注一下把! 1.再谈 “协议” 协议是一种 “约定”。在前面我们说过父亲和儿子约定打电话的例子,不过这是感性的认识&a…