为什么从Vue.js中挂载的钩子发送的AJAX GET请求总是忽略浏览器缓存



我在Vue组件中使用Axios处理AJAX请求,并注意到(在页面刷新后(对缓存端点的请求被发送到服务器,而不是从挂载的挂钩调用缓存。其他所有请求都正确地命中了浏览器缓存。

我有两个(不同的(请求从挂载的钩子中调度,当我将第二个请求移动到第一个请求的.then()中时,它开始进入浏览器缓存。

是什么导致了这种行为?如何从挂载挂钩内的缓存加载页面数据?

编辑:这种行为可以在Firefox中看到。将请求URL粘贴到新选项卡中可以正确地从浏览器缓存加载数据。我仍然没有找到一个解决方案来强制请求尊重挂载钩子内Vue代码中的缓存控制。

tl,dr
要正确测试页面的客户端缓存,请在新选项卡中复制/粘贴URL,而不是点击F5


为什么

当用户点击"刷新"时会发生什么并不完全取决于作为开发人员的您。这也取决于浏览器制造商。

如果您正在寻找一种方法来禁止浏览器加载新数据,而浏览器已经有了根据缓存控制服务器端设置仍然有效的版本,则没有。

这取决于浏览器制造商猜测用户真正想要什么并提供它。平均而言,当猜测正确时,他们的市场份额就会上升。当错误时,它会下降。由于显而易见的原因,你在其中没有发言权。

你还应该考虑到,绝大多数网站所有者不知道如何调整缓存控制,也不愿意花钱请人帮他们做,所以他们只是默认设置。因此,为了让用户满意,浏览器制造商需要正确猜测用户何时希望刷新内容,即使服务器说内容足够新鲜。

换句话说,您不能强制客户端缓存(但您可以在服务器端!(。你只能建议。如果浏览器制造商有理由相信用户想要一个";清除高速缓存和硬重新加载";但技术不够娴熟,无法执行,他们会在简单的刷新中执行。

Chrome基于大量的使用数据,试图猜测什么是";主高速缓存";对于一个页面;二级高速缓存";。它试图在提供新鲜内容(通过清除该页面的主缓存(和及时提供内容(通过不清除辅助缓存(之间取得平衡。我相信在同一域上由多于一个页面加载的任何资源都被标记为";次级";尽管我想算法比这更聪明。

据我所知,Firefox没有多种类型的刷新,所以如果用户点击刷新,则该页面的所有缓存都将消失。

最新更新