李守彬的空间 2019-06-28
HTTP缓存( ETag、Cache-Control)——谷歌开发者
HTTP缓存有利于web性能优化
假设我们首页有一个请求,请求js文件<script src="./main.js"></script>
如何让CSS和JS请求速度加快?
此时打开首页
发现这个文件大小为279KB,使用时间为382ms
如果再次刷新首页,那么这个文件还会被再次请求一次。那么如何重复利用之前获取的资源而不用反复请求呢?答案是HTTP缓存,这是性能优化的一个重要方面。
接下来在响应里设置响应头Cache-Control: max-age=30
刷新两次首页
第二次的时间为0
响应头中的Cache-Control: max-age=30
表示客户端将这个缓存最多 保存30 秒,30秒后再次请求文件将会再次下载。
即:
设置这个响应头之后,浏览器请求时发现是相同的URL,浏览器直接从内存里返回已经缓存的main.js,没有向服务器发出请求
<script src="./main.js?v=2"></script>
,来保证URL的不同,重新获取新的js文件。这样即可以缓存很久,又可以随时更新例如知乎的网页里的请求:
通过网络获取内容既速度缓慢又开销巨大。较大的响应需要在客户端与服务器之间进行多次往返通信,这会延迟浏览器获得和处理内容的时间,还会增加访问者的流量费用。因此,缓存并重复利用之前获取的资源的能力成为性能优化的一个关键方面。好在每个浏览器都自带了 HTTP 缓存实现功能。您只需要确保每个服务器响应都提供正确的 HTTP
标头指令,以指示浏览器何时可以缓存响应以及可以缓存多久。
Expires: Wed, 21 Oct 2015 07:28:00 GMT
注意: 因为过期标准的时间用的是本地时间,所以不靠谱,所以要游侠使用Cache-Control代替Expires
MD5是消息摘要算法。用于确保信息传输完整一致。
具体作用这样
接受一个String 或 Buffer,返回一个固定的String
如果接受的String改变,那么返回的String也会改变
例如将1.txt中的其中一个1改为0,那么返回值如下
可见返回至完全改变了
这个特性可以用来判断两次信息传输是否完整一致
例如我们请求一个js文件。
设置一个ETag响应头
设置的ETage响应头为这个JS文件的MD5值
查看响应:
那么:下一次请求这个JS的时候,浏览器会把上一次响应的那个ETage的值放到If-None-Match里面,如图:
这样做的作用是:如果请求和响应的MD5一样,说明不需要重新下载这个js文件。这时我们修改代码:
如果MD5一样,说明文件没改过,那么返回304
304 Not Modified:
HTTP 304 未改变说明无需再次传输请求的内容,也就是说可以使用缓存的内容。
HTTP 304 没有响应体,因为不需要下载响应内容,直接用缓存就行了
假设我们请求两个文件,CSS文件使用Cache-Control缓存,js文件使用ETag。
代码如下:
两个请求区别:
所以:
我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/dev...