浏览器原理面试题 前端「前端面试进阶之浏览器原理」( 九 )


多个页面可以使用相同的 HTTP/2 连接,也就是说能使用同样的缓存
Push Cache 中的缓存只能被使用一次
浏览器可以拒绝接受已经存在的资源推送
可以给其他域名推送资源
3. 协商缓存和强缓存的区别
(1)强缓存
使用强缓存策略时 , 如果缓存资源有效,则直接使用缓存资源,不必再向服务器发起请求 。
强缓存策略可以通过两种方式来设置,分别是 http 头信息中的 Expires 属性和 Cache-Control 属性 。
(1)服务器通过在响应头中添加 Expires 属性,来指定资源的过期时间 。在过期时间以内,该资源可以被缓存使用 , 不必再向服务器发送请求 。这个时间是一个绝对时间,它是服务器的时间,因此可能存在这样的问题,就是客户端的时间和服务器端的时间不一致,或者用户可以对客户端时间进行修改的情况,这样就可能会影响缓存命中的结果 。
(2)Expires 是 http1.0 中的方式,因为它的一些缺点,在 HTTP 1.1 中提出了一个新的头部属性就是 Cache-Control 属性,它提供了对资源的缓存的更精确的控制 。它有很多不同的值,
Cache-Control可设置的字段:
public:设置了该字段值的资源表示可以被任何对象(包括:发送请求的客户端、代理服务器等等)缓存 。这个字段值不常用,一般还是使用max-age=来精确控制;
private:设置了该字段值的资源只能被用户浏览器缓存,不允许任何代理服务器缓存 。在实际开发当中 , 对于一些含有用户信息的HTML,通常都要设置这个字段值,避免代理服务器(CDN)缓存;
no-cache:设置了该字段需要先和服务端确认返回的资源是否发生了变化,如果资源未发生变化,则直接使用缓存好的资源;
no-store:设置了该字段表示禁止任何缓存,每次都会向服务端发起新的请求,拉取最新的资源;
max-age=:设置缓存的最大有效期,单位为秒;
s-maxage=:优先级高于max-age= , 仅适用于共享缓存(CDN),优先级高于max-age或者Expires头;
max-stale[=]:设置了该字段表明客户端愿意接收已经过期的资源,但是不能超过给定的时间限制 。
一般来说只需要设置其中一种方式就可以实现强缓存策略,当两种方式一起使用时,Cache-Control 的优先级要高于 Expires 。
no-cache和no-store很容易混淆:
no-cache 是指先要和服务器确认是否有资源更新,在进行判断 。也就是说没有强缓存,但是会有协商缓存;
no-store 是指不使用任何缓存,每次请求都直接从服务器获取资源 。
(2)协商缓存
如果命中强制缓存 , 我们无需发起新的请求 , 直接使用缓存内容 , 如果没有命中强制缓存 , 如果设置了协商缓存,这个时候协商缓存就会发挥作用了 。
上面已经说到了,命中协商缓存的条件有两个:
max-age=xxx 过期了
值为no-store
使用协商缓存策略时,会先向服务器发送一个请求,如果资源没有发生修改,则返回一个 304 状态,让浏览器使用本地的缓存副本 。如果资源发生了修改,则返回修改后的资源 。
协商缓存也可以通过两种方式来设置,分别是 http 头信息中的 Etag 和 Last-Modified 属性 。
(1)服务器通过在响应头中添加 Last-Modified 属性来指出资源最后一次修改的时间,当浏览器下一次发起请求时,会在请求头中添加一个 If-Modified-Since 的属性,属性值为上一次资源返回时的 Last-Modified 的值 。当请求发送到服务器后服务器会通过这个属性来和资源的最后一次的修改时间来进行比较,以此来判断资源是否做了修改 。如果资源没有修改,那么返回 304 状态,让客户端使用本地的缓存 。如果资源已经被修改了,则返回修改后的资源 。使用这种方法有一个缺点,就是 Last-Modified 标注的最后修改时间只能精确到秒级,如果某些文件在1秒钟以内,被修改多次的话,那么文件已将改变了但是 Last-Modified 却没有改变,这样会造成缓存命中的不准确 。