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

Why do AJAX GET requests sent from the mounted hook in Vue.js always ignore the browser cache?

我在我的 Vue 组件中为我的 AJAX 请求使用 Axios 并注意到(在页面刷新后)对缓存端点的请求被发送到服务器而不是命中缓存,如果它们是从已安装的钩。每个其他请求都正确命中浏览器缓存。

我有两个(不同的)请求从已安装的钩子中分派,当我将第二个请求移到第一个请求的 .then() 中时,它开始访问浏览器缓存。

是什么导致了这种行为?我怎样才能从 mounted hook 中的缓存中加载页面数据?

编辑:此行为出现在 Firefox 中。将请求 URL 粘贴到新选项卡中会正确加载浏览器缓存中的数据。我仍然没有找到一个解决方案来强制请求遵守挂载钩子内 Vue 代码中的缓存控制。

tl,dr;
要正确测试页面的客户端缓存,copy/paste 在新选项卡中 URL 而不是点击 F5.


为什么?

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

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

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

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

换句话说,您不能强制执行客户端缓存(但可以在服务器端执行!)。你只能建议。如果浏览器制造商有理由相信用户想要“清除缓存和硬重新加载”但技术不够精通以执行它,他们将在简单的刷新时执行它。

Chrome,根据大量的使用数据,猜测一个页面的“一级缓存”和“二级缓存”。它试图在提供新鲜内容(通过清除该页面的一级缓存)和及时提供内容(通过不清除二级缓存)之间取得平衡。我相信由同一域上的多个页面加载的任何资源都被标记为“次要”,尽管我猜该算法比这更聪明。

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