浏览器缓存策略讲的就是HTTP缓存策略
缓存策略在HTTP中的大致流出如下: 1. 浏览器发送请求前,根据请求头的expires和cache-control判断是否命中(包括是否过期)强缓存策略,如果命中,直接从缓存获取资源,并不会发送请求。如果没有命中,则进入下一步。 2. 没有命中强缓存规则,浏览器会发送请求,根据请求头的last-modified和etag判断是否命中协商缓存,如果命中,直接从缓存获取资源。如果没有命中,则进入下一步。 3. 如果前两步都没有命中,则直接从服务端获取资源。

当浏览器向服务器发起请求时,服务器会将缓存规则放入HTTP响应报文的HTTP头中和请求结果一起返回给浏览器,控制强制缓存的字段分别是ExpiresCache-Control,其中Cache-Control优先级比Expires

浏览器命中缓存的优先级如下

Service Worker -> Memory Cache -> Disk Cache -> Push Cache

memory cache

MemoryCache顾名思义,就是将资源缓存到内存中,等待下次访问时不需要重新下载资源,而直接从内存中获取。Webkit早已支持memoryCache。
目前Webkit资源分成两类,一类是主资源,比如HTML页面,或者下载项,一类是派生资源,比如HTML页面中内嵌的图片或者脚本链接,分别对应代码中两个类:MainResourceLoader和SubresourceLoader。虽然Webkit支持memoryCache,但是也只是针对派生资源,它对应的类为CachedResource,用于保存原始数据(比如CSS,JS等),以及解码过的图片数据。

强缓存

和强缓存相关的是expire 和 cache-control,同时存在的时候 后者优先

expire

expire设置的是它是一个 GMT 格式的时间字符串,表示缓存的截止时间,在这个时间之前,不需要向服务端发起资源请求;0表示马上过期

cache-control

  • public:所有内容都将被缓存(客户端和代理服务器都可缓存)
    - private:所有内容只有客户端可以缓存,Cache-Control的默认取值
    - no-cache:客户端缓存内容,但是是否使用缓存则需要经过协商缓存来验证决定
    - no-store:所有内容都不会被缓存,即不使用强制缓存,也不使用协商缓存
    - max-age=xxx (xxx is numeric):缓存内容将在xxx秒后失效

弱缓存(协商缓存)

和弱缓存相关的是Last-Modified / If-Modified-SinceEtag / If-None-Match
浏览器发起请求的时候会将If-Modified-Since的值带上,而If-Modified-Since的值是上一次浏览器返回来 Last-Modified的值,服务端进行对比,如果相等则返回304并且不会返回资源内容,并且不会返回 Last-Modify,否者返回200

Etag / If-None-Match的逻辑类似,ETag解决的是Last-Modified的值问题,Last-Modified的值用的是绝对值,会因为时区或者系统时间的修改而导致出问题,ETag的出现就是解决这个问题,用了相对值
**

浏览器中的disable cache选项起了什么作用

image.png
首先,不会删除浏览器缓存,因为可以通过☑️上和取消勾选来验证一下是否会删除本地已经缓存的内容
其次,打钩之后,会在请求头上加上cache-control:no-cache ,pragma:no-cahce表示不用强缓存效果和ctr+f5一样

浏览器中的 DNS缓存

在HTTP请求中,TTFB和content-download都是占用时间比较多的环节,而dns影响的是TTFB,所以做好DNS对优化TTFB有一定的帮助,当然影响TTFB更多的还是后端的数据查询和处理等