Angular 5服务工作者:数据更新或插入后缓存刷新

6
我一直在阅读有关 Angular 5 和 Angular CLI 新 Service Workers 支持的文章,我觉得非常有趣。我特别感兴趣的是缓存 API 端点。在我所读的所有教程中,它们似乎都集中在缓存端点调用一次,然后从缓存存储中提供未来请求。如果我的 Web 应用程序经常更新或插入数据怎么办?所有请求仍将继续从缓存中提供,这将导致获取旧数据而不是我刚刚更新或插入的新数据,只有通过对 API 端点进行新的调用才能检索到。我们如何保持同步?
为了使我的问题更加明确;简而言之,我想问的是如何根据需要刷新缓存。我知道如果我选择“新鲜度”策略,它将始终从网络获取,除非在网络故障或超时的情况下,它会默认使用缓存。如果我选择“性能”策略,它将始终从缓存中提供,并且不适合经常更改的内容。我想要的是两者的结合。我希望它始终从缓存中提供,除非我明确告诉它不要这样做。例如,当我创建新客户时,我想刷新缓存,然后继续从缓存中提供,直到我告诉它刷新为止。

1
请查看此页面:https://medium.com/codingthesmartway-com-blog/angular-5-service-worker-b722e571e306其中有一个名为“从外部API缓存内容”的部分可能对您有所帮助。 - Tony
谢谢Tony。我看到这是一个选择。 - Eliyah
你不能在ngsw-config.json中使用datagroup的新鲜策略吗? - Borad Akash
@BoradAkash,我已经编辑了问题并进行了更详细的解释。一开始不是很清楚。 - Eliyah
1个回答

3

首先:

截至本答案的日期,Service Workers不能缓存所有请求。它们只能缓存GET请求,因为POST请求本质上意味着更改后端模型的状态。如果您希望在离线时缓冲除GET请求之外的其他内容(然后在重新连接到互联网时重放它们),请阅读这里。关于允许服务工作者缓存POST请求的讨论仍在进行中。

话虽如此,如果您的应用程序仅使用GET来填充浏览器中的应用程序状态,则离线状态下也将正常工作(一旦用户至少访问了所有GET请求,以便它们已被缓存)。

默认情况下,此缓存机制未启用。您需要修改ngsw-config.json来设置它。对于API请求缓存,dataGroups是放置配置的正确位置。

"dataGroups": [
    {
      "name": "api",
      "urls": [
        "https://api.yourdomain.com/**"
      ],
      "cacheConfig": {
        "strategy": "freshness",
        "maxSize": 100,
        "maxAge": "1d",
        "version": 1
      }
    }
  ]

请注意cacheConfig中的strategy部分。这是告诉服务工作者如何运作的关键。在这个例子中,你可以看到我将其设置为freshness。这意味着工作者将首先尝试访问互联网并获取新鲜数据。如果失败,它将提供缓存版本(如果有)。另一个允许的值是performance,它将首先提供缓存的数据(如果有),然后在后台同步缓存在线上。
你可以在官方文档中找到更多关于服务工作者配置的内容。

感谢您的回复和详细解释,但我的问题仅涉及缓存获取请求。简而言之,我想问的是如何根据需要刷新缓存。假设我正在缓存客户信息(GetCustomerInfo API请求),在后期我注册了一个新客户,并且在这个特定点上,我想通过调用get API来刷新缓存。如何实现? - Eliyah
如果您需要更细粒度的缓存机制控制,可以构建自己的服务工作者脚本。https://googlechromelabs.github.io/sw-toolbox/ 是一个很好的起点。 - Heehaaw
让我试着这样说吧;我理解如果我选择“新鲜度”策略,它将始终从网络获取,除非在网络故障或超时的情况下,此时它会默认使用缓存。如果我选择“性能”策略,它将始终从缓存数据提供服务,并且不适用于经常更改的内容。我想要的是两者兼备。我希望它始终从缓存中提供服务,除非我明确告诉它不要这样做。 - Eliyah
@Eliya,我认为你正在寻找的是后台同步。这个问题正在追踪:https://github.com/angular/angular/issues/22145 - jvitor83
该问题要求找到一种更新缓存的方法(最初由GET创建),因为POST更改了服务器上的数据。缓存的计算值应该更新缓存。否则,在离线状态下刷新页面将会使POST所做的修改失效。 - Frik
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接