stale-while-revalidate 缓存策略是什么意思?

Which does stale-while-revalidate cache strategy mean?

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

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

例如,在尝试实施缓存优先策略时,在服务工作者的获取挂钩中,我将首先向 CacheStorage(或任何其他)询问所请求的 URL 然后如果存在respondWith 它,如果不是 respondWith 网络请求的结果。

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

  1. 首先是机制本身。 stale-while-revalidate 是指在网络响应之前使用缓存然后使用网络数据还是仅使用网络响应来为下一次更新缓存数据?
  2. 现在,如果下次缓存网络,那么哪些场景包含它的真实用例?
  3. 如果网络响应应该在应用程序中立即被替换,那么如何在 service worker 中完成呢?因为hook会用缓存的数据解析,然后无法解析网络数据(withrespondWith)。
  1. 是的,就是这个意思。思路很简单:从缓存中立即响应,然后在后台刷新缓存以供下次使用。

  2. 始终获取最新版本的 page/app 并不重要的所有场景 =) 我在两个不同的 Web 应用程序上使用了 stale-while-revalidate 策略,一个用于 public 交通服务,还有一个用于显示餐厅菜单信息。许多 sites/apps 对此都很好,但当然不是全部。

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

  1. 不可能以任何自动方式。但是,您可以做的是使用 window.postMessage API 在 Service Worker 和 "regular JS code on the page" 之间实现一个消息通道。您可以监听页面上的某些消息,然后在发生重要更改并且缓存已更新时从 Service Worker 发送消息。然后你可以向用户显示一个提示,告诉用户页面确实需要立即重新加载,或者甚至强制从 JS 重新加载它。当然,您需要将这种确定何时发生重要更新的逻辑放入 Service Worker 中。