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 等工具,在打包时自动给文件名添加哈希值(根据文件内容生成),内容变化时哈希值也会变。
// Webpack 配置示例
output: {filename: '[name].[contenthash].js', // 输出文件名带哈希
}
生成结果:
<script src="/static/js/common.abc123.js"></script>
加时间戳、版本号或哈希值到文件名或 URL 参数中。