展开说说浏览器缓存

浏览器缓存是一种将已下载的资源存储在本地设备上,以便在将来访问相同资源时能够更快地加载的机制。这可以显著提高网页的性能和用户体验。浏览器缓存通常分为两种类型:HTTP缓存和浏览器本地缓存。

HTTP缓存:

  1. 缓存控制头:

    • 服务器通过 HTTP 头部信息控制浏览器缓存。常见的控制头包括:
      • Cache-Control: 指定缓存策略,如max-age表示资源有效期。
      • Expires: 指定资源的过期时间。
      • ETagLast-Modified: 用于验证资源是否已经发生变化。
  2. 状态码:

    • 服务器通过响应状态码来指示浏览器是否应该缓存资源。200 OK表示资源已被缓存,而304 Not Modified表示资源未发生变化,浏览器可以使用缓存。

缓存过程:

  1. 首次加载:

    • 当浏览器首次请求一个资源时,服务器通过响应头告知浏览器如何缓存该资源。
  2. 缓存检查:

    • 浏览器在发送请求时会检查本地缓存,如果存在并且有效(未过期),则直接使用缓存,不再请求服务器。
  3. 过期检查:

    • 如果缓存过期或者需要进行验证(使用 ETagLast-Modified),浏览器会发送一个条件请求到服务器,服务器会返回 304 Not Modified 或者新的资源。
  4. 资源更新:

    • 如果资源已经更新,服务器返回新的资源,浏览器更新本地缓存。

控制缓存策略:

  1. 强缓存(Expires 和 Cache-Control):

    • ExpiresCache-Controlmax-age 指定资源在多长时间内是强制缓存的,不需要向服务器发起请求。
  2. 协商缓存(Last-Modified 和 ETag):

    • 服务器通过 Last-ModifiedETag 标识资源的版本,如果资源未发生变化,浏览器可以使用本地缓存,否则服务器返回新的资源。

清除缓存:

  1. 手动清除:

    • 用户可以手动清除浏览器缓存,以删除所有已保存的资源。
  2. 强制刷新(Ctrl + F5):

    • 强制刷新页面时,浏览器会忽略缓存,重新请求所有资源。
  3. 缓存清除策略:

    • 通过设置合适的缓存清除策略,使得浏览器在特定条件下自动清除缓存。

浏览器缓存是 Web 性能优化的重要手段之一,合理配置缓存策略可以减轻服务器负载,加快页面加载速度。

缓存相关头部详解

以下是一些常用的缓存控制头部:

  1. Cache-Control:

    • Cache-Control 是最常用的缓存控制头部,用于定义资源的缓存策略。一些常见的指令包括:
      • public:表示资源可以被任何中间缓存(如CDN)缓存。
      • private:表示资源仅能被终端用户的浏览器缓存。
      • max-age=<seconds>:表示资源在指定的秒数内有效,超过这个时间则需要重新请求。
      • no-cache:表示缓存可以存在,但必须在使用之前重新验证缓存的有效性。
      • no-store:表示终端用户和中间缓存都不应该存储资源的任何副本。
    http 复制代码
    Cache-Control: public, max-age=3600
  2. Expires:

    • Expires 是一个老旧的头部,用于指定资源的过期时间。它的值是一个 GMT 格式的日期字符串。但由于存在时区和缓存服务器的时间同步问题,Cache-Control 的使用更为推荐。
    http 复制代码
    Expires: Tue, 01 Jan 2030 00:00:00 GMT

时区和缓存服务器的时间同步问题 :当使用 Expires 头部时,服务器会返回一个指定资源过期的时间戳,浏览器会将此时间戳与本地时间戳进行比较,以确定资源是否过期。 然而,问题在于不同的计算机和服务器可能处于不同的时区,因此它们的本地时间戳可能是不同的。这可能导致一个在服务器上看起来已经过期的资源,在客户端可能仍然被认为是有效的,或反之亦然。 这种时区差异可能会导致缓存机制的不准确性,使得资源在实际过期之前或之后就被认为是过期的。为了解决这个问题,更现代的缓存控制机制通常使用 Cache-Control 头部的 max-age 指令,该指令表示资源在指定的秒数内有效,而不依赖于时区。

  1. ETag:

    • ETag 是一个唯一标识符,服务器可以通过它判断资源是否发生了变化。浏览器在发送请求时可以通过 If-None-Match 头部携带上次请求时服务器返回的 ETag 值,服务器会比较这个值来决定是否返回新的资源。
    http 复制代码
    ETag: "abc123"
  2. Last-Modified:

    • Last-Modified 是资源的最后修改时间,服务器可以通过它来判断资源是否发生了变化。浏览器在发送请求时可以通过 If-Modified-Since 头部携带上次请求时服务器返回的 Last-Modified 值,服务器会比较这个值来决定是否返回新的资源。
    http 复制代码
    Last-Modified: Wed, 12 Feb 2020 12:30:00 GMT

这些头部可以根据具体的需求和场景进行灵活配置。合理设置缓存头部可以减轻服务器负载,提高页面加载性能。在实际应用中,通常通过服务器配置或后端代码来设置这些头部。

浏览器本地缓存:

  1. localStorage 和 sessionStorage:

    • localStoragesessionStorage 是浏览器提供的两种本地存储方式,可以将数据存储在用户设备上。这些数据可以在页面刷新或关闭后仍然保持存在。
    • 两者的区别在于,sessionStorage提出了窗口的概念,数据只在同源同窗口内共享。而 localStorage 在同源所有窗口共享。
  2. IndexedDB:

    • IndexedDB 是一种更强大的本地数据库,允许开发者存储和检索大量结构化数据。与 localStoragesessionStorage 不同,IndexedDB 允许存储更大的数据集,并支持更复杂的查询。
相关推荐
哆啦刘小洋几秒前
HTML Day04
前端·html
再学一点就睡30 分钟前
JSON Schema:禁锢的枷锁还是突破的阶梯?
前端·json
从零开始学习人工智能2 小时前
FastMCP:构建 MCP 服务器和客户端的高效 Python 框架
服务器·前端·网络
烛阴2 小时前
自动化测试、前后端mock数据量产利器:Chance.js深度教程
前端·javascript·后端
好好学习O(∩_∩)O2 小时前
QT6引入QMediaPlaylist类
前端·c++·ffmpeg·前端框架
敲代码的小吉米2 小时前
前端HTML contenteditable 属性使用指南
前端·html
testleaf2 小时前
React知识点梳理
前端·react.js·typescript
站在风口的猪11082 小时前
《前端面试题:HTML5、CSS3、ES6新特性》
前端·css3·html5
Xiao_die8882 小时前
前端八股之CSS
前端·css
每天都有好果汁吃3 小时前
基于 react-use 的 useIdle:业务场景下的用户空闲检测解决方案
前端·javascript·react.js