各种浏览器缓存浅析

前言

目前浏览器的缓存类型众多,HTTP Cache、Disk Cache、Memory Cache、ServiceWorker Cache、Push Cache 等等,这些缓存是如何产生的?命中优先级是怎么样?又该如何去使用它们?

Disk Cache、Memory Cache

Disk Cache、Memory Cache 属于强缓存,将缓存的响应写到内存或硬盘中,也属于 HTTP 缓存的产物。

强缓存是如何产生的?

强缓存的产生依赖于请求响应中的 cache-controlexpires 的 headers 字段。这两个字段都是用来设置缓存数据的有效时间。

  • expires 是 HTTP 1.0 的产物,表示的是缓存的到期时间,是一个绝对时间。
  • cache-control 是 HTTP 1.1 的产物,表示的是缓存的最大可用时长,是一个相对时间。

cache-control 字段的值,也需要搭配相应的字段来使用,常用字段:

  • max-age:缓存的时长,和 expires 的作用类似,单位是秒。
  • no-cache:忽略强缓存,真接走协商缓存。
  • no-store:忽略强缓存和协商缓存,直接从服务器获取响应。
  • public:所有的数据都可以被任意地方缓存(例如可以缓存到 CDN 和代理服务器上)。
  • private:默认值,所有内容只有客户端才可以缓存。

两个字段同时存在时,cache-control 优先级最高。

内存缓存和硬盘缓存如何存储的?

当请求响应符合强缓存时,浏览器会根据 header 头中的字段类型进行缓存处理。通常:

  • 内存缓存:会存放 脚本、base64数据和字体等。
  • 硬盘缓存:会存放 样式文件、图片或比较大的文件等。

此行为属于浏览器行为,服务器不可控。

区别

区别
Disk Cache- 长期存在:浏览器关闭时同样存在。
- 存储文件空间更大。
Memory Cache- 短期存在:生命周期为会话级的,回话结束 缓存清除。
- 访问速度更快。
- 优先级更高。


HTTP Cache

这里主要说的是返回状态码为 304 的这种协商缓存。

当强缓存失效后,浏览器就会携带缓存标志向服务器发送请求。这里主要用到的 header 头:

  • Etag / If-None-Match
  • Last-Modified / If-Modified-Since:

当收到请求的响应时,会携带:

  • Etag:是服务器基于某种规则对资源生成的一个标志,类似于文件 hash。
  • Last-Modified:是服务器返回文件最后修改的时间。

当发送请求的时候,浏览器会携带:

  • If-None-Match:对应的就是 Etag 的值。
  • If-Modified-Since:对应的就是 Last-Modified 的值。

服务器根据这两个值进行匹配,如果相等,说明文件没有变化,返回 304,浏览器直接从缓存里面取;当不相等时,服务器发送最新的内容,状态码为 200。


ServiceWorker Cache

ServiceWorker Cache 属于新的 PWA Cache Storage API,它有力度更细的程序可操作缓存的能力。


它的命中条件依赖于 fetch,所以它的命中顺序如下:

是否从 serviceworker Cache 里面取缓存,完全依赖于 serviceworker 的脚本控制,取决于用户自定义。


浏览器上对应操作

强缓存serviceworker 缓存协商缓存缓存 headers 变动
刷新按钮 或 cmd + r有效有效有效无变动
cmd + shift + r无效无效无效请求中无 If-None-Match/If-Modified-Since,Cache-Control 值为 no-cache
DevTools Network面板开启Disable cache无效无效无效同上,但无缓存的能力更强

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

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

相关文章

[工具]TS 视频合并工具

简介 当下载 m3u8 资源时,通常产生的是多个 ts 视频文件,所以需要借助某些工具来将这些 ts 视频片段整合为一个视频文件。 本软件主要解决的就是这个问题,底层基于ffmpeg,可正常运行在 Windows 和 Mac 平台。不仅可以合并 ts 为单…

[会议分享]2020全球软件大会分享-PWA在项目中的最佳实践

大会地址:https://www.bagevent.com/event/1233659# PPT下载:https://download.csdn.net/download/lecepin/12871373

「浏览器插件」非常好用的JSON-View

Chrome 商店:地址 下载地址:地址 Github:https://github.com/lecepin/lp-json-view 查看/格式化 二合一。 功能 自动识别 JSON 内容,并在页面右下角创建切换按钮。支持展开/折叠节点。支持全部展开、全部折叠、展开一二三层节点…

Github Action 快速构建 Electron 应用

前言 在开发 Electron 应用时,比较耗时的部分应该是构建打包的过程,像用 electron-builder 这种打包工具来说,它会根据你要打包的系统来下载应用的系统镜像打包工具,由于这些镜像的源文件托管在 Github 上,且 nodejs …

「浏览器插件」网址小尾巴终结者

前言 在我们日常的开发调试中,会在 URL 上添加一些特殊的小尾巴 用来显示调试界面或者开启一些特殊功能,当你接触了越来越多的系统后,你需要使用的小尾巴就变得越来越多,记忆和使用成本非常大,以及含有小尾巴的网址 在…

什么是低代码?

低代码 是一种软件开发方法,可以减少手工编码的过程,尽可能快的交付应用程序。 低代码平台 是工具的合集,这些工具可以通过建模和图形界面来进行应用程序的可视化开发。低代码使开发人员可以跳过手工编码,从而加快了应用程序的开…

什么是 LOW-CODE ?

低代码平台的特征 可视化建模工具 使用可视化方法和模型创建应用程序比使用代码进行开发要快。具有可视化建模功能的低代码平台,使用内置的组件,以任何人都可读的形式表示任何信息,从没有技术技能的常规企业用户到专业开发人员。 开箱即用…

简简单单 上传下载

背景 我们经常会有手机向电脑传文件 或者 电脑像手机传文件的需求。 而通常的解决方案是:手机上安装一个聊天软件(如微信),电脑上安装一个聊天软件,然后自己给自己传输,然后进行下载。 这种方式是很麻烦的…

「VSCode插件」提效工具 - 快捷面板

前言 做为一个开发人员,在日常的开发过程中,经常会在 Terminal 中输入各种命令,如:npm i、npm start、git init、rm -rf、node_modules 等命令,看似方便,实则高频率的输入很烦人。那有什么方法可以把这些高…

VSCode摸鱼插件 — FreeWindow

背景 在一些不是很忙的时候,想高效利用下时间,看看书丰富一下自己,但是大庭广众下长时间看一本实体书,或者看手机的电子书,或者在电脑上看网页书都不太合适,显得自己很闲的样子,那该如何看起来…

在线生成文本图片 CFC函数计算版

百度云函数计算 CFC 运行环境。 使用 sharp 图处理(文档)。 使用 图片参数: widthheightrgba 文本参数: textfColorfSizefTopfLeft {HTTP触发器地址}?width1000&height300&fSize120&fColor%23d9333f&text奥利…

调试利器:浏览器 Logger

1. 前言 在一些业务系统中,由于集成的平台产物或工具较多,而这些产物的 log 不收敛,很多时候打开控制台就是满屏的 log,自己的 log 需要在满屏的 log 中查找,或者在 log 上加一些前缀用 Filter 去过滤,严重…

主动型页面性能利器:Page Status

1. 背景 当页面出现性能问题,如加载慢、页面卡顿等现象时,大多是用户主观上的感受。而要真正客观的去评测性能和定位问题原因,通常需要专业的前端同学通过 DevTools 中的 Performance 等工具来查看(如图 1 所示)&…

前端状态机:XState 首个中文文档上线了

XState 做为一个非常好用的前端状态机库,但官网文档却只有英文版,为了阅读体验,我这里翻译了中文版。 仓库地址:https://github.com/lecepin/xstate-docs-cn文档地址:https://lecepin.github.io/xstate-docs-cn/zh 由…

降低前端业务复杂度新视角:状态机范式

无论做业务需求还是做平台需求的同学,随着需求的不断迭代,通常都会出现逻辑复杂、状态混乱的现象,维护和新增功能的成本也变的十分巨大,苦不堪言。下图用需求、业务代码、测试代码做对比: 图中分了 3 个阶段&#xff1…

Mac 摸鱼神器

这是一个 Mac 系统的摸鱼应用,仿真了大多数的 Mac 系统黑屏故障。开启摸鱼功能后,可以给自己一段休息的时间~ 软件使用 Electron 开发,源码(欢迎 Star ⭐ ):https://github.com/lecepin/mac-fish 1. 主界…

前端状态机系列:SCXML与XState对应关系

1. 前置说明 这次再说明下自己对状态图的看法。状态图虽然有非常多的优势(参考上篇文章),如果你想使用,关于是否对整个旧项目进行全量状态图化,这里给一个适应范围是:项目中复杂的部分进行状态图建模是非常…

常用注入 Script 方法

1. 背景 如果你想在当前的页面,试一下某个 JS 工具库,而这个工具库恰好你没安装。(如 lodash)如果你想分享一段脚本给别人,而又不希望别人在执行的过程太过麻烦。(如你写了一段恢复复制和右键功能的脚本&a…

多年前的树莓派 B+ 重新工作

1. 前言 最近整理房间的时候,发现在一块大约在 2014 年购买的树莓派,看了下电路板,型号是 b,看了下官网的参数: CPU: ARM1176JZF-S 核心 700MHz 单核RAM: 512MB 确实有点太弱了。 最近刚好想做一个家用的文件 Serve…

create-react-app 使用代理做 mock

1. 背景 很多情况下,为了测试需要一些接口的 mock 场景,基于 create-react-app 生产的项目 好处在于它内置了这块代理的能力,给用户提供了很大的方便。 2. 代理方式 create-react-app 默认提供了两种方式,关联到 webpack-dev-s…