为什么我的 Vue 项目静态资源没走 Disk Cache?
我用 Vue CLI 打包上线后,发现每次刷新页面都会重新请求 JS 和 CSS 文件,明明设置了 long-term caching,但 Chrome DevTools 里看到这些资源的状态是 200(from memory cache)或者直接重新下载,根本没进 Disk Cache。是我配置错了吗?
我试过在 vue.config.js 里加 filenameHashing: true,也确认了服务器返回了 Cache-Control: max-age=31536000,但还是不行。本地开发时没问题,一上生产环境就不缓存。
<template>
<div id="app">
<img src="./assets/logo.png" alt="logo" />
<HelloWorld />
</div>
</template>
<script>
import HelloWorld from './components/HelloWorld.vue'
export default {
components: { HelloWorld }
}
</script>
你看到 from memory cache 是正常的,Chrome 读取资源时优先走内存,刷新页面基本都这样。你需要确认的是:关闭浏览器标签页,等几秒,再重新打开页面,这时候如果还是重新下载,那才是真的没进 Disk Cache。
先拿 curl 查一下服务器实际返回的响应头:
重点看这几项:
服务器返回的必须是类似这样的:
如果同时返回了这些,那就完蛋:
Vary: Cookie 这个坑很多人踩过,服务器只要加了这个,浏览器就认为每个用户的缓存不一样,不会走 Disk Cache。
检查一下你的服务器配置(nginx/apache/cdn),把无关的缓存头删掉,只保留 max-age 就够了。
如果用的是 nginx,加一行:
代码放这了,自己对比一下服务器实际返回的是什么。