1. 强缓存
第一次进入页面,请求服务器,服务器应答。浏览器根据response Header来判断是否对资源进行缓存,响应头中有expires、pragma或者cache-control字段,代表强缓存。浏览器把资源缓存在memory cache 或disk cache中。
expires 是http1.0控制网页缓存的字段,值是一个时间戳,服务器返回的请求结果的到期时间。当再次请求时,时间未超过,直接使用缓存,过期则重新请求。缺点: 判断是否过期使用的本地时间,本地时间可以修改或者客户端和服务端的时区不一样,都会产生问题。
cache-control 是http1.1中控制网页缓存的字段,优先级高于expires,取值有:
public:资源客户端和服务器端都可以缓存。
private: 资源只能在服务器端缓存
no-cache: 客户端缓存资源,但是是否缓存需要进过协商缓存来验证
no-store: 不使用缓存
max-age: 缓存保质期,使用的相对时间,解决了expires的问题。
pragmahttp1.0中禁用网页缓存的字段,值为no-cache,和cache-control的no-cache效果一样
缓存位置
内存缓存(Memory Cache):读取数据块,持续性短,随着进程释放而释放。一旦关闭页面,内存释放。
硬存缓存(Disk Cache):读取慢,时效性长。
Service Worker:是运行在浏览器背后的独立线程,一般用于实现缓存功能,传输协议必须是https.
预取缓存(prefetch cache):是预加载的一种方式,被标记prefetch的资源,将在浏览器空闲时间加载。
推送缓存(push cache):是http/2的内容,当以上3种缓存都没有命中时,才会被使用。它只在会话session中存在,一旦会话结束就被释放,并且缓存时间很短,在chrome浏览器中只有5分钟,同时也非严格执行http投中的缓存指令。
协商缓存
Last-Modified / If-Modified-Since
在请求头中Last-Modified是服务器响应请求时,返回该资源文件在服务器短最后被修改的时间。If-Modified-Since是客户端再次发起该请求,告诉服务器该资源上次请求返回的最后被修改时间。服务器收到该请求,发现请求头上含有If-Modified-Since字段,则会根据if-Modified-Since字段的值和最后一次被修改时间做对比,大于就重新返回资源。状态码200,小于则状态码304,使用缓存文件。
Etag/If-None-Match
Etag是服务器响应时,返回当前资源文件的一个唯一标识(由服务器生成)
If-None-Match客户端再次发起请求时,携带上一次请求返回的Etag值,告诉服务器该资源上一次请求返回的唯一标识值。服务器收到该请求后,发现请求头含有If-None-Match,就会于Etag值比较,一致则返回304,不一则重新返回资源文件。状态码200.
Etag/If-None-Match优先级高于Last-Modified / If-Modified-Since,同时存在则只有Etag / If-None-Match。
缓存方案
目前的项目大多数都使用:
HTML:协商缓存
css、js、图片:强缓存,文件名上带上hash