浏览器缓存是前端优化的一个重要手段,缓存可以带来很多好处:
- 减少冗余数据传输,节省带宽
- 减轻服务器的请求负担,有缓存就可以减少向服务器发送请求
- 资源从缓存中读取,无需向服务器发送请求再等待返回,加快了客户端的访问速度
但缓存带了了一个问题,就是如果文件更新了,但用户访问时浏览器读取的是缓存资源,则用户就获取不到最新的页面,影响用户使用。这种情况如何解决呢?
浏览器缓存主要是指http缓存,其机制是根据http报文的缓存标识进行相应的操作。
状态码 | 含义 |
---|---|
200 from memory cache | 状态码灰色,从内存中读取资源,不请求服务器,页面关闭时,资源会被内存释放(一般脚本、字体、图片会存在内存中) |
200 from disk cache | 状态码灰色,从磁盘中读取资源,不请求服务器,页面关闭不会释放资源,只有当用户手动清除浏览器缓存时方可释放(一般非脚本会存放在内存中,如css等) |
200 | 从服务器下载最新资源 , size 为从服务器获取的全部资源大小 |
304 | 访问服务器,发现资源未更新,使用本地资源,size为服务器通信报文大小 |
浏览器有三级缓存原理:
- 先查找内存,如果内存中存在,则从内存中进行加载
- 如果内存中无,查硬盘,硬盘中有则从硬盘中加载资源
- 内存无,硬盘无,则进行网络请求,加载到的资源缓存到硬盘或者内存中
浏览器缓存分为强制缓存和协商缓存
强制缓存
用户第一次访问时,浏览器将数据存在缓存中,在过期时间内,都不会再请求服务器。
是否使用强缓存在于资源是否过期,过期时间从第一次请求服务器响应头总获取。
控制强制缓存的字段为Expires 和 cache-control,其中cache-control优先级比Expires搞
协商缓存
协商缓存即浏览器和服务器协商。
第一次请求服务器时,服务器返回资源,且带有一个资源的标识符,浏览器将资源及资源标识符存到缓存中。
当第二次请求资源时,浏览器会首先将缓存标识发送给服务器,服务器拿到标识后,判断资源是否更新;
如果更新则将新数据和新的标识符一同返回;
如未更新则返回304状态码,浏览器读取本地缓存服务器中的数据
协商缓存字段:Last-Modified/IF-Modified-Since、Etag/IF-None-Match
Last-modified和Etag可以一起使用,服务器会优先验证Etag,一致的情况下,才会继续对比Last-modified,最终才决定是否返回304