HTTP的场景实践 | 青训营

56 阅读3分钟

HTTP的缓存策略在浏览器中扮演着重要的角色,能够帮助提高性能和减少网络流量。下面我将以Google Chrome浏览器为例,对其涉及的请求中的缓存策略展开具体分析。

HTTP缓存策略概述

  1. 强缓存:浏览器直接使用本地缓存,不发送请求到服务器。
  2. 协商缓存:浏览器发送请求到服务器,服务器根据请求头中的条件判断是否返回新的资源。

二、浏览器的缓存策略分析

强制缓存策略

首先,浏览器会通过检查响应头中的Cache-ControlExpires字段来判断资源是否可缓存。

  • 如果响应头中包含了Cache-Control字段,并且值为max-age,则表示资源可以缓存的时间,单位为秒。浏览器在过期前不会发送请求到服务器,而是直接使用缓存。例如:
    Cache-Control: max-age=3600
    
  • 如果响应头中包含了Expires字段,则表示资源的过期时间,即在该时间之前,浏览器不会发送请求到服务器。例如:
    Expires: Thu, 01 Dec 2023 16:00:00 GMT
    

如果以上两个字段同时存在,Cache-Control的优先级会高于Expires

协商缓存策略

当资源的缓存时间过期或者浏览器强制不使用本地缓存时,浏览器会发送请求到服务器,并在请求头中包含与缓存相关的字段。

  • If-Modified-Since字段:浏览器发送的请求中会包含上次获取资源时的Last-Modified字段的值,服务器通过比较请求头中的If-Modified-Since和资源的最后修改时间来判断是否需要返回新的资源。如果资源未改变,则服务器返回304 Not Modified状态码,浏览器使用本地缓存。例如:
    If-Modified-Since: Thu, 01 Dec 2023 15:00:00 GMT
    
  • If-None-Match字段:浏览器发送的请求中会包含上次获取资源时的ETag字段的值,服务器通过比较请求头中的If-None-Match和资源的唯一标识符来判断是否需要返回新的资源。如果资源未改变,则服务器返回304 Not Modified状态码,浏览器使用本地缓存。例如:
    If-None-Match: "abcdefg"
    

以上是浏览器在请求中涉及的缓存策略分析。下面是一个示例代码,模拟浏览器请求并对响应进行处理:

const url = 'https://example.com/resource';

// 发送请求到服务器
fetch(url, {
  method: 'GET',
  headers: {
    'Cache-Control': 'no-cache',
    'If-Modified-Since': 'Thu, 01 Dec 2023 15:00:00 GMT',
    'If-None-Match': 'abcdefg'
  }
})
.then(response => {
  if (response.status === 200) {
    // 资源未改变,使用本地缓存
    console.log('使用本地缓存');
  } else if (response.status === 304) {
    // 资源已改变,返回新的资源
    console.log('返回新的资源');
  } else {
    // 其他状态码处理
    console.log('其他状态码');
  }
})
.catch(error => {
  console.error('请求出错:', error);
});

以上代码通过设置请求头中的Cache-Control字段为no-cache,表示不使用强缓存,而是发送请求到服务器。同时,还设置了If-Modified-SinceIf-None-Match字段,模拟了浏览器发送请求时包含的条件。根据服务器的返回状态码,可以判断资源是否已改变并进行相应的处理。