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
生成结果: