传送门:https://www.cnblogs.com/chengxs/p/10396066.html
Expires、Cache-Control Etag / If-None-Match Last-Modified / If-Modified-Since
缓存方式有硬盘缓存和内存缓存
请求分为xhr、js、css、img请求,xhr为页面运行时的接口请求,其他的为静态资源请求
在浏览器中,浏览器会在js和图片等文件解析执行后直接存入内存缓存中,那么当刷新页面时只需直接从内存缓存中读取(from memory cache);而css文件则会存入硬盘文件中,所以每次渲染页面都需要从硬盘读取缓存(from disk cache)
1.强缓存:不会向服务器发送请求,直接从缓存中读取资源,在chrome控制台的network选项中可以看到该请求返回200的状态码;from memory cache 或者 from disk cache(一定有from标识来源,没有from的话则用的不是缓存资源)
强缓存过期或者不存在的情况下发起请求: 2.协商缓存:向服务器发送请求,服务器会根据这个请求的request header(为上次响应头拿到的)的一些参数来判断是否命中协商缓存,如果命中,则返回304状态码并带上新的response header通知浏览器从缓存中读取资源;
强缓存和协商缓存 在介绍缓存的时候,我们习惯将缓存分为强缓存和协商缓存两种。两者的主要区别是使用本地缓存的时候,是否需要向服务器验证本地缓存是否依旧有效。顾名思义,协商缓存,就是需要和服务器进行协商,最终确定是否使用本地缓存。 两者的共同点是,都是从客户端缓存中读取资源;区别是强缓存不会发请求,协商缓存会发请求
其实就是先判断有无缓存?有,进行强缓存判断,例如:判断是否过期,否,直接使用缓存。过期,发送请求,根据新的响应头,判断是否命中协商缓存,命中,继续使用之前的缓存,没命中,使用新的资源。
有人说不设置强缓存单独使用协商缓存是无意义的,但是在多人共享下载文件的时候,若使用了强缓存,则下载的文件可能不是最新的(至少得保证是当前时间最新的),这里应该就是直接用协商缓存去判断改缓存到底还是不是最低的。但是,任何东西都直接用协商缓存,每次都要发起请求,要缓存还有什么意义?所以要看具体场景。(个人理解,理解错误评论区可以教一下)
强制使用本地缓存,那么如何告知刷新缓存?让请求(header加上ETag)或者url的修改与文件内容关联(文件名加哈希值)
上线是先发页面还是静态资源?覆盖式发布和非覆盖式发布?分集群部署?