这里主要记录在平常中对知识的学习,经过结合笔记与自身理解的方式尝试写下总结
文章对细节可能不会一一介绍解释,内容仅做参考
复制代码
前些日子在面试的时候被问到有关前端优化的,其中回答了利用前端缓存,接着就被追问有关缓存的一些问题,但回答得不是很好,有必要再整理理解一下。因为目前只查阅了有关客户端缓存相关的知识,因此接下来内容都是围绕着它来说。固然了,其余方式的缓存也是要学习的javascript
平时中通常说的都是客户端缓存,固然啦,还有其余类别的。此处提供了解:html
使用缓存有以下优化:前端
缓存有时候也可能会带来不想要的结果,好比使用了缓存的数据致使没法实时呈现效果
也不能说是好坏,能够当成一个工具,想发挥什么样的做用,关键是看咱们怎么使用它java
客户端缓存方式主要分为强缓存和协商缓存两种面试
客户端缓存操做过程以下:ajax
1.浏览器首次请求资源:后端
2.浏览器后续请求资源:api
能够用图来更具体地说明一下:浏览器
浏览器首次请求资源 缓存
浏览器后续请求资源
与强缓存主要相关的header字段有expires和cache-control:max-age=number。而且若是cache-control与expires同时存在的话,cache-control的优先级高于expires
与协商缓存相关的header字段有Last-Modified/If-Modified-Since和Etag/If-None-Match
协商缓存是由服务器来肯定缓存资源是否可用的,因此客户端与服务器端要经过某种标识来进行通讯,从而让服务器判断请求资源是否能够缓存访问,这主要涉及到上面两组header字段,这两组搭档都是成对出现的
即第一次请求的响应头带上某个字段(Last-Modified或者Etag),则后续请求则会带上对应的请求字段(If-Modified-Since或者If-None-Match),若响应头没有Last-Modified或者Etag字段,则请求头也不会有对应的字段
Last-Modified和Etag的区别 在描述中对于Last-Modified和Etag的使用能够说是差很少的,可是,Etag(http1.1)的出现是为了解决几个Last-Modified比较难解决的问题:
Last-Modified与ETag是能够一块儿使用的,服务器会优先验证ETag,一致的状况下,才会继续比对Last-Modified,最后才决定是否返回304
缓存的位置大体分为如下三类:Service Worker,Memory Cache,Disk Cache 而且它们的优先级就是按照这个顺序,从前日后寻找,找到即返回;找不到则继续。若最后资源在这些地方都没有找到的话,再去服务器请求资源
service worker
用户自定义缓存哪些资源到硬盘上,什么状况下使用缓存(路由匹配规则),缓存匹配并返回
清空缓存的状况分两种:一是手动调用api,二是容量超过限制,被浏览器清除
这种方式缓存的资源查看方式:开发者工具 -> Application -> Cache Storage
当资源请求被发起的时候,浏览器首先从service worker中查找资源,若是缓存为命中,通常状况会使用fetch()方法继续获取资源,这时浏览器就去memory cache 或disk cache中进行下一次找缓存的工做
特别注意:通过fetch()方法获取的资源,都会显示 from ServiceWorker,无论资源实际状况是从memory cache 或disk cache,仍是从网络从新请求获取的
memory cache
内存中的缓存,几乎全部的网络请求资源都会被浏览器自动加入到memory cache中,被短时间存储,关闭浏览器窗口后memory cache就失效了
从memory cache中获取缓存内容的时候,浏览器会忽视例如max-age=0,no-cache等头部配置
但若是头部配置设置了no-store,那么资源就不会进入memory-cache
disk cache
硬盘上的缓存,持久存储,容许相同资源跨回话跨站点的使用
严格根据HTTP头部字段断定该缓存哪些资源,哪些资源可用,以及哪些资源过时了须要从新请求
当请求命中缓存时,就从硬盘中读取资源。绝大多数的缓存都来自disk cache
查询咨询来源:
Chrome开发工具 -> network -> 查看size那一列的值
xxk:网络请求
form memory cache
disk cache
from ServiceWorker
<META HTTP-EQUIV="pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate">
<META HTTP-EQUIV="expires" CONTENT="0">
复制代码
If-Modified-Since: 0
Cache-Control: no-cache
复制代码
url + ? ran = Math.random()/new Date().getTime()
复制代码