浏览器原理 · 26/51
1. addEventListener 第三个参数 2. addEventListener 与 attachEvent 区别 3. 浏览器兼容性测试与内核 4. 浏览器兼容性问题 5. 浏览器内核与引擎 6. 浏览器图层创建条件 7. 浏览器多进程架构 8. 浏览器渲染机制 9. 浏览器存储方案 10. 浏览器版本检测方法 11. children 与 childNodes 区别 12. 常见浏览器兼容性问题 13. Chrome 页面进程数量 14. 坐标系统对比 15. 多标签页通讯方案 16. 删除 Cookie 17. 自定义事件 18. DOM 事件处理方式演进 19. 元素尺寸属性对比 20. DOM 节点操作 21. DOM 事件机制 22. addEventListener 与 attachEvent 的区别 23. 获取页面所有复选框 24. HTMLCollection 与 NodeList 区别 25. Hybrid 应用开发 26. 强缓存命中机制 27. 浏览器缓存机制 28. 页面编码与资源编码不一致处理 29. jQuery 事件绑定方法对比 30. Input 点击触发的事件顺序 31. JavaScript 浏览器兼容性问题 32. jQuery 多事件绑定实现 33. JSBridge 原理 34. 链接点击后 Hover 失效解决方案 35. 减少重绘和回流的性能优化 36. 移动端 300ms 点击延迟问题 37. 移动端视口配置 38. 移动端点击穿透问题解决 39. 移动端兼容性问题 40. JSBridge 原理与实现 41. 移动端 1px 像素问题解决方案 42. 浏览器渲染流程 43. 页面加载完成事件对比 44. Offset、Scroll、Client 属性对比 45. 同源策略与跨域解决方案 46. Script 标签位置对页面加载的影响 47. Service Worker 与 PWA 48. 存储方案对比:Cookie、Storage、IndexedDB 49. 强缓存默认时间 50. URL 到页面显示的完整过程 51. V8 引擎 JavaScript 执行过程

强缓存命中机制

浏览器强缓存命中时的完整流程

问题

当浏览器强缓存命中时,具体发生了什么?

解答

强缓存命中流程

浏览器发起请求

检查本地是否有缓存

   有缓存 → 检查是否过期(Expires / Cache-Control)

   未过期 → 直接读取本地缓存,不发送请求

返回 200 (from memory cache) 或 200 (from disk cache)

判断缓存是否过期

浏览器通过响应头判断缓存有效期:

# 方式一:Expires(HTTP/1.0)
# 指定绝对过期时间
Expires: Wed, 25 Dec 2024 12:00:00 GMT

# 方式二:Cache-Control(HTTP/1.1,优先级更高)
# max-age 指定相对过期时间(秒)
Cache-Control: max-age=31536000

两种缓存位置

// 强缓存命中时,资源可能来自两个位置:

// 1. memory cache(内存缓存)
// - 读取速度快
// - 页面关闭后清除
// - 通常缓存小文件、当前页面已加载的资源

// 2. disk cache(磁盘缓存)
// - 读取速度相对慢
// - 持久化存储
// - 通常缓存大文件、非当前页面资源

服务器配置示例

# Nginx 配置强缓存
location ~* \.(js|css|png|jpg|gif|ico)$ {
    # 缓存一年
    expires 1y;
    # 或使用 Cache-Control
    add_header Cache-Control "public, max-age=31536000, immutable";
}

验证强缓存命中

打开 DevTools → Network 面板:

Name          Status    Size
app.js        200       (from disk cache)
logo.png      200       (from memory cache)
  • Size 列显示 from disk cachefrom memory cache
  • Time 列显示 0ms 或极短时间
  • 没有实际网络请求发出

关键点

  • 强缓存命中时不会发送任何请求到服务器
  • Cache-Control: max-age 优先级高于 Expires
  • memory cache 快但临时,disk cache 慢但持久
  • 状态码仍显示 200,但 Size 列会标注缓存来源
  • 要更新强缓存资源,通常需要修改文件名(如添加 hash)