返回
浏览器强缓存和协商缓存,你应该要知道的
前端
2023-11-30 07:07:34
浏览器缓存是一种用来存储已经请求过的资源的技术,以便浏览器在下次请求相同的资源时可以更快地获取它们。浏览器缓存可以分为强缓存和协商缓存两种。
强缓存
强缓存是浏览器在不与服务器协商的情况下,直接从本地缓存中读取资源。强缓存的依据是服务器在响应头中指定的过期时间(Expires)或缓存控制指令(Cache-Control)。
- Expires:Expires 是一个 HTTP 头,它指定资源的过期时间。浏览器在收到 Expires 头后,会在资源的过期时间内直接从本地缓存中读取资源,而不会与服务器协商。
- Cache-Control:Cache-Control 是一个 HTTP 头,它指定资源的缓存控制指令。Cache-Control 的值可以是 public、private、no-cache、no-store 等。public 表示资源可以被所有用户缓存,private 表示资源只能被当前用户缓存,no-cache 表示资源不能被缓存,no-store 表示资源不能被存储。
协商缓存
协商缓存是浏览器在请求资源时,先向服务器发送一个 If-Modified-Since 或 If-None-Match 头,服务器在收到这个头后,会检查资源是否已被修改。如果资源未被修改,服务器会返回一个 304 Not Modified 状态码,浏览器会继续使用本地缓存中的资源。如果资源已被修改,服务器会返回一个 200 OK 状态码和新的资源内容,浏览器会更新本地缓存中的资源。
- If-Modified-Since:If-Modified-Since 是一个 HTTP 头,它指定资源的最后修改时间。浏览器在请求资源时,会将 If-Modified-Since 头的值设为资源的最后修改时间。服务器在收到 If-Modified-Since 头后,会检查资源是否已被修改。如果资源未被修改,服务器会返回一个 304 Not Modified 状态码,浏览器会继续使用本地缓存中的资源。
- If-None-Match:If-None-Match 是一个 HTTP 头,它指定资源的 ETag。ETag 是服务器为资源生成的唯一标识符。浏览器在请求资源时,会将 If-None-Match 头的值设为资源的 ETag。服务器在收到 If-None-Match 头后,会检查资源的 ETag 是否与 If-None-Match 头的值一致。如果一致,服务器会返回一个 304 Not Modified 状态码,浏览器会继续使用本地缓存中的资源。
如何抉择读取缓存的时机
在实际应用中,我们应该如何抉择读取缓存的时机呢?以下是一些建议:
- 如果资源不经常变化,并且希望加快页面加载速度,可以使用强缓存。
- 如果资源经常变化,并且希望确保用户总是获取最新的资源,可以使用协商缓存。
- 如果不确定资源是否经常变化,可以使用协商缓存。