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


return response
}
console.log('fetch source')
})
)
})
打开页面,可以在开发者工具中的 Application 看到 Service Worker 已经启动了:
image
在 Cache 中也可以发现所需的文件已被缓存:
image
三、浏览器缓存
1. 对浏览器的缓存机制的理解
浏览器缓存的全过程:
浏览器第一次加载资源,服务器返回 200,浏览器从服务器下载资源文件,并缓存资源文件与 response header,以供下次加载时对比使用;
下一次加载资源时,由于强制缓存优先级较高,先比较当前时间与上一次返回 200 时的时间差,如果没有超过 cache-control 设置的 max-age,则没有过期,并命中强缓存,直接从本地读取资源 。如果浏览器不支持HTTP1.1,则使用 expires 头判断是否过期;
如果资源已过期,则表明强制缓存没有被命中,则开始协商缓存 , 向服务器发送带有 If-None-Match 和 If-Modified-Since 的请求;
服务器收到请求后,优先根据 Etag 的值判断被请求的文件有没有做修改 , Etag 值一致则没有修改,命中协商缓存,返回 304;如果不一致则有改动 , 直接返回新的资源文件带上新的 Etag 值并返回 200;
如果服务器收到的请求没有 Etag 值,则将 If-Modified-Since 和被请求文件的最后修改时间做比对 , 一致则命中协商缓存,返回 304;不一致则返回新的 last-modified 和文件并返回 200;
业务流程图1.png
很多网站的资源后面都加了版本号,这样做的目的是:每次升级了 JS 或 CSS 文件后,为了防止浏览器进行缓存,强制改变版本号 , 客户端浏览器就会重新下载新的 JS 或 CSS 文件 ,以保证用户能够及时获得网站的最新更新 。
2. 浏览器资源缓存的位置有哪些?
资源缓存的位置一共有 3 种,按优先级从高到低分别是:
Service Worker:Service Worker 运行在 JavaScript 主线程之外,虽然由于脱离了浏览器窗体无法直接访问 DOM,但是它可以完成离线缓存、消息推送、网络代理等功能 。它可以让我们自由控制缓存哪些文件、如何匹配缓存、如何读取缓存,并且缓存是持续性的 。当 Service Worker 没有命中缓存的时候,需要去调用 fetch 函数获取 数据 。也就是说,如果没有在 Service Worker 命中缓存,会根据缓存查找优先级去查找数据 。但是不管是从 Memory Cache 中还是从网络请求中获取的数据 , 浏览器都会显示是从 Service Worker 中获取的内容 。
**Memory Cache:**Memory Cache 就是内存缓存 , 它的效率最快,**但是内存缓存虽然读取高效,可是缓存持续性很短,会随着进程的释放而释放 。**一旦我们关闭 Tab 页面,内存中的缓存也就被释放了 。
**Disk Cache:**Disk Cache 也就是存储在硬盘中的缓存,读取速度慢点,但是什么都能存储到磁盘中 , 比之 Memory Cache **胜在容量和存储时效性上 。**在所有浏览器缓存中,Disk Cache 覆盖面基本是最大的 。它会根据 HTTP Herder 中的字段判断哪些资源需要缓存 , 哪些资源可以不请求直接使用,哪些资源已经过期需要重新请求 。并且即使在跨站点的情况下,相同地址的资源一旦被硬盘缓存下来,就不会再次去请求数据 。
**Disk Cache:**Push Cache 是 HTTP/2 中的内容,当以上三种缓存都没有命中时,它才会被使用 。**并且缓存时间也很短暂,只在会话(Session)中存在,一旦会话结束就被释放 。**其具有以下特点:
所有的资源都能被推送,但是 Edge 和 Safari 浏览器兼容性不怎么好
可以推送 no-cache 和 no-store 的资源
一旦连接被关闭 , Push Cache 就被释放