了解浏览器缓存

174 阅读2分钟

简介

浏览器缓存是浏览器在本地磁盘对用户最近请求过的文档进行存储,当访问者再次访问同一页面时,浏览器就可以直接从本地磁盘加载文档。

主要分两种:

  1. 强缓存
  2. 协商缓存 两者的共同点是,都是从客户端缓存中读取资源;区别是强缓存不会发请求,协商缓存会发请求
标题获取资源形式状态码发送请求到服务器
强缓存从缓存取200(from cache)否,直接从本地缓存取
协商缓存从缓存取304(not modified)是,通过服务器来告知本地缓存是否可用

强缓存

当浏览器去请求服务端资源的时候,服务端就在respone header里面对该资源做了缓存配置。缓存的时间、缓存类型都由服务端控制,具体表现为:respone header 的cache-control,常见的设置是max-age public private no-cache no-store等,如果你设置了cahe-control:max-age=31536000,public,每次用户正常打开这个页面,浏览器会判断缓存是否过期,没有过期就从缓存中读取数据。

Cache-Control头用来区分对缓存机制的支持情况, 请求头和响应头都支持这个属性。通过它提供的不同的值来定义缓存策略,值可以取多个。

  • private:仅浏览器可以缓存

  • public:浏览器和代理服务器都可以缓存

  • max-age=xxx:表示资源能够被缓存(保持新鲜)的最大时间

  • no-cache:不会走强缓存

  • no-store:不缓存,这个会让客户端、服务器都不缓存

协商缓存

向服务器发送请求,服务器会根据这个请求的request header的一些参数来判断是否命中协商缓存,如果命中,则返回304状态码并带上新的response header通知浏览器从缓存中读取资源;

response header里面的设置:

etag: '4a10casd-d3a8'
last-modified: Mon, 24 Dec 2021 10:51:03 GMT
  • etag:每个文件有一个,改动文件了就变了,就是个文件hash。
  • last-modified:文件的修改时间,精确到秒

每次请求返回来 response header 中的 etag和last-modified,在下次请求时在 request header 就把这两个(etag赋值给If-None-Match,last-modified赋值给If-Modified-Since)带上,服务端把你带过来的标识和当下资源的etag和last-modified进行对比,然后判断资源是否更改了,如果资源修改了,返回200,返回最新的资源,如果没有修改返回304,读取本地资源。