浏览器缓存的笔记。
使用缓存的过程
- 先看看是否命中强缓存(资源缓存存在且没有过期),命中则直接使用本地缓存,不发起请求。
- 若没有命中,再看看有没有命中协商缓存(资源存在个最后更新时间
Last-Modified或标识ETag)。命中了则把这些信息带上,去请求资源,如果服务器认为本地缓存还是可用,就返回 304 让服务器直接用本地资源 - 都没命中,正常请求。
强缓存
强缓存,是指直接使用客户端缓存好的资源,不会向服务器发出请求。但强缓存过期后,会重新发起请求,获取资源。但实际上,过期了我们还可以走 协商缓存,如果返回 304,就说明本地缓存还能用,不用大费周折地从服务器上下下来。
缓存的获取
浏览器根据服务器返回的 Expires 和 Cache-Control 来决定是否缓存资源和设置过期时间。Cache-Control 的值非常多,请看 这篇文章。
此外还有个 Pragma可以设置为 no-cache ,用于 HTTP/1.0。现在一般都不用这么低版本的 HTTP1.0 了,所以一般很少用。
Cache-Control优先级高于Expires
强缓存的数据分类
- Memory Cache ,内存缓存,特点是读取快。一般保存派生资源,如 CSS、JS、解码过后的图片数据。退出进程后销毁。(我看 base64 的文件好像都是 memory cache 的样子)
- Disk Cache ,硬盘缓存,将缓存持久化下来,读取相比内存缓存要慢。存储非脚本的派生资源。退出进程后不销毁,可以保存更长时间。
(问题:html 通常只有协商缓存,不用强缓存,那么它存在哪里?)
主资源和派生资源
- 主资源:HTML 页面或下载项。
- 派生资源:HTML 里内嵌的文件,如脚本、图片等
协商缓存
服务器还会提供 Last-Modified字段,这个字段表示资源最后被修改的时间。再次请求该资源时,我们把这个时间放到 If-Modified-Since 发给服务器。
服务器对比后发现一致,就会返回 304,也不返回真实资源。然后浏览器就可以放心地使用自己的本地缓存。(问题:这时候的返回,可能会提供新的 Expires 字段,触发强缓存机制吗?)
此外服务器还可能返回 ETag 头字段,它用于表示当前资源的唯一标识,类似哈希信息摘要的效果。再次请求时会把值放到 If-None-Match 字段里发送。同样,服务器如果发现值相同,就返回 304。
ETag优先级高于Last-Modified