当前位置: 首页 > news >正文

41、当你在 index.html 中引用了一个公共文件(比如 common.js),修改这个文件后,用户访问页面时仍然看到旧内容,因为浏览器缓存了旧版本

浏览器缓存机制

浏览器缓存是一种性能优化手段,它把网页资源(像 HTML、CSS、JavaScript、图片等)存于本地,下次访问相同资源时,若资源未发生变化,浏览器就会直接从本地缓存里读取,而无需再次向服务器请求,这样能减少网络请求,加快页面加载速度。

问题产生原因

在 HTML 文件里引用 JavaScript 或 CSS 文件时,一般会采用如下方式:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <!-- 引用 CSS 文件 -->
    <link rel="stylesheet" href="styles.css">
</head>
<body>
    <!-- 引用 JavaScript 文件 -->
    <script src="script.js"></script>
</body>
</html>

当你对 styles.css 或者 script.js 文件进行修改后,若 HTML 文件里引用的文件名未改变,浏览器会觉得文件没有更新,依旧使用本地缓存的旧版本文件。这是因为浏览器主要依据文件的 URL 来判断文件是否有变化,URL 不变,它就认为文件内容也未变。浏览器会认为文件没有更新,继续使用缓存的旧版本。因此,需要通过某种方式让浏览器知道文件已经更新,从而获取最新版本。

解决方案:强制浏览器加载最新文件

核心思路:让浏览器认为文件是 “新资源”,从而绕过缓存。

方法 1:文件名加时间戳(手动)

在文件路径后面添加当前时间,每次更新文件时时间不同,浏览器就会认为是新文件

<!-- 修改前 -->
<script src="/static/js/common.js"></script>

<!-- 修改后 -->
<script src="/static/js/common.js?t=202310101530"></script>

实现方式

  • 在代码中动态生成时间戳:
    // 前端代码示例
    const timestamp = Date.now(); // 获取当前时间戳
    
方法 2:构建工具自动加哈希(推荐)

使用 Webpack/Vite 等工具,在打包时自动给文件名添加哈希值(根据文件内容生成),内容变化时哈希值也会变。

步骤1:

 步骤2:

 步骤3:

 build: {
        rollupOptions: {
            output: {
                // 自定义 JavaScript 文件的文件名格式
                // entryFileNames: `public/[style].[hash].js`,
                // 自定义 CSS 文件的文件名格式
                assetFileNames: `public/[name].[hash].[ext]`,
            },
        },
    },

步骤4:

yarn run build

生成结果

相关文章:

  • 人工智能-LangGraph+ChatUI+DeepSeek API搭建本地智能助手
  • 搭建开源笔记平台:outline
  • 如何在 Unity3D 导入 Spine 动画
  • 【NLP】15. NLP推理方法详解 --- 动态规划:序列标注,语法解析,共同指代
  • JavaScript 库:全面解析与推荐
  • 13-SpringBoot3入门-整合MyBatis-Plus
  • 【Docker镜像】Python项目之使用Dockerfile构建镜像(一)
  • 如何用Postman实现自动化测试?
  • 【Jira 查询与 JQL 使用详解】
  • 【数据结构】导航
  • Ubuntu 24.04.2 LTS 系统安装python,创建虚拟环境
  • 解决 CMS Old GC 频繁触发线上问题技术方案
  • 本地部署vanna ai+通过http请求调用vanna
  • 虚幻5入门
  • Docker学习--本地镜像管理相关命令--docker save 命令
  • 【Easylive】TokenUserInfoDto中@JsonIgnoreProperties和 Serializable 接口作用
  • git 按行切割 csv文件
  • MCP协议的Streamable HTTP:革新数据传输的未来
  • 企业常用Linux服务搭建
  • 数字IC后端项目常见问题之streamOut layermap和innovus drc violation
  • 香港今年新股集资额已超600亿港元,暂居全球首位
  • 小米汽车回应部分SU7前保险杠形变
  • 3月中国减持189亿美元美债、持仓规模降至第三,英国升至第二
  • 浙江省台州市政协原副主席林虹被“双开”
  • 中日东三省问题的源起——《1905年东三省事宜谈判笔记》解题
  • 昆明警方重拳打击经济领域违法犯罪:去年抓获905名嫌犯