【发布时间】:2020-02-27 07:22:44
【问题描述】:
我有一个 React 应用程序,我在其中向后端 API 发出 fetch 请求。 我正在尝试在 UI 端实现缓存以应对繁重的请求。
我能够在 Mozilla Firefox 中成功完成,并且运行良好。 但是铬让我很难过。 这是我正在尝试实现的一段代码-
fetch(URL, {
signal: this.abortController.signal,
cache: "default",
headers: {
"Cache-Control": "max-age=120"
}
})
.then(response => return response.json())
.catch(error => {
if (error.name === "AbortError") {
return;
}
this.setError(error);
});
我正在跟踪检查缓存的过程-
- 首先打开正在执行提取请求的选项卡。
- 将标签更改为其他标签。
- 在超时期限(120 秒)内返回到步骤 1 中提到的选项卡
在检查 Firefox 的网络选项卡时,我可以看到“已传输”为“缓存”,页面加载有了显着改善,一切都按预期工作。
但是,在 Chrome 中,我仍然可以看到“3.9 KB”的“大小”和一些“毫秒”的时间。
我尝试了 -Is Chrome ignoring Cache-Control: max-age? 中提到的步骤,但没有任何成功。
我还发现-https://www.mnot.net/blog/2017/03/16/browser-caching说
Chrome 仅支持请求中的 max-age=0,并且仅支持值为 0。它不支持 min-fresh 或 max-stale。
但它有点旧(2017 年),我不确定它是否仍然适用。
另外,查看 Fetch 规范 - https://fetch.spec.whatwg.org/#concept-request-cache-mode 'default' 是我需要的缓存模式,但我不确定为什么它不能跨 chrome 工作
有人可以指导我正确的方向吗?需要做什么才能使其在 firefox 和 chrome 中都能正常工作?
编辑 - 好的,使用 'cache' 作为 'force-cache' 可以在 google chrome 和 firefox 中使用。
来自 - https://hacks.mozilla.org/2016/03/referrer-and-cache-control-apis-for-fetch/
“默认”是指在下载资源时使用浏览器的默认行为。 firefox 和 chrome 的默认行为是否不同?由于它是浏览器的默认行为,它取决于浏览器如何使用它。
还有,
“force-cache”意味着如果在缓存中找到匹配的条目,浏览器将始终使用缓存的响应,而忽略响应的有效性。因此,即使在缓存中找到了一个非常旧的响应版本,它也将始终在未经验证的情况下使用。
我不确定“强制缓存”对 chrome 的作用,但这是我不需要的。
【问题讨论】:
-
在发回响应时,我只在服务器端设置了 max-age。在您的示例中,您似乎在发出请求时将其设置为客户端?
-
是的,我在客户端设置它。我对服务器端响应没有太多控制,因为它是第三方。
-
这里建议使用本地存储:stackoverflow.com/questions/12770185/…
-
你可以在这里阅读更多。 stackoverflow.com/questions/46339832/…
-
谢谢,我去看看。我试图使用正在工作的“会话存储”。我也为到期日提出了解决方法。唯一的问题是我可以看到几秒钟的延迟。在更改选项卡时,浏览器会在渲染缓存之前挂起/粘滞 2-3 秒。这看起来不太好。
标签: javascript reactjs google-chrome fetch browser-cache