我正在寻找一种模式,可以让我为我的用户改善 UX。我有一个在 CloudFront 后面运行的 REST 服务器,从前端的普通 React 应用程序中使用。
我将简化我的示例来说明我的问题。
我有一个名为GET /posts/<id>
. 当浏览器请求它时,它带有一个max=age=180
,这意味着它将存储在浏览器的缓存中,并且任何后续调用都GET /posts/<id>
将在这 180 秒的持续时间内从浏览器的缓存中提供服务,之后它将再次访问 CDN 以尝试获取新副本。
这对大多数用户来说是可以的。我不介意任何帖子的更新在传播给所有用户之前延迟最多 3 分钟。但是有一个用户是这篇文章的作者。该用户可以使用PATCH /posts/<id>
. 我们称该用户为 The Editor。
这是我现在的一个场景:
- 编辑器加载帖子页面,然后调用
GET /posts/5
- CDN 将最新的副本提供给前端。
- 然后编辑器对帖子进行更改并将其提交到后端通过
PATCH /posts/5
. - 然后编辑器使用 Command-R(或 CTRL-R)刷新他的浏览器选项卡。
- 结果,前端然后
GET /posts/5
再次请求 - 但从更改之前获取过时的副本,因为自上次以来还没有过去 180 秒,GET
并且GET
在PATCH
我想要的体验是:
- 编辑器加载帖子页面,然后调用
GET /posts/5
- CDN 将最新的副本提供给前端。
- 然后编辑器对帖子进行更改并将其提交到后端通过
PATCH /posts/5
. - 在 Command-R 浏览器选项卡刷新后,无论在 180 秒内获得新副本之前,都会立即
GET /posts/5
返回带有编辑器所做更改的数据副本。PATCH
ttl
- 至于其他用户,他们可以等待最多 180 秒,然后帖子中的更改才会传播给他们,当
GET /posts/5
我正在使用 Axios,但我不认为 SWR 和 React-Query 支持突变。据我了解,这将允许编辑器为他刚刚PATCH'ed
在服务器上的对象声明一个突变,以便他进行的任何后续调用GET /posts/5
都将从那里得到服务,直到可以从后端获得更新的版本。
我的问题是:
- 带有“突变”的 SWR 可以通过
GET /posts/5
透明的方式为突变对象服务吗? - 突变会在硬浏览器标签刷新后幸存下来吗?或浏览器关闭,重新打开和后续
/GET posts/5
? - 是否有另一种模式/最佳实践来解决这个问题?