核心是用文件内容哈希生成唯一url,如app.a1b2c3d4.js,内容变则url变,浏览器和cdn自动请求新资源;webpack配contenthash、vite默认支持,html引用须由插件自动更新,避免手动维护。

用版本化 URL 替代手动清缓存,核心是让每次资源更新都自动产生新 URL,浏览器和 CDN 自然跳过旧缓存——不需要人工点“清除”、也不依赖用户强制刷新。
用文件内容哈希生成稳定版本号
比时间戳或自增数字更可靠。Webpack、Vite、Rollup 等构建工具默认支持:打包时根据 JS/CSS 文件内容生成唯一哈希(如 app.a1b2c3d4.js),内容不变哈希就不变,内容一改 URL 就不同。这样既避免手动维护,又杜绝 CDN 缓存攻击风险(黑客无法预测哈希值)。
- Webpack 中启用
output.filename: '[name].[contenthash].js' - Vite 默认开启
build.rollupOptions.output.entryFileNames哈希命名 - 静态 HTML 中通过构建插件自动注入带哈希的资源链接,无需手改
服务端动态注入修改时间戳(适合 JSON/配置类文件)
对不走构建流程的 PHP 或 Node 后端输出的 JSON、YAML 等动态数据文件,可用 filemtime() 或 stat.mtimeMs 获取最后修改时间,拼成查询参数:
- PHP 示例:
<script src="config.json?v=<?=%20filemtime('config.json')%20?>"></script> - Node/Express 示例:
res.json({ ...data }).header('Cache-Control', 'no-cache')+ 前端用fetch('/config.json?t=' + Date.now())仅用于开发调试 - 注意:生产环境优先用构建时哈希,避免每次请求都读文件系统
统一发布版本号驱动全站资源更新
像 Instatic 那样,在发布时调用 bumpPublishVersion() 全局升级一个版本号,所有静态资源 URL 自动带上 ?v=20260915.1 这类参数。这个版本号可来自 Git commit hash、CI 构建 ID 或语义化版本。
- 好处是操作集中、一次发布影响全部资源,适合 CMS 或低频更新站点
- 需确保模板系统(如 Twig、EJS)能自动读取并注入该版本变量
- CDN 和浏览器都会因 URL 变化而加载新资源,旧缓存仍存在但不会被使用
配合 HTTP 缓存头提升效率
版本化 URL 解决的是“必须更新”,HTTP 头解决的是“尽量少请求”。推荐组合策略:
- 带哈希的文件(如
main.abc123.js):设Cache-Control: public, max-age=31536000(一年),CDN 和浏览器长期缓存 - HTML 文件:设
Cache-Control: no-cache或短时效(如max-age=60),确保能及时拿到含新资源链接的最新 HTML - 避免在 HTML 中写死
no-store或 meta 标签,它们不可靠且影响性能











