前端缓存

文章目录

  • 前端缓存
    • 缓存分类
      • 1、http缓存
        • (1)强缓存(本地缓存)
          • 启发式缓存
        • (2)协商缓存(弱缓存)
      • 2、浏览器缓存
    • 其他
      • 响应头和请求头参数
      • 刷新
        • 正常重新加载
        • 硬性重新加载
        • 清空缓存并硬性重新加载
      • 调试缓存

缓存分类

1、http缓存

浏览器请求流程:

(1)强缓存(本地缓存)

是否使用强缓存,由请求头中的如下参数决定:
Expires:格式是Fri ,24 Dec 2027 04:24:07 GMT;旧的规范,优先级比较低
Pragma:只有一个值no-cache,和Cache-Control的no-cache一样
Cache-Control

其中,no-cache是指使用协商缓存,每次都要跟服务器验证缓存有效期,no-store是指不使用缓存。Cache-Control和Expires同时存在时,以Cache-Control为准
在network中看到下面的就是使用了硬缓存。

启发式缓存

如果max-age和expires属性都没有,找找头里的Last-Modified信息。如果有,缓存的寿命就等于头里面Date的值减去Last-Modified的值除以10(注:根据rfc2626其实也就是乘以10%)。所以,没有明确的cache-control的时候,相当于cache-control:max-age=N,也就是使用了缓存期为N的强缓存,N由Date和Last-Modified决定;如果没有Last-Modified,但是有etag,Firefox也会在请求头里加上cache-control:max-age=0,chrome虽然看不到max-age=0的参数,但实际表现也是返回304。不同的浏览器可能有不同的启发式缓存算法,所以最明智的做法就是明确设置Cache-Control

(2)协商缓存(弱缓存)

ETag/If-None-Match:以一个唯一标志(ETag)作为判断是否使用缓存的标准,它被称为强校验器。资源请求的响应头里含有ETag, 客户端可以在后续的请求的头中带上 If-None-Match 头来验证缓存
Last-modify/if-Modify-Since:以时间作为判断是否使用缓存的标准,它被称为弱校验器,因为它只能精确到一秒。如果响应头里含有这个信息,客户端可以在后续的请求中带上 If-Modified-Since 来验证缓存。

Tips: Last-modify和ETag同时存在时,需要同时满足才返回304。Last-modify和ETag写在响应头中,if-Modify-Since和If-None-Match写在请求头中。

2、浏览器缓存

(1)本地存储
①WebStorage:localStorage和sessionStorage
②Cookie
③webSql:前端数据库,关系型数据库,但只有chrome支持,ie和firefox不支持,W3C也不支持。
④IndexedDB:前端数据库,允许储存大量数据,提供查找接口,还能建立索引,不属于关系型数据库(不支持 SQL 查询语句),更接近 NoSQL 数据库。
⑤Application Cache:应用程序缓存(离线缓存)
(2)默认缓存
①BFcache: 往返缓存(Back/Forward cache),浏览器行为

其他

响应头和请求头参数

其实我们在请求头和响应头里面都能看到cache-control:no-cache,那他们代表的意思有什么不一样呢。

点击查看

请求头:本次请求要怎么做

响应头:下次请求要怎么做

刷新

以谷歌浏览器为例,有正常重新加载、硬性重新加载、清空缓存并硬性重新加载三种,硬性重新加载也就是我们常说的强制刷新。

正常重新加载

平时用得最多的刷新,就是直接按F5

硬性重新加载

等同于直接按Ctrl+F5,或者在devtools的network面板中勾选Disable cache并刷新(devtools面板开启状态)。这种情况下当遇到需要加载的资源时,不会使用缓存的资源,而是重新发起请求。浏览器的处理其实就是在发出请求的时候在请求头中加上Cache-Control:no-cache和pragma: no-cache。所以也可以看出,我们的请求头是受客户端影响的,不同的客户端可能会加上不同的请求头,看到的请求头就会不一样,而响应头则是由服务器决定的,不同客户端看到的结果应该是一致的。

清空缓存并硬性重新加载

顾名思义,将该页面的缓存清空并进行硬性重新加载,那既然是硬性重新加载,清不清缓存又有什么意义呢?但实际上,页面加载后,如果是通过JS来加载内容,只是普通的硬性重新加载的话这部分的内容仍然是从缓存中加载的,清空缓存则可以保证页面内容是完全重新加载的。

调试缓存

火狐使用about:cache?storage=disk&context=

小菜鸟一枚,哪里写得不对的请赐教。

前端缓存(HTTP缓存、浏览器缓存)浅析相关推荐

  1. 如何不让浏览器读取html缓存,不让浏览器缓存index.html

    参考文档:https://www.2cto.com/ask/question/4598 location = /index.html { add_header Cache-Control " ...

  2. 【缓存】客户端(浏览器)缓存学习

    转自:https://www.cnblogs.com/tinywan/p/6067126.html    感恩 目录 客户端(浏览器)缓存的优点 客户端缓存的缺点 浏览器缓存策略 Expires Ca ...

  3. JavaScript基础之缓存机制:浏览器缓存机制

    缓存可以说是网站性能优化非常有用的一种方式.一个优秀的缓存策略可以缩短网页请求资源的距离,减少延迟,并且由于缓存文件可以重复利用,还可以减少带宽,降低网络负荷. 对于一个数据请求来说,可以分为发起网络 ...

  4. java 情况浏览器缓存_JavaWeb禁止浏览器缓存当前Web页面的方法

    所谓浏览器缓存,是指当第一次访问网页时,浏览器会将这些网页缓存到本地,当下一次再访问这些被缓存的网页时,浏览器就会直接从本地读取这些网页的内容,而无需再从网络上获取. 虽然浏览器提供的缓存功能可以有效 ...

  5. 前端更新需要清空浏览器缓存_浏览器缓存机制分析及前端缓存清理

    浏览器缓存机制分析及前端缓存清理 发布时间:2018-06-03 16:56, 浏览次数:857 本文主题:理清浏览器的缓存机制的内部逻辑,并给出避免浏览器缓存的相关解决方案 相信很多新手前端发布页面 ...

  6. 完美解决 - 前端发版后浏览器缓存问题(发版后及时拉取最新版本代码)

    一.简介 开发完发布新版本后,在有些电脑上总需要强刷才能获取到最新版本的内容,太恶心了. 浏览器缓存(Browser Caching)是为了节约网络的资源加速浏览,浏览器在用户磁盘上对最近请求过的文档 ...

  7. 关于前端更新需要清空浏览器缓存

    一.HTTP缓存之Cache-Control Cache-Control 是最重要的规则.这个字段用于指定所有缓存机制在整个请求/响应链中必须服从的指令.这些指令指定用于阻止缓存对请求或响应造成不利干 ...

  8. 前端更新需要清空浏览器缓存_js清除浏览器缓存的几种方法

    关于浏览器缓存 浏览器缓存,有时候我们需要他,因为他可以提高网站性能和浏览器速度,提高网站性能.但是有时候我们又不得不清除缓存,因为缓存可能误事,出现一些错误的数据.像股票类网站实时更新等,这样的网站 ...

  9. 版本更新带来的缓存问题_浏览器缓存原理总结

    作者: Poetry 来源:http://blog.poetries.top/2019/01/02/browser-cache/ 一.浏览器缓存基本认识 分为强缓存和协商缓存 1.浏览器在加载资源时, ...

  10. 里面怎么缓存图片_浏览器缓存原理总结

    一.浏览器缓存基本认识 分为强缓存和协商缓存 1.浏览器在加载资源时,先根据这个资源的一些http header判断它是否命中强缓存,强缓存如果命中,浏览器直接从自己的缓存中读取资源,不会发请求到服务 ...

最新文章

  1. mysql时间戳group by操作,mysql使用FROM_UNIXTIME将时间戳按日期group by
  2. pca主成分分析结果解释_SKLEARN中的PCA(Principal Component Analysis)主成分分析法
  3. 开发日记-20190518 关键词 函数式编程(二)
  4. sql 查询嵌套数组
  5. asp.net core 使用identityServer4的密码模式来进行身份认证(2) 认证授权原理
  6. python可视化图表工具_酷炫的可视化图表工具来帮忙 深度评测五大Python数据可视化工具...
  7. 无公网域名,使用ngrok开启反向代理,实现公网域名访问本地项目
  8. mysql拦截器实现crud_Mybatis自定义SQL拦截器
  9. oracle 监听拒绝连接,报mybatis映射文件错误Listener refused the connection with the following error: ORA-12519, TNS
  10. 快讯:Oracle 发布了传闻已久的 18.3 RPM 安装版本
  11. python 爬poj.org的题目
  12. NUC980 DIY项目大挑战 - EtherCAT实现
  13. STM32学习笔记一一HEX文件和BIN文件格式
  14. WebService实例
  15. 极验验证码(6.0.9)破解(一) 之 抓包分析
  16. SQL复杂查询 高速数目和城市数目
  17. C语言实现简单卡尔曼滤波
  18. SketchUp安装组件失败“.Net FrameWork 4.5.2”的解决办法
  19. slack 使用说明_我如何使用Slack作为自己的个人助理
  20. 结合实际问题的 Bitcode 适配指南 (一)

热门文章

  1. MySQL数据库多表查询
  2. linux终端窗口满行不会换行,解决docker tty窗口太小,命令换行的问题
  3. 2022秋-2023-中科大-数字图像分析-期末考试试卷回忆版
  4. 【datart】图表插件开发大赛
  5. 三步教会你苹果手机如何应用分身双开
  6. 关于Webview执行goBack不能返回的问题解决
  7. 美食及其简易制作步骤记录[学一个,加一个,学习之余不能忘了吃呀]【持续更新】
  8. vue-router传参的四种方式超详细
  9. “升级版后浪”刷屏:B站别再搬砖砸自己脚了!
  10. 魔数--咖啡宝宝(Java小彩蛋)