了解AWS AppSync JavaScript SDK中的Apollo客户端缓存和乐观用户界面

了解AWS AppSync JavaScript SDK中的Apollo客户端缓存和乐观用户界面,javascript,graphql,apollo,Javascript,Graphql,Apollo,我正在尝试使用AWS AppSync JavaScript SDK在Apollo客户端中实现缓存,但首先我很难理解使用缓存的最佳方式,其次我很难理解为使Apollo V2教程适应AppSync SDK而需要进行的任何更改 关于使用缓存,我有一个我得到的对象列表,然后我想查看和修改这个列表中的单个对象。关于如何更新列表中的内容,有很多教程,但我更愿意运行第二个查询,通过其ID获取单个对象,这样页面就可以始终工作,而不必首先查看列表 缓存是否足够聪明,可以知道通过查询Y和Z得到的对象X是同一个对象,

我正在尝试使用AWS AppSync JavaScript SDK在Apollo客户端中实现缓存,但首先我很难理解使用缓存的最佳方式,其次我很难理解为使Apollo V2教程适应AppSync SDK而需要进行的任何更改

关于使用缓存,我有一个我得到的对象列表,然后我想查看和修改这个列表中的单个对象。关于如何更新列表中的内容,有很多教程,但我更愿意运行第二个查询,通过其ID获取单个对象,这样页面就可以始终工作,而不必首先查看列表

缓存是否足够聪明,可以知道通过查询Y和Z得到的对象X是同一个对象,并且将同时更新?如果没有,是否有任何文档说明如何编写更新来同时更新列表中的对象和对象本身

如果没有文档存在,那么我将尝试自己编写并发布代码(因为它很可能不起作用)


关于第二个问题,我已经让应用程序工作并使用Amplify查询API进行身份验证,但我不确定如何正确实现缓存。创建客户端时是否需要指定缓存,或者SDK是否具有内置缓存?如何访问缓存?只是像这些教程中那样查询客户机吗

我先回答你的第二个问题:

关于第二个问题,我已经让应用程序工作并使用Amplify查询API进行身份验证,但我不确定如何正确实现缓存。创建客户端时是否需要指定缓存,或者SDK是否具有内置缓存?如何访问缓存?只是像这些教程中那样查询客户机吗

嗯。这里是有点麻烦的地方——看起来AppSync是在GraphQL的主要客户端库(Apollo、Relay等)进行大修时部署的,所以AWS实际上在Apollo客户端周围创建了一个包装器(可能是为了稳定的API),然后公开了他们自己的操作方式。只要快速浏览一下代码,就可以看出他们有自己的专有和未记录的做事方式)。因此,如果没有明确的解释或解释,你就处在一个未知的领域

幸运的是,他们提供的所有东西(以及更多)现在都以文档化的方式在底层Apollo客户端中实现了。更幸运的是,AppSync客户端似乎将大部分实际的GraphQL相关内容直接转发到内部Apollo缓存,并允许您在
cacheOptions
下传入配置选项,因此您可以使用Apollo客户端进行的大部分配置都可以使用AppSync客户端进行(详见下文)

不幸的是,您无法使用AppSync客户端直接访问缓存(他们将缓存隐藏起来,以确保其公共API在波动的生态系统中保持稳定)。但是,如果您确实需要更多的控制,那么他们在AppSync客户端中实现的大部分内容可以轻松地复制到您自己的Apollo客户端实例中,您可以在其中解锁完全控制(您可以使用作为基础)。由于GraphQL前端和后端是解耦的,因此没有理由不能使用自己的Apollo客户端与AppSync服务器连接(对于一个大型、严肃的项目,我会这样做,因为Apollo客户端有更好的文档记录,并且正在进行开发)

缓存是否足够聪明,可以知道通过查询Y和Z得到的对象X是同一个对象,并且将同时更新?如果没有,是否有任何文档说明如何编写更新来同时更新列表中的对象和对象本身

第一部分涉及Apollo客户端和AppSync客户端

对!!这是Apollo客户端的一大优点——每次进行查询时,它都会尝试更新缓存。缓存是一个标准化键值存储,其中所有对象都存储在顶层,该键值是对象的
\uuu typename
id
属性的组合。Apollo客户端将自动将
\uuuu typename
添加到您的所有查询中(尽管您必须手动将
id
添加到您的查询中-否则它会返回到仅作为键的查询路径本身[这不是非常健壮])

这篇文章很好地概括了这一机制

现在,你可能需要做一些更高级的事情。例如,如果您的GraphQL模式使用了一些唯一的对象标识符,而不是
id
,则必须为映射到它的
dataIdFromObject
提供一些函数

此外,有时在进行查询时,缓存很难准确地知道您在发出网络请求之前检查缓存的要求。为了缓解这一问题,它们提供了机制

最后,也许是最复杂的,是如何更新分页查询中的内容顺序(例如,有序列表中的任何内容)。为此,您必须使用指令。由于这是基于,我建议给它一个略读

好处:要查看缓存的运行情况,我建议使用。这是一个小错误,但它至少会让您了解缓存在本地的实际情况——如果使用AppSync,这将不起作用


因此,除了上述关于设置和配置缓存的信息外,您还可以在应用程序运行期间控制数据和对缓存的访问(如果直接使用Apollo客户端而不是AppSyncClient)

指定可用的方法。但是,由于大多数更新都是基于查询自动进行的