首页/文章/浏览器

浏览器缓存及优化手段

2025-03-07
14225 分钟
...

前言

当我们通过url首次访问某个网站的时候,我们如果使用浏览器的工具查看网络请求,会发现有很多http请求,但是当我们下一次再访问时,这些请求都不会发送而是展现在了页面上,而这就是浏览器缓存发挥的作用。

浏览器缓存

浏览器缓存是指将页面长时间不更新的资源缓存到浏览器上,下次访问页面时该部分长时间不更新的资源直接从缓存中获取,从而减少了网络请求次数,提高了页面的加载速度。浏览器的缓存方式主要分为两种:强缓存协商缓存,下面将为大家讲解这两种方式的区别。

强缓存

强缓存的实现方式主要是通过在响应头中设置Cache-Control字段,该字段的值为 max-age=xxx表示缓存的有效期,单位为秒,如果到期的话那么就不会从缓存中读取会重新发送http请求获得数据。

这个方法虽然看起来很方便,但是还有几点是我们需要注意的:

  • 通过浏览器url地址栏请求的资源,请求头中就会自动携带 Cache-Control: max-age=0字段,也就意味着这种资源无法被强缓存(这里无法被缓存指的是不会从缓存中拿,而是去问后端拿资源)
  • 被缓存的资源在浏览器的Cache storage中,本质上还是在硬盘上
  • 如果替换对应文件的内容,但是新文件的名字和旧文件的名字一模一样,这样获取的还是旧文件的缓存,并不会获取新文件的缓存。

协商缓存

由于强缓存对浏览器地址栏访问的资源无效,所以浏览器提供了协商缓存的机制。

last-modified 和 if-modified-since

通过上文我们知道了强缓存是通过时间来进行的,但是如果更改了文件内容但是名字没变这个强缓存就不能用了,last-modified这个方法可以很好的避免强缓存这一缺点。相信大家在写完代码的时候总会进行保存,防止自己更改的代码丢失,当我们对一个文件进行保存的时候,文件中的内容就会发生变化,其中就包含有文件最后一次修改的时间。

思路:根据文件最后一次修改的时间我们就可以确定文件是否被修改过,如果文件没有被修改过,我们就可以让浏览器去缓存中读取该文件,如果被修改了,那么我们就给后端发送http请求传回来新的文件。

根据这一特点,我们在第一次请求的时候在请求头中携带last-modified字段,里面的值为最后一次修改时间。当浏览器接收到响应头后,会在该资源再次被请求的时候,在请求头中携带if-modified-since 字段,值为last-modified的值,后端校验请求头中的if-modified-since 的值和 last-modified 的值是否一致,如果一致,则返回 304,浏览器会从缓存中获取资源。否则返回 200 状态码,浏览器就会重新请求该资源。

缺点:当文件内容被修改过但是最后内容还是和原来一样的话,last-modified的值会更新,从而导致资源重新被请求

etag + if-none-match

这个方法和上述last-modified方法有异曲同工之妙,etag也叫文件指纹。世界上每个人的指纹基本上是独一无二的,而etag是属于文件自己的指纹,它会用自己的一种加密方式对文件内容进行加密,我们将加密过后的值返回给后端,这样在下一次请求后端的时候会自动携带if-none-match字段,后端会对前端传过来的这个字段与后端中储存的字段进行对比,如果一样就代表文件没有更改返回304状态码,否则返回200状态码。

缺点:这种方法比较耗费性能,如果文件资源较小可以使用

tip

  • 只要命中了强缓存就不会走协商缓存,只有强缓存到期才会走协商缓存

  • 只用强缓存可以把除url地址栏访问的资源缓存起来,但是资源更新了就无法第一时间让前端获取到,所以还需要协商缓存

  • 为了保证文件资源更新前端能及时获取到,一般会在文件名后面加上文件指纹(用内容生成的哈希值),这样文件指纹就会改变,从而保证文件资源的更新

如果您觉得这篇文章有帮助,请点个赞吧~

分享文章

相关文章

更多文章 →
浏览器2025-07-30
浏览器内核到底有哪些?它们各自又有什么区别?
这问题其实很多刚入行的同学经常搞混,所以今天我来一次性讲明白—— 浏览器内核 到底有哪些?它们各自又有什么区别? 说白了,浏览器内核就是浏览器的大脑,分两部分: 渲染引擎(Rendering Engine) :负责网页的排版渲染,HTML、CSS统统交给它。 JS引擎(JavaScript Engine) :处理JavaScript脚本逻辑,比如你点按钮后弹出对话框这种行为。 1)常见浏览器内核盘点 下面我直接列几个主流的浏览器内核,顺...
学习面试
浏览器2024-09-10
深入理解浏览器的事件循环机制
在现代Web开发中,JavaScript作为浏览器中最常用的编程语言,其执行机制深刻影响着Web应用的性能和用户体验。事件循环(Event Loop)作为JavaScript处理异步操作的核心机制,是理解JavaScript执行模型的关键。本篇文章从多个维度去分析事件循环的机制,希望可以帮大家更加深入的了解它。 在讨论事件循环之前,理解浏览器的执行环境是至关重要的。浏览器是一个多线程环境,包含以下主要线程: GUI 渲染线程(GUI R...
学习面试
浏览器2024-09-02
优化浏览器渲染主线程的 api 都有哪些?怎么用?
为了提高浏览器的性能和用户体验,现代浏览器采用了一些技术来优化主线程的执行。主要有: setTimeout 延迟加载 (使用不当可能适得其反) web worker 多线程 (不能操作dom,主要计算密集型的任务) requestIdleCallback 帧空闲时运行 (react18带🔥的,低优先级任务) requestAnimationFrame 每帧都会运行 (主要做动画效果调优) setTimeout 延迟加载非常常见,但是它...
学习面试
浏览器2024-07-25
图解浏览器的多进程渲染机制
观察浏览器的任务管理器可以发现,打开浏览器的一个页面需要多个进程,包括浏览器进程、GPU进程、网络进程、渲染进程等,有插件的话还会包括各种插件进程(Chrome选项 更多工具 任务管理器)。 本文将聚焦于 浏览器的各个进程间是如何配合,将页面呈现给用户的。 📌 你将了解到 1. 浏览器在历史发展过程中,其进程架构做了哪些调整,为什么这样调整,以及解决了哪些问题? 2. 从用户在地址栏输入URL,到页面渲染完成这之间发生了什么?回流和重...
学习面试
浏览器2024-06-11
localStorage是同步还是异步的?为什么
点赞 \+ 收藏 === 学会🤣🤣🤣 首先明确一点,localStorage是同步的 是 Web Storage API 的一部分,它提供了一种存储键值对的机制。 的数据是持久存储在用户的硬盘上的,而不是内存。这意味着即使用户关闭浏览器或电脑, 中的数据也不会丢失,除非主动清除浏览器缓存或者使用代码删除。 当你通过 JavaScript 访问 时,浏览器会从硬盘中读取数据或向硬盘写入数据。然而,在读写操作期间,数据可能会被暂时存放...
学习面试
浏览器2024-04-15
构建浏览器工作原理知识体系(开篇)
本文为稀土掘金技术社区首发签约文章,30天内禁止转载,30天后未获授权禁止转载,侵权必究! 作为一个前端工程师,浏览器是我们密不可分的朋友,想要深耕前端,就必须和浏览器“交心”💞。 为什么你觉得偶尔看浏览器的工作原理,但总是忘呢😵‍💫,因为你没有形成一个完整的知识网络,你的记忆是碎片化的。正如人的神经网络,只有当你的记忆相互依赖,相互链接,才能形成长期稳定的记忆。 所以本文我将用一条知识线将浏览器工作原理的知识串联起来,因为本文的...
学习面试

评论

请登录后发表评论

去登录
加载评论中...

目录