hash、chunkhash、contenthash 与长期缓存有什么关系?

先理解原理和示例,再练习完整口述与追问。

区分整体构建、chunk、内容粒度;运行时代码影响引用;稳定模块标识;HTML 与指纹资源采用不同缓存策略。

文件名指纹让内容变更产生新 URL,从而安全地使用长期缓存。在 Webpack 中,fullhash 通常关联整次编译;chunkhash 按 chunk 计算;contenthash 按对应输出内容计算,具体效果受资源类型、插件与优化配置影响。旧配置里的 hash 名称也要结合 Webpack 版本理解,不能不看版本就把所有占位符视为完全相同。

实践中 JavaScript、CSS、图片通常使用 contenthash。若运行时包含 chunk 文件名映射,业务资源变化可能连带运行时变化,因此可以独立提取 runtime chunk,并通过稳定模块 ID、合理拆包减少无关缓存失效;仍需用构建产物对比验证,不能承诺一份源文件修改绝不影响其他文件。

带内容指纹的静态资源可设置较长 max-age 和 immutable,HTML 则采用较短缓存或重新校验,以便尽快指向新资源。部署时先发布新资源再切换 HTML,保留旧指纹文件以支持尚未刷新页面和回滚。Service Worker、CDN 缓存键、压缩协商也要保持一致,否则即使文件名有 hash 仍可能出现版本混用。

新旧构建只有一张图片改变,若所有文件都含整次构建 hash,很多未变资源也会换 URL;内容指纹能缩小失效范围。运行时引用 chunk 文件名可能连带改变,因此把 runtime 分离和稳定模块 ID 纳入分析,再对比实际输出差异。

内容指纹不意味着可立即删除旧资源。缓存头、CDN 键与 HTML 更新顺序错误,仍然会产生用户侧版本混用。

文件名指纹让内容变更产生新 URL,从而安全地使用长期缓存。在 Webpack 中,fullhash 通常关联整次编译;chunkhash 按 chunk 计算;contenthash 按对应输出内容计算,具体效果受资源类型、插件与优化配置影响。旧配置里的 hash 名称也要结合 Webpack 版本理解,不能不看版本就把所有占位符视为完全相同。