实现f5效果_f5到底刷新了点什么,你知道吗

本文就会去探究下不同行为下的浏览器缓存表现。也就是f5到底刷新了哪些内容

浏览器缓存

说道浏览器缓存,脑海中常见的应该是那么几种关键词:
Cache-Control、Expires、ETag、If-Match、If-None-Match、Last-Modified等。

根据不同标识的作用,再次访问某个资源时,
需要缓存的情况下,主要有下面两种缓存方式 强缓存
一旦资源命中强缓存, 浏览器便不会向服务器发送请求, 而是直接读取缓存.
Chrome下的现象是 200 OK (from disk cache) 或者 200 OK (from memory cache). 协商缓存
也就是我们常见的304状态码。
缓存过期后, 继续请求该资源,对于现代浏览器, 存在如下两种做法:

  • 根据上次响应中的ETag_value, 自动往request header中添加If-None-Match字段.
    服务器收到请求后, 拿If-None-Match字段的值与资源的ETag值进行比较, 若相同, 则命中协商缓存, 返回304响应.
  • 根据上次响应中的Last-Modified_value, 自动往request header中添加If-Modified-Since字段. 服务器收到请求后, 拿If-Modified-Since字段的值与资源的Last-Modified值进行比较, 若相同, 则命中协商缓存, 返回304响应.

ETag是http/1.1新增标识,也是为了解决Last-Modified存在的一些问题。
例如服务器和客户端时间不同步等问题,
所以比Last-Modified的优先级高。
因此常见情况下,资源的缓存就是按照上面的顺序,强缓存=>协商缓存=>重新获取。
但是,缓存策略是与用户的操作相关的,平时不可避免会用到刷新。
刷新的方式是多种多样的。刷新按钮,command+r,shift+command+r等。他们之间的区别是什么呢。以xxdy.tech/作为例子来看一下。
再次访问(地址栏回车)
可以看到资源分下面几类: 先看下直观的请求

9bb7f23ed47cd529be2fa0fd31853526.png

大部分都是200强缓存,只有文稿是304

  1. 无缓存的,maxage=0的资源

8f3c26497785cf483cdbdde980f0fcc1.png

此类资源,请求的时候总会从服务端重新加载

  1. status为200,但是后面有提示from memory cache 或者disk cache的标识。 这种缓存的字体为灰色,跟上面的200还是比较容易看出来差别的。

css资源的响应,来自硬盘缓存。

2852a76a1af92dbdb25d0dd05a1c7eab.png

js的响应,即来自memory的缓存

5d368e8f8ba1519be1020a9c1a3aa9eb.png


这里就是强缓存,直接从本地缓存中读取。
因为Cache-Control:max-age=600 刷新时未过期,所以会从本地缓存中获取。

c6b4d0a223428843f5b3555e5b7c46b1.png


这里截两张图的原因在于两者缓存存放的位置是不同。 概述一下(详细请找资料细究)

  • 内存缓存(from memory cache):内存缓存具有两个特点,分别是快速读取和时效性 快速读取:内存缓存会将编译解析后的文件,直接存入该进程的内存中,占据该进程一定的内存资源,以方便下次运行使用时的快速读取
    时效性:一旦该进程关闭,则该进程的内存则会清空。
  • 硬盘缓存(from disk cache):硬盘缓存则是直接将缓存写入硬盘文件中,读取缓存需要对该缓存存放的硬盘文件进行I/O操作,然后重新解析该缓存内容,读取复杂,速度比内存缓存慢。

在浏览器中,大部分情况下浏览器会在js和图片等文件解析执行后直接存入内存缓存中,
那么当刷新页面时只需直接从内存缓存中读取(from memory cache);
而css文件则会存入硬盘文件中,所以每次渲染页面都需要从硬盘读取缓存(from disk cache)

  1. 协商缓存

status为304,意为与服务端对比之后文件未改变,返回原有缓存资源。

ffef3bd7c90fbc875e0c910840907f2a.png


此资源请求头里面有Cache-Control: max-age=0 ,
所以每次请求都回去服务端询问,不会走强缓存,因为服务端也未更新,etag相同,所以返回缓存资源。 总结


地址栏回车的话,就是我们正常访问,遵循浏览器的缓存策略。
f5刷新(mac 即command + r)
f5刷新的时候,会有什么不同吗,先直观对比下。

cd1903555bd5c4b141cf64d74e560eac.png


好像没什么不同,具体到文件也是与直接回车相同的状态。


总结

那么f5的刷新到底是什么呢,
可以看到f5可以被称为soft refresh 其只是reload page而已。
即与回车地址相同,正常规则下的缓存还是会涉及到。
强制刷新(command+shift+r)
此时可以看下请求结果,前面列出的304和from cache的项目都是重新load。

cd1903555bd5c4b141cf64d74e560eac.png


具体查看相应请求可以看到,
在request中多了个属性: 都有Cache-Control: no-cache的标识。
这表明每次都需要服务器评估是否有效,不要理解为直接不使用缓存。
此外可以注意到request中没有可以匹配response中ETag的If-None-Match属性,
所以会重新加载。

7423eae7428e73f117f0913a4e61db04.png

总结而言
此时的刷新可以称为hard refresh,
请求会加上一个Cache-Control:no-cache的标识来表明突破cache-control的限制,
需要服务端重新判断有效性,即不走强缓存。
另外请求header中去掉If-None-Match,这样就不能使用协商缓存。拉到新的资源
tip
这里硬性重新加载,有些文件是依旧使用缓存的,我这边看到是有些小的image,没有找到合理的解释。具体我需要在研究一下,后面补上

9aa921f5f2cc4d8171be1b6cecab3ea0.png


停用缓存并刷新
针对上面提到的哪些文件,此时就需要到下面这种清空缓存并硬性重新加载了。

e2338b887b339ef0d85a0940742dd920.png


操作完之后就完全不使用缓存了。
规则
上面提到那么几种刷新方式对应的效果,可能不同浏览器的实现也不同。找了个相对完善的大家可以参考一下。

b60c6e5b34feed2b8f6ad911d3162cd5.png

摘自 https://juejin.im/post/5bfcd79e6fb9a04a08215cf3


结束语
到这里,关于刷新与缓存的个人一些关掉就结束了,抛砖引玉,希望能对有需要的人有所帮助,也希望有大神有所指教.
此外感谢下面的参考文章:
stackoverflow.com/questions/8…
stackoverflow.com/questions/3…

其他tags:

provisional headers are shown (显示临时报头)

真正请求并未被发送,当使用缓存时经常发生。
之所以会出现这个信息是因为获取相关资源的请求并没有发出,
所以headers被展示并不是真正的信息。
就像提到的那样,真正的header只有在服务端返回的时候会更新。
当请求被拦截后,并没有返回。
provisional headers are shown出现的情况有这么几种:

  1. 跨域,请求被浏览器拦截
  2. 请求被浏览器插件拦截
  3. 服务器出错或者超时,没有真正的返回
  4. 强缓存from disk cache或者from memory cache,此时也不会显示

cc719f7837354ab6cafa856d8d30dce9.png

⚠️ Provisional headers are shown 和Date字段可以看出来, 浏览器并未发出请求, 缓存依然有效, 只不过此时Status Code显示为200 OK. (甚至我还专门打开了charles, 也没有发现该资源的任何请求, 可见这个200 OK多少有些误导人的意味)

可见, 启发式缓存算法采用的缓存时间可长可短, 因此对于常规资源, 建议明确设置缓存时间(如指定max-age 或 expires).

Expires VS. max-age

Expires和max-age都是用于控制缓存的生命周期。不同的是Expires指定的是过期的具体时间,例如Sun, 21 Mar 2027 08:52:14 GMT,而max-age指定的是生命时长秒数315360000。

区别在于Expires是 HTTP/1.0 的中的标准,而max-age是属于Cache-Control的内容,是 HTTP/1.1 中的定义的。但为了想向前兼容,这两个属性仍然要同时存在。

但有一种更倾向于使用max-age的观点认为Expires过于复杂了。例如上面的例子Sun, 21 Mar 2027 08:52:14 GMT,如果你在表示小时的数字缺少了一个0,则很有可能出现出错;如果日期没有转换到用户的正确时区,则有可能出错。这里出错的意思可能包括但不限于缓存失效、缓存生命周期出错等。

304协商缓存

缓存过期后, 继续请求该资源, 对于现代浏览器, 拥有如下两种做法:

  • 根据上次响应中的ETag_value, 自动往request header中添加If-None-Match字段. 服务器收到请求后, 拿If-None-Match字段的值与资源的ETag值进行比较, 若相同, 则命中协商缓存, 返回304响应.
  • 根据上次响应中的Last-Modified_value, 自动往request header中添加If-Modified-Since字段. 服务器收到请求后, 拿If-Modified-Since字段的值与资源的Last-Modified值进行比较, 若相同, 则命中协商缓存, 返回304响应.

以上, ETag优先级比Last-Modified高, 同时存在时, 前者覆盖后者. 下面通过实例来理解下强缓存和协商缓存.

如下忽略首次访问, 第二次通过 If-Modified-Since 命中了304协商缓存.

5c7f62c9cb0cdc87fb84a281e426e529.png

强缓存

一旦资源命中强缓存, 浏览器便不会向服务器发送请求, 而是直接读取缓存. Chrome下的现象是 200 OK (from disk cache) 或者 200 OK (from memory cache). 如下:

3ab65146ecbe435db1297480fe57e94b.png

a1742c32fa64b6fc1682cf42dfd3b5c2.png

对于常规请求, 只要存在该资源的缓存, 且Cache-Control:max-age 或者expires没有过期, 那么就能命中强缓存.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值