HTTP的场景实践 | 青训营
HTTP的场景实践:选择谷歌浏览器,对于其涉及的请求中的缓存策略展开具体分析。谷歌浏览器使用了多种缓存策略来提高性能和用户体验。下面是一些常见的缓存策略:
强缓存
-
Expires:通过设置
Expires响应头来指定资源的过期时间,该时间是一个绝对时间,即服务器时间。 -
Cache-Control:通过设置Cache-Control响应头来控制资源的缓存行为。常见的指令有:
public:表示资源可以被任何对象(包括代理服务器)缓存。private:表示资源只能被浏览器缓存,不能被代理服务器缓存。max-age:指定资源在缓存中的最长有效时间,单位是秒。例如,Cache-Control: max-age=3600表示资源在缓存中的有效时间是1小时。
使用Cache-Control相比Expires更为常见,因为它提供了更多的缓存控制选项,并且可以使用相对时间而不仅仅是绝对时间。
需要注意的是,浏览器在处理缓存时会先检查Cache-Control响应头,如果存在该头信息,则优先使用它进行缓存控制,否则才会考虑Expires响应头。
协商缓存
- 协商缓存是浏览器缓存机制的另一种方式,用于减少网络流量和服务器负载。它通过在请求头中发送特定的信息来判断是否使用缓存副本。
- ETag:服务器在响应头中返回一个唯一标识符(通常是一个哈希值),用于标识资源的版本。浏览器在后续请求中通过发送
If-None-Match请求头将这个标识符发送回服务器,如果资源未发生变化,则服务器返回304 Not Modified状态码,告诉浏览器可以使用缓存副本。 - Last-Modified:服务器在响应头中返回资源的最后修改时间。浏览器在后续请求中通过发送
If-Modified-Since请求头将这个时间发送回服务器,如果资源未发生变化,则服务器返回304 Not Modified状态码。 - 需要注意的是,ETag和Last-Modified可以同时使用,也可以单独使用。浏览器在处理协商缓存时会先检查ETag,如果存在该头信息,则优先使用ETag进行缓存验证,否则才会考虑Last-Modified。
- 协商缓存相比强缓存更加灵活,因为它不仅仅依赖于资源的过期时间,还考虑了资源的具体内容变化。
Service Worker缓存
- Service Worker是一种浏览器技术,可以在浏览器和网络之间充当代理服务器。它可以拦截和处理请求,并自定义缓存策略。开发者可以使用Service Worker来实现高级的缓存控制逻辑,例如离线缓存、动态缓存等。
- 同时,还可以根据需要从服务器获取最新的数据,并将其缓存以供后续使用,以提高网页的加载速度。
- Service Worker的一个重要特点是它可以独立于网页运行,并且具有持久性的状态。这意味着即使用户关闭了网页,Service Worker仍然可以在后台运行,并且可以在下次打开网页时继续工作。这使得Service Worker非常适合用于实现离线功能和推送通知等。
- 需要注意的是,由于Service Worker运行在一个独立的上下文中,因此它不能直接访问DOM。它主要通过拦截和处理网络请求来实现自定义缓存策略。开发者可以通过编写Service Worker脚本来定义缓存策略,并通过注册Service Worker来启用它。
总结
这些缓存策略可以在HTTP请求的响应头中设置,以告知浏览器如何缓存资源。不同的网站和服务器可能会使用不同的缓存策略来满足其需求。