浏览器缓存

ops/2024/10/18 12:08:16/

问题

每次发布 web 项目新的版本后, 在浏览器中打开项目时, 不清除浏览器缓存 无法获取最新页面。

原因

为了减少资源请求次数,加快资源访问速度, 浏览器会对资源文件如图 css 文件、 js 文件等进行缓存 浏览器缓存策略有强制缓存和协商缓存

强制缓存—通过 HTTP 响应头中的特定字段来控制的 这些字段通常包括 Expires  Cache-Control 它们指示了资源的缓存有效时间  当浏览器在有效时间内再次请求同一资 源时, 它会直接从本地缓存中获取该资源, 而不会向服务器发送请求。

1  Expires HTTP 1.0 版本中, 通过 Expires 响应头来实现强缓存  Expires   示未来资源会过期的时间点。如果当前时间超过Expires设定的时间,资源缓存时间到期, 浏览器会重新向服务器请求资源。

2 Cache-Control HTTP 1.1 版本中, 引入了 Cache-Control 响应头, 它提供了更 灵活的缓存控制机制  例如, 可以通过 max-age 数设置缓存的最大生存时间 (以秒为单 ), Cache-Control: max-age= 1200 表示缓存有效时间为 1200 秒。

3 、启发式缓存 如果响应头中没有设置任何缓存相关的字段 浏览器会采用启发式算 法来决定是否缓存资源 。这通常是基于响应头中的 Date Last-Modified 值来计算的。

协商缓存—是浏览器与服务器之间进行通信以确认缓存资源是否仍然有效的过程,协商  存 主 要   两 组 HTTP     ETag  If-None-Match    Last-Modified  If-Modified-Since 。它们的工作原理如下

1  ETag/If-None-Match: 当浏览器第一次请求某个资源时, 服务器会返回一个 ETag (实体标签),它是一个资源版本的唯一标识符。浏览器在后续请求该资源时,会在请求头 中携带 If-None-Match 字段, 其值为先前接收到的 ETag 。服务器会根据这个值来判断资源 是否有更新 。如果有更新, 服务器会返回新的资源和新的 ETag 如果没有更新, 服务器会 返回 304 Not Modified 状态码, 告诉浏览器可以使用缓存中的资源。

2 Last-Modified/If-Modified-Since 类似于 ETag 机制, Last-Modified 记录的是资  源最后修改的时间。浏览器在后续请求时,会在请求头中携带 If-Modified-Since 字段,其值  为先前接收到的 Last-Modified 时间 。服务器会检查资源的最后修改时间是否在这个时间之  后。如果是,说明资源有更新,服务器会返回新资源和新的 Last-Modified 时间;如果不是, 服务器同样会返回 304 Not Modified 状态码。

3 、协商缓存的目的是确保浏览器能够获取最新的资源, 同时避免不必要的数据传输  这种机制特别适用于那些可能被频繁更新的资源,如在线商城的商品信息、社交媒体的动态  。通过协商缓存 可以在不牺牲内容新鲜度的前提下, 提高网站的性能和用户体验

检查时机在浏览器加载资源时,会先检查强缓存是否命中。如果强缓存中有该资源的  副本且未过期, 则直接使用, 不会发送 HTTP 请求到服务器  只有当强缓存未命中或资源  已过期时, 浏览器才会进行协商缓存 即向服务器发送 HTTP 请求以确认资源是否有更新。


应用场景强制缓存适用于不经常变动的静态资源, 如图片 CSS 和 JavaScript 文件。

这些资源的变更频率较低,因此可以设置较长的缓存时间,以提高加载速度并减少服务器压 力。协商缓存则适用于那些可能被频繁更新的资源,通过服务器的验证确保用户能够获取最 新的资源内容

解决方案

1 、添加版本号到静态资源:在引用静态资源时, URL 后面添加查询参数,参数为新版 本号, 例如

window.location.href = `${url}?v=${版本号}`;

2 、在 webpack 中, 通过添加时间戳/版本号等, 配置 js css 打包配置, 例如:

const Timestamp = new Date().getTime();
configureWebpack:{output:{filename : 'js/[name].[hash:8].' + Timestamp + '.js',chunkFilename: 'js/[name].[hash:8].' + Timestamp + '.js'},...
}

3 、设置 HTTP 头信息: 通过服务器配置, 设置 HTTP 头信息来控制浏览器缓存行为。

4 、通过服务器配置: 可以通过服务器配置, 比如 Nginx Apache 设置对静态资源 缓存控制。


http://www.ppmy.cn/ops/126469.html

相关文章

《深度学习》Dlib、OpenCV 关键点定位 原理及案例解析

目录 一、关键点定位 1、什么是关键点定位 2、步骤 1)加载预训练的人脸检测器 2)加载预训练的关键点检测器 3)读取图像 4)检测人脸 5)关键点检测 6)可视化关键点 7)显示图像 二、案例…

关于武汉芯景科技有限公司的限流开关芯片XJ6288开发指南(兼容SY6288)

一、芯片引脚介绍 1.芯片引脚 二、系统结构图 三、功能描述 1.EN引脚控制IN和OUT引脚的通断 2.OCB引脚指示状态 3.过流自动断开

【解决】webstrom uniapp rpx格式化空格 报错飘红

解决办法 1、安装 wechat mini program support 插件 2. 设置 wechat mini program 里小程序支持选为启用 3. 重新格式化显示正常&#xff0c;也不飘红了 注意要style开启scss支持lang"scss"&#xff0c;否则也会飘红报错 <style lang"scss"><…

使用Python在Jupyter Notebook中显示Markdown文本

使用Python在Jupyter Notebook中显示Markdown文本 引言1. 导入必要的模块2. 定义一个函数来显示Markdown文本3. 使用print_md函数显示Markdown文本4. 总结 引言 作为一名Python初级程序员&#xff0c;你可能已经熟悉了Jupyter Notebook这个强大的工具。Jupyter Notebook不仅支…

【AIGC】AI如何匹配RAG知识库: Embedding实践,语义搜索

引言 RAG作为减少模型幻觉和让模型分析、回答私域相关知识最简单高效的方式&#xff0c;我们除了使用之外可以尝试了解其是如何实现的。在实现RAG的过程中Embedding是非常重要的手段。本文将带你简单地了解AI工具都是如何通过Embedding去完成语义分析匹配的。 Embedding技术简…

【系统架构设计师】案例专题六(8大系统架构设计之8): 大数据架构设计考点梳理

更多内容请见: 备考系统架构设计师-核心总结目录 文章目录 一、传统数据处理系统存在的问题二、大数据处理系统架构分析1、大数据处理系统面临挑战2、大数据处理系统架构特征三、Lambda架构1、Lambda架构对大数据处理系统的理解2、Lambda架构应用场景3、Lambda架构介绍4、Lamb…

人脸识别-特征算法

文章目录 一、LBPH算法1.基本原理2.实现步骤3.代码实现 二、Eigenfaces算法1.特点2.代码实习 三、FisherFaces算法1.算法原理2.算法特点3.代码实现 四、总结 人脸识别特征识别器是数字信息发展中的一种生物特征识别技术&#xff0c;其核心在于通过特定的算法和技术手段&#xf…

java幂等控制问题

&#x1f3c6;本文收录于《全栈Bug调优(实战版)》专栏&#xff0c;主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&am…