【问题标题】:Which does stale-while-revalidate cache strategy mean?stale-while-revalidate 缓存策略是什么意思?
【发布时间】:2020-06-01 04:33:47
【问题描述】:

我正在尝试使用 ServiceWorker 实现不同的缓存策略。对于以下策略,实现方式是完全明确的:

  1. 缓存优先
  2. 仅缓存
  3. 网络优先
  4. 仅限网络

例如,在尝试实现缓存优先策略时,在 service-worker 的 fetch 挂钩中,我将首先向 CacheStorage(或任何其他)询问请求的 URL,然后如果存在 respondWith 它,如果不是respondWith网络请求的结果。

但是对于根据thisworkbox定义的stale-while-revalidate策略,我有以下问题:

  1. 首先是关于机制本身。 stale-while-revalidate 是否意味着在网络响应之前使用缓存,然后使用网络数据或仅使用网络响应来更新您的缓存数据以供下次使用?
  2. 现在,如果网络被缓存以备下次使用,那么哪些场景包含它的真实用例?
  3. 如果应该在应用程序中立即替换网络响应,那么如何在 service worker 中完成呢?因为钩子会被缓存的数据解析,然后网络数据无法解析(使用respondWith)。

【问题讨论】:

    标签: caching fetch service-worker service-worker-events


    【解决方案1】:
    1. 是的,就是这个意思。思路很简单:立即从缓存中响应,然后在后台刷新缓存以备下次

    2. 始终获取最新版本的页面/应用程序并不重要的所有场景 =) 我在两个不同的 Web 应用程序上使用 stale-while-revalidate 策略,一个用于公共交通服务,一个用于公共交通服务用于显示餐厅菜单信息。许多网站/应用程序都可以这样做,但当然不是全部。

    在#2 中需要注意的一件非常重要的事情: 你可以例如。仅对静态资产使用 stale-while-revalidate。这样,您的 html、js、css、图像等将被缓存并快速提供给用户,但从 API 动态获取的数据仍然是新鲜的。对于某些应用程序来说,这很有效,而对于其他一些应用程序来说则不太好。完全取决于应用程序。当然,如果用户正在运行应用程序的早期版本等,您必须记住不要更改 API 的语义。

    1. 不可能以任何自动方式。但是,您可以做的是使用 window.postMessage API 在 Service Worker 和“页面上的常规 JS 代码”之间实现一个 msg 通道。您可以在页面上监听某些消息,然后在发生重要更改并且缓存已更新时,从 Service Worker 发送消息。然后,您可以向用户显示一个提示,告知该页面现在确实需要重新加载,甚至可以从 JS 强制重新加载。当然,您需要将这种确定何时发生重要更新的逻辑放入 Service Worker。

    【讨论】:

    • 谢谢@pate。很好的答案。而且我还想指出,这样一来,缓存策略将仅用于性能(速度)问题,而不是减少网络流量,因为每次缓存存在或不存在时都会发送重新验证请求。
    • 令人困惑的是 b/c 工作箱对 stale-while-revalidate 的定义与浏览器的 http 缓存定义不同,但名称相同。浏览器仅在资产陈旧时重新验证......这是有道理的。工作箱重新验证每个请求..?看起来很浪费。
    • 一些问题伙计们,1)例如,我正在从 api.website.com 获取数据,它是否由 StaleWhileRevalidate(new RegExp('\/api\.')) 缓存? 2) 什么缓存在全局中,也只是文件或 api 调用?如果 api 调用也被缓存,我如何排除我不想缓存的 api? 3)在插件中,maxEntries 表示一台计算机或每个人,谢谢
    猜你喜欢
    • 2019-04-08
    • 2017-02-28
    • 1970-01-01
    • 2018-06-15
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    相关资源
    最近更新 更多