在前端开发中,文件缓存是提高页面性能的关键之一。但是,在选择如何缓存静态资源时,有两种主要的方法:使用查询字符串和使用Last-Modified头。本文将比较这两种方法的优缺点并为您提供指导意见。
查询字符串
使用查询字符串作为版本控制的方式非常常见。在请求URL后添加一个字符串,通常是一个版本号或者时间戳,如果文件内容被更新,则查询字符串也应该被更新。例如:
<link rel="stylesheet" href="styles.css?v=1.0">
当styles.css
被更新时,只需要更改查询字符串的值即可强制浏览器重新获取文件。这种方法不会影响缓存机制,并且可以确保用户始终使用最新版本的文件。另外,因为浏览器会将不同查询串视为不同的文件,所以即使文件名没有变化,浏览器仍然可以检测到文件已经被更新。
优点
- 可以轻松地启用和禁用缓存。
- 对于CDN和负载均衡来说,它是一种简单易行的方式。
- 可以确保用户始终使用最新版本的文件。
缺点
- URL地址会随着每个版本的变化而变化,可能会影响SEO。
- 如果文件名没有变化,浏览器可能不会重新获取文件,因为它仅检测查询字符串的更改。
Last-Modified头
另一种控制缓存的方法是使用Last-Modified头。服务器在响应文件请求时会返回一个时间戳(通常是文件最近修改时间),浏览器会将这个时间戳存储在本地,并在后续请求中将该时间戳发送回服务器,以判断文件是否已被修改。例如:
HTTP/1.1 200 OK Content-Type: text/css Last-Modified: Fri, 01 Apr 2022 00:00:00 GMT
如果styles.css
再次被请求,浏览器会发送一个包含Last-Modified头的条件GET请求:
GET /styles.css HTTP/1.1 If-Modified-Since: Fri, 01 Apr 2022 00:00:00 GMT
如果文件未被修改,则服务器将返回一个304 Not Modified响应,浏览器将从缓存中加载文件。
优点
- URL地址不会随着每个版本的变化而变化,对SEO友好。
- 文件名没有变化时,浏览器可以自动检测到文件已被更新。
- 减少了网络流量。
缺点
- 服务器必须支持Last-Modified头才能正常工作。
- 时间戳精度有限,无法检测某些类型的文件更改,例如只更改文件注释的情况。
建议
综上所述,当您需要在更新静态资源时避免重新加载任何缓存时,请使用查询字符串。但是,如果您不希望每次更改版本号都会影响URL地址,则使用Last-Modified头是更好的选择。
最佳实践是结合两者:使用查询字符串来控制缓存并且为了SEO友好,使用Last-Modified头来检测文件是否被修改。例如:
<link rel="stylesheet" href="styles.css?v=1.0" last-modified="2022-04-01">
示例代码
查询字符串
-- -------------------- ---- ------- --------- ----- ----- ---------- ------ ----- ---------------- ------------ ------ --------------- ----- ---------------- ------------------------ ------- ------ --- - ----------------------------------------------------------- -------- ----------------------------------------------------------------------------------