从此告别网速慢,轻松掌握浏览器缓存知识点!(一)https://developer.aliyun.com/article/1426400
如何设置协商缓存
设置协商缓存需要在服务器端设置响应头,并在客户端请求中添加检查缓存的标识值,例如 ETag 和 Last-Modified。
1. ETag
ETag 是一种服务器端生成的唯一资源标识符,用于标识资源。服务器会在最新版本的资源中添加 ETag 头部,客户端在请求资源时会将上一次访问时得到资源的 ETag 值发送到服务器。如果两个 ETag 是相同的,服务器就会返回 304 Not Modified 作为响应,此时客户端可以使用本地缓存。如下所示:
HTTP/1.1 200 OK Content-Type: image/jpeg Content-Length: 1234 ETag: "abcdef"
2. Last-Modified
Last-Modified 是一个日期时间值,它表示资源的最后修改时间。服务器会在响应头中包含它,客户端在每次请求资源时会将上一次得到资源的 Last-Modified 值通过 If-Modified-Since 值发送到服务器。如果上次请求的 Last-Modified 时间与现在请求的时间相同或更早,服务器就会返回 304 Not Modified 作为响应,让客户端使用本地缓存。如下所示:
HTTP/1.1 200 OK Content-Type: image/jpeg Content-Length: 1234 Last-Modified: Wed, 21 Oct 2015 07:28:00 GMT
3. 设置响应头
服务器可以通过设置响应头来控制缓存策略,如:
Cache-Control: max-age=3600, must-revalidate ETag: "abcdef" Last-Modified: Wed, 21 Oct 2015 07:28:00 GMT
这里的 Cache-Control 指令用来控制客户端缓存资源的时间(单位为秒),同时也可以指定是否必须重新验证资源是否更新。由于 Cache-Control 优先级高于 Last-Modified 响应头,所以当它们同时被指定时,Cache-Control 的优先级较高。
适当设置协商缓存可以减少服务器负载,加快网页访问速度。但需要注意的是,在开发中要考虑到被缓存的资源更新频率,以防止过度长时间缓存导致客户端看到过期内容。
V. 缓存失效的处理
缓存更新机制
缓存更新机制是保证缓存与原始数据一致的关键,确保响应数据在更新后能够及时得到更新并更新到缓存中。常用的缓存更新机制如下:
1. 延迟失效(Lazy Expiration)
延迟失效是一种策略,它通过在缓存中设置有效期的方式保留对数据的访问,直到数据变为过期为止。过期之后,访问请求将会用最新的数据更新缓存。
缺点是如果缓存过期之后仍然没有请求到达,就会一直使用旧数据,体验不佳;而且如果数据需要在非常短的时间内更新,延迟失效就无法满足要求。
2. 主动刷新(Active Refreshing)
主动刷新策略会在缓存过期之前尝试更新数据。当缓存到期时,缓存会向服务器发送请求,然后以异步方式更新数据。这样可以保证在缓存到期之前,缓存中的数据就得到了更新。
主动刷新的优点是及时更新缓存,减少了使用过期数据的风险;但如果缓存更新失败(如服务器响应超时),则会增加额外的请求负载,从而影响网站性能。
3. 固定时间刷新(Fixed-Time Refresh)
固定时间刷新是一种定期更新缓存的策略,它在每个固定时间间隔内执行缓存刷新任务,无论相关数据是否已经发生变化。
固定时间刷新的优点是结构简单,易于实施;缺点是缓存可能会在数据没有更新时被占用,造成资源的浪费。
4. 实时更新(Real-Time Refreshing)
实时更新是一种按需更新缓存的策略,它在需要获取缓存数据时直接从原始数据源获取最新数据,而不是访问缓存。这样能够确保访问的数据确实是最新的,不需要考虑缓存的维护和更新。
实时更新的缺点是增加了服务器的负载和数据库查询次数,从而影响网站性能和响应速度。
综上所述,缓存更新机制的选择需要根据实际需求和应用场景来确定。在实际开发中,可以选择最适合的缓存更新策略来平衡资源使用效率和用户访问体验。
版本号控制
版本号控制是一种管理和追踪系统的版本和变更历史的方法。版本号通常用于软件开发、协议、API 的变更历史,以及其他需要保持兼容性的情况。版本号的格式和语义可以根据具体的需求制定。
常见的版本号格式如下:
1. x.y.z
这是一个最常见的版本号格式,其中 x 表示主版本号(一般由大的 API 或重构版本引发),y 表示次版本号(一般在添加新功能和修复 bug 时增加),z 表示修订号(一般在小变更(如样式)时增加)。
2. yyyymmdd
这种格式根据日期来命名版本,例如 20210601 表示 2021 年 6 月 1 日的版本。
3. semantic versioning(语义化版本控制)
语义化版本控制的格式为 x.y.z,其中 x 表示主版本号,y 表示次版本号,z 表示修订号。其规则如下:
- 当进行不兼容客户端更改,即 API 破坏性变更时,增加主版本号 x;
- 当进行向后兼容的新功能时,增加次版本号 y;
- 当进行向后兼容的 bug 修复时,则增加修订号 z。
版本号控制的主要作用如下:
1. 更好的跟踪和管理版本
版本号控制可以帮助开发者追踪和管理软件或系统的版本,避免版本混淆和冲突。
2. 优化软件/系统的维护和升级
版本号控制可以精准地定位问题,以及帮助开发者快速定位已经修复的 bug。同时,还可以自动化升级和部署过程。
3. 保持兼容性
通过维护版本号,可以让软件/系统升级更加稳定,保持与现有用户兼容。
综上所述,版本号控制是软件/系统开发的重要环节,合理的版本号控制能够帮助管理版本信息,优化维护升级流程,同时保持与现有用户兼容性,使得软件/系统更加稳定、可靠。
VI. 浏览器缓存的应用
加载速度优化
加载速度优化是网站或应用程序优化的关键之一,可以帮助提升用户访问体验、降低用户等待时间、增加网站转化率等。以下是一些加载速度优化的应用:
1. 优化图片
图片占用网站大部分流量,优化图片可以显著提高页面性能。方法如下:
- 选择适当的图片格式,如 JPG、PNG、GIF、WebP 等;
- 压缩图片大小以减少网络流量和加载时间;
- 使用不同尺寸的图片,根据屏幕显示不同的图像大小;
- 使用延迟加载技术,即仅在需要时才加载图片。
2. 优化 CSS 和 JavaScript
- 压缩和合并 CSS 和 JS 文件以减少文件大小和 HTTP 请求次数;
- 将 CSS 放在页面的顶部,JS 放在底部,以防止页面和资源的阻塞;
- 删减无用的 CSS 和 JS 代码以减少文件大小;
- 避免使用大量内嵌样式和脚本代码。
3. 缓存和预加载资源
- 启用浏览器缓存。
- 使用 CDN 加速资源,如图片、CSS、JS 等。
- 使用资源预加载技术,加载未出现在浏览器视图中但可能被用户访问到的资源。
4. 延迟加载非关键资源
- 延迟加载视频、音频、广告等非关键资源。
- 仅在用户滚动到视窗中的时候触发加载。
5. 减少 HTTP 请求
- 减少页面 HTTP 请求次数,使用 CSS Sprite 或者 Data URI 将多个图像合并成单张图片,或者使用 Base64 编码将小的图像直接作为 CSS 属性或 HTML 标记嵌入。
- 删除不必要的 HTTP 请求,对于一些较庞大的文件或者不影响页面首次渲染的文件延迟加载。
综上所述,对于开发者来说,需要不断关注最新的网络技术和工具等,将加载速度优化应用到实践中。优化后的应用将拥有更好的性能和用户访问体验。
跨页缓存
跨页缓存是一种优化技术,可以在不同页面之间共享缓存数据,提高数据访问的效率。
常见的跨页缓存技术包括如下几种:
1. LocalStorage
LocalStorage
是一种在浏览器端存储缓存信息的技术。它可以将字符串、对象等数据类型存储到客户端,同时基于域名实现沙箱隔离。在不同的页面之间,可以通过 LocalStorage
存取同样的缓存,从而实现跨页缓存。
2. IndexedDB
IndexedDB
是 HTML5
中引入的浏览器端数据库,可以存储大量数据,并支持高效地读写和检索。IndexedDB
可以通过异步方式进行读写,这使得它可以在多个页面之间同时访问。
3. Service Worker
Service Worker
是一种浏览器中的 JavaScript
进程,它可以拦截网页发出的 HTTP
请求,并缓存请求结果。通过 Service Worker
可以实现元素级的缓存,而且可以跨页面共享缓存内容。
需要注意的是,跨页缓存虽然可以提高数据访问效率,但也可能导致缓存数据的过期和过多占用内存。因此,在实际开发中需要权衡需求和资源的限制,选择合适的技术实现跨页缓存。
离线缓存
离线缓存是指网页或应用在无网络连接时仍能够正常访问和操作的一种技术。离线缓存通常依靠浏览器的缓存机制,将资源和页面缓存到本地,以备离线时使用。
常见的离线缓存技术包括如下几种:
1. Application Cache
Application Cache
(应用程序缓存)是 HTML5
标准中定义的一种离线缓存技术,可以将网页的资源和页面缓存到本地,以备离线时使用。Application Cache
通过 Manifest
文件列表来指定要下载和缓存的文件,可以自定义缓存策略、缓存时间和更新机制等。
2. LocalStorage
LocalStorage
是一种在浏览器端存储缓存信息的技术,可以将字符串、对象等数据类型存储到客户端。虽然它并不是专门用于离线缓存的技术,但是可以将需要离线缓存的数据存储在 LocalStorage
中,以实现离线访问功能。
3. Service Worker
Service Worker
是一种在浏览器中运行的 JavaScript
进程,可以拦截和处理网页请求,以实现更先进的网络管理和离线缓存等功能。通过 Service Worker
可以将资源和页面缓存到本地,实现离线和快速加载等功能。
需要注意的是,离线缓存虽然能够实现离线访问和更佳的用户体验,但也可能导致缓存数据的过多占用内存,还可能存在缓存过期和更新机制等问题,因此需要权衡需求和资源的限制,选择合适的技术实现离线缓存。
VII. 浏览器缓存的优化策略
加载时机控制
加载时机控制是一种优化技术,可以控制资源的加载时机并延迟一些需要的资源的加载,从而提高整体的性能。
以下是一些控制加载时机的方法:
1. 延迟加载
可以将页面中一些不必要的资源、大图片、视差效果等通过延迟加载的方式实现。实现延迟加载的方式有很多种,最常见的是通过 jQuery、load、Intersection Observer API
等实现。
2. 异步加载
异步加载可以避免阻塞主线程和 Opera
兼容性问题。只需要添加 async
属性即可异步加载 JavaScript
。异步加载同样可以通过多种方式实现。
3. 按需加载
按需加载可以在页面上只加载所需的代码、资源或模块。可以将不需要的脚本代码通过按需加载而不被浏览器下载。
4. 懒加载
懒加载可以先加载页面必需的资源,等到其他资源需要时才开始加载。最常见的懒加载是图片的懒加载。
5. 优先加载关键资源
在页面加载时,一般先加载页面的关键资源,包括 HTML、CSS、JS
等文件,将它们放在页面头部。
需要注意的是,在进行资源加载时需要遵循一些最佳实践,如尽量减少 HTTP 请求次数、优化图片、压缩代码等等,以最大程度地优化加载时机。
缓存有效期设置
缓存有效期设置是指为缓存中的数据设置一个有效期限,过期的数据会自动被丢弃,保持缓存的数据最新和有效。设定合适的缓存有效期限可以节省带宽、加速应用响应速度、降低服务器负载等。
以下是一些设置缓存有效期限的方法:
1. HTTP 头信息
可以通过在 HTTP 请求头信息中添加 Expires
和 Cache-Control
响应头来实现缓存有效期的控制。Expires 响应头指定缓存的过期时间,例如:Expires: Thu, 31 Dec 2022 23:59:59 GMT。Cache-Control 响应头指示缓存的最大周期、是否缓存等,例如:Cache-Control: max-age=3600,表示缓存有效期为 1 小时。
2. JavaScript
可以使用 JavaScript
编程控制缓存的有效期,例如使用 localStorage.setItem(key, value, expireDate)
设置缓存有效期限并存储到本地。
3. 服务器与代理
在服务器端和代理服务器上,可以使用缓存服务器对应策略来控制缓存有效期。如 Nginx 可以通过缓存模块进行设置,Apache
可以通过 .htaccess
文件进行配置。
需要注意的是,在设置缓存有效期时,需要权衡缓存时间和数据更新速度之间的关系,不能让过期数据进入缓存,影响应用响应速度和数据的准确性。在实际应用中,推荐使用结合 HTTP 头信息、JavaScript 和服务器等技术,自定义合适的缓存有效期。
版本号更新
版本号更新是指在客户端或者服务端进行修改代码之后,为了避免浏览器缓存导致客户端拿到的是旧版本的代码而造成问题,需要对版本号进行更新的操作。版本号通常包括文件名、URL 参数或者 HTML 标签等。
以下是一些进行版本号更新的方法:
1. 文件名
可以在代码发布及更新某个文件时修改文件名,例如将 styles.css 改为 styles.1.0.0.css,这样就会强制浏览器重新加载新的文件。
2. URL 参数
使用 URL 参数可以控制客户端对文件是否需要缓存。例如将代码文件名加上 ?v=1.0.0 或者 ?timestamp=2023-06-28T00:00:00.000Z,这样 URL 参数变化时,浏览器就会重新请求新的代码文件。
3. HTML 标签
使用 HTML 标签也可以进行版本号更新。例如在 HTML 中使用 或者
,这样浏览器每次都会从服务器中请求新的 HTML 代码。
需要注意的是,版本号更新操作需要考虑缓存的影响和对客户端资源的消耗,应该在版本频繁变化时才进行更新,避免给客户端带来额外的网络和渲染开销。在实际应用中,推荐使用自动化工具或者构建工具来实现版本号更新。
VIII. 结论
浏览器缓存的应用价值
浏览器缓存在 Web 应用中的应用价值主要体现在以下几个方面:
1. 提高网站性能
浏览器缓存可以减少页面的加载时间,提高网站性能和用户体验。因为在同一个网站的不同页面中,有大量的公共资源(如 CSS、JavaScript
等)会被不断地应用,这些资源缓存在浏览器中能够避免每次都进行网络请求,从而加快页面加载速度。
2. 减少服务器负担
浏览器缓存可以减轻服务器的负担,因为相同的缓存数据不需要每次都从服务器端重新获取。这可以有效减少服务器的请求量,减轻服务器的负荷,提高服务器的吞吐量。
3. 降低带宽成本
浏览器缓存能够减少网络传输流量,从而降低带宽成本。当客户端需要访问同一个 URL 地址时,浏览器会从缓存中获取资源并直接使用,避免了重复的网络请求和服务器端响应,并减少了带宽的消耗。
需要注意的是,浏览器缓存虽然能够提高性能、减轻服务器压力和降低带宽成本,但也可能带来一些问题,如缓存数据的过期和不一致性、缓存机制的实现和维护等。在实现浏览器缓存时,需要根据实际应用场景选择合适的缓存策略和技术,并进行缓存监控和管理,以提高应用的性能和稳定性。