!!!!自己学习理解用,仅供参考!!!!
浏览器缓存策略分为两种 强缓存(本地缓存) 和 协商缓存(弱缓存)。
浏览器在发请求前,先检查强缓存,若没有需要的内容(未命中),则发起请求判断是否需要用弱缓存。
1、简单的概括
强缓存是不发起请求,直接使用缓存内的内容的。浏览器将js
、css
、image
、font-family
等存到内存(存小文件)或者磁盘(存大文件)中,下次用户再访问的时候就从内存中取,以便提升性能。
协商缓存需要往后台发请求, 通过判断来决定是使用协商缓存。如果请求内容没发生变化,则请求返回304(服务器收到请求,但内容无变化),浏览器就用缓存内的内容。
2、强缓存如何触发
http1.0 使用 Expires 响应标头
如果服务器返回的响应标头中包含Expires
(时间戳),那么客户端发起请求的时间在Expires
之前的话,就触发强缓存。
http1.1 使用 Cache-Control 响应标头
同样是服务器返回的一个响应标头, 提供一些配置选项,其优先级比Expires高。(来源:百度百科)
常用的配置就是
public
、private
、max-age
。 下面这个例子是从某个网站的请求中copy来的,仅供参考。
cache-control: 'private, must-revalidate, no-cache, no-store, max-age=0, post-check=0, pre-check=0'
3、协商缓存怎么触发
http1.0 使用 请求头:If-Modified-Since , 响应头:Last-Modified
服务器在上一次响应请求时,返回一个带Last-Modified
的响应头,值为一个时间戳,表示该资源最后一次在服务器修改的时间。当客户端再一次请求这个资源的时候, 请求头就会带上If-Modified-Since
,值为上次服务器发来的Last-Modified
, 服务器收到后,就和该资源最后修改时间比对, 没变化就返回304, 触发协商缓存。
弊端: 时间间隔最小为1s,如果请求的资源在1s内发生了改变,是可能会触发协商缓存的, 导致无法获取到最新的资源。
http1.1 使用 请求头:If-None-Match , 响应头: Etag
为解决间隔最小1s的问题, If-None-Match
和Etag
就诞生了。 Etag
是由服务器生成的, 是每个资源的唯一标识字符串, 随资源变化而改变。 判断过程和http1.0的一致,请求的时候携带 If-None-Match
,然后服务器比较这两个值,没变化就返回304, 触发协商缓存。
弊端: 占用服务器资源较多, 虽然准确度高,但是性能上不如Last-Modified & If-Modified-Since
的方法。不过实际的影响不会很大, 基本上可以忽略不计。
补充
即便我们没有配置缓存策略,浏览器也会采用自己的算法来缓存资源。