本文共 3422 字,大约阅读时间需要 11 分钟。
1. 缓存分类
1.1 前端缓存分类
缓存
是前端项目性能优化
中简单高效的一种方式 - 优秀的缓存策略可以
缩短网页请求资源的距离
,减少延迟
- 并且由于缓存文件可以
重复利用
,还可以减少带宽
,降低网络负荷
1.2 缓存过程分析
- 浏览器与服务器通信的方式为
应答模式
- 即:
浏览器发起HTTP请求 – 服务器响应该请求
- 那么浏览器第一次向服务器发起该请求后拿到请求结果, 会根据
响应报文中HTTP头的缓存标识
,决定是否缓存结果
- 具体过程如图
- 缓存流程两点总结
浏览器每次发起请求,都会在浏览器缓存中寻找该请求的标识和缓存内容
浏览器每次收到返回结果,都会在浏览器缓存里保存该标识和缓存内容
2. HTTP 缓存
2.1 HTTP 缓存
- HTTP 缓存是
在 HTTP 请求传输时用到的缓存
,主要在服务器
代码上设置,它是我们日常开发中最为熟悉的一种缓存机制
2.2 HTTP 缓存分类
- HTTP 缓存又分为
强缓存
和协商缓存
优先级较高
的是强缓存
,在命中强缓存失败
的情况下,才会走协商缓存
强缓存与协商缓存的区别
强缓存
不会向服务器发送请求
直接从缓存中读取资源
- 在
chrome
控制台的Network
选项中可以看到该请求返回200
的状态码,并且Size
显示from disk cache
或from memory cache
- 可以通过设置两种 HTTP Header 实现:
Expires
和 Cache-Control
协商缓存
向服务器发送请求
- 服务器会根据这个请求的
request header
的一些参数来判断是否命中协商缓存
- 如果命中,则返回
304
状态码并带上新的response header
通知浏览器从缓存中读取资源 - 需要与
cache-control
共同使用
2.3 HTTP 缓存 – 强缓存的三种情况
- 强制缓存就是
向浏览器缓存查找该请求结果
,并根据该结果的缓存规则
来决定是否使用该缓存结果的过程
2.3.1 情况一
- 没有该请求的
缓存
和标识
,强制缓存失效
,向服务器送新请求
(跟第一次发起请求一致)
2.3.2 情况二
- 存在该请求的缓存和标识,但是
结果已过期
,强制缓存失效,改为协商缓存
(暂不分析)
2.3.3 情况三
- 存在该请求的缓存和标识,
末过期
,使用该缓存资源,返回结果
2.4 HTTP 缓存 – 强缓存的缓存规则
- 当浏览器向服务器
发送请求
的时候,服务器会将缓存规则
放入HTTP响应的报文的HTTP头
中和请求结果
一起返回给浏览器,控制强制缓存的字段分别是Expires和Cache-Control
,其中Cache-Conctrol的优先级比Expires高
Expires
是HTTP/1.0控制网页缓存的字段,其值为服务器返回该请求的结果缓存的到期时间
,即再次发送请求时,如果客户端的时间小于Expires的值
时,直接使用缓存结果 - Cache-Control主要用于控制网页缓存,主要取值为:
2.5 HTTP 缓存 – 存储位置
2.5.1 内存缓存(from memory cache)
快速读取
- 内存缓存会将
编译解析后的文件
,直接存入该进程的内存中
,占据该进程一定的内存资源
,以方便下次运行使用时的快速读取
时效性
2.5.2 硬盘缓存(from disk cache)
- 硬盘缓存
- 硬盘缓存则是
直接将缓存写入硬盘文件中
,读取缓存需要对该缓存存放的硬盘文件进行I/O操作
,然后重新解析该缓存内容
,读取复杂
,速度比内存缓存慢
2.5.3 总结
- 在浏览器中,浏览器读取缓存的顺序(
memory –> disk –> 服务器请求
) - 浏览器会在
js
和图片
等文件解析执行后直接存入内存缓存中
- 那么当
刷新页面
时只需直接从内存缓存中读取
- 而
css文件
则会存入硬盘文件
中,所以每次渲染页面都需要从硬盘读取缓存
2.6 HTTP 缓存 – 协商缓存
- 协商缓存就是
强制缓存失效后
,浏览器携带缓存标识向服务器发起请求
,由服务器根据缓存标识决定是否使用缓存
的过程
2.6.1 协商缓存生效,返回304
2.7 HTTP 缓存 – 协商缓存规则
- 协商缓存的标识也是在
响应报文的 HTTP 头中和请求结果一起返回给浏览器
的,控制协商缓存的字段分别有 Last-Modified
If-Modified-Since
Etag
If-None-Match
2.7.1 Last-Modified
- 表示
服务端资源最后修改的时间
,也就是传给客户端,用于告诉客户端
,服务端资源最后修改的时间
2.7.2 If-Modified-Since
- 表示
询问服务端
,从某个时间点起资源是否修改了
- 这个时间点
一般是服务端 Last-Modified 返回的时间点
2.7.3 Etag
- 表示
字符串唯一标识符
,也是传给客户端
,用于告诉客户端,表示服务端资源发生修改了的最新标识
2.7.4 If-None-Match
- 表示
询问服务端
,某个tag字符串值是否不匹配
,这个tag值一般是服务端Etag返回的最新的字符串标识符
3. 浏览器缓存
- 浏览器缓存主要由
前端开发在前端JS上进行设置
3.1 本地存储小容量
3.1.1 Cookie
- Cookie 主要用于
用户信息的存储
- Cookie 的内容可以
自动在请求的时候被传递给服务器
3.1.2 LocalStorage
- LocalStorage 的数据将
一直保存在浏览器内
,直到用户清除浏览器缓存数据为止
3.1.3 SessionStorage
- SessionStorage 的其他属性同 LocalStorage
- 只不过
它的生命周期同标签页的生命周期
,当标签页被关闭
时,SessionStorage 也会被清除
| 容量 | 作用 |
Cookie | 4KB | 请求时传递 |
LocalStorage | 5MB | 永久存储 |
SessionStorage | 5MB | 同标签页生命周期,不同页面间交换数据 |
3.2 本地存储大容量
WebSql
和 IndexDB
主要用在前端有大容量存储需求
的页面上 - 例如
| 介绍 | 容量 | 作用 |
WebSql | 关系型数据库 | 不知道,应该也是50MB左右 | 被 W3C 标准废弃 |
IndexDB | 非关系型数据库 | 50MB | 正常使用 |
3.3 往返缓存
- 往返缓存又称为
BFCache
,是浏览器在前进后退按钮上为了提升历史页面的渲染速度的一种策略
- 该策略具体表现为
当用户前往新页面时,将当前页面的浏览器DOM状态保存到bfcache中
当用户点击后退按钮的时候,将页面直接从bfcache中加载,节省了网络请求的时间
3.4 浏览器缓存的查看与使用
Web 端直接打开控制台
移动端可植入对应插件
3.5 浏览器缓存–代码演示
- 往
LocalStorage
、SessionStorage
里添加一个 num 变量
,并进行修改
和删除
操作
功能 | LocalStorage | SessionStorage |
增加 | localStorage.setItem(‘num’,1)或localStorage.num=1 | sessionStorage.setItem(‘num’,1)或sessionStorage.num=1 |
删除 | localStorage.removeItem(‘num’) | sessionStorage.removeItem(‘num’) |
修改 | localStorage.setItem(‘num’,2)或localStorage.num=2 | sessionStorage.setItem(‘num’,2)或sessionStorage.num=2 |
查询 | localStorage.getItem(‘num’) localStorage.num | sessionStorage.getItem(‘num’) sessionStorage.num |
Cookie设置: key = value ; expires = 过期时间; path = 作用路径; domain = 域名
document.cookie ="sRefid=1234567; expires=Web, 06 Jan 2021 17:29:20 GMT; path=/";domain=travelgo.com;
4. 总结
转载地址:http://tcqwi.baihongyu.com/