Nous utilisons le client apollo dans une application web et nous cherchons des moyens d'améliorer l'utilisation du cache.
Nous avons une requête qui prend un tableau d'ids comme paramètre ; un exemple de requête avec des ids foo
y bar
ressemblerait à ceci :
query routes {
routes(routeNames: ["foo", "bar"]) {
items {
name
route
defaults
}
}
}
La configuration du cache ressemble à ceci :
export const cacheRedirects = {
Query: {
routes: (_: any, args: RoutesArgs, { getCacheKey }: Resolver<'name'>): Array<CacheKey> =>
args.routeNames.map(name => getCacheKey({ __typename: 'Route', name })),
},
};
export const dataIdFromObject = (object: QueryResult): ?string => {
switch (object.__typename) {
case 'Route':
return `${object.__typename}:${object.name}`;
default: return defaultDataIdFromObject(object);
}
};
export function newCache(): InMemoryCache {
return new InMemoryCache({ dataIdFromObject, cacheRedirects });
}
Maintenant, lorsque nous utilisons la requête à plusieurs endroits dans notre client, nous aimerions récupérer uniquement les données pour les noms de route qui ne sont pas mis en cache via le réseau et récupérer le reste via le cache.
Le problème se résume donc à ceci : Lorsqu'on a une requête qui met en cache les résultats pour routeNames: ["foo", "bar"]
et plus tard, une autre requête arrive demandant les routes pour routeNames: ["bar", "baz"]
nous aimerions prendre le résultat correspondant à "bar"
du cache et envoyer une requête pour routeNames: ["baz"]
.
Je ne sais pas si et comment cela peut être fait avec Apollo parce que, contrairement à la Exemple de cacheRedirect Ici, nous avons affaire à plusieurs identifiants plutôt qu'à un seul.
Maintenant, si nous ne pouvons pas mettre en cache chaque élément du tableau, la prochaine meilleure chose que nous pourrions faire serait de transformer les identifiants en clés de cache communes de sorte que ["foo", "bar"]
y ["bar", "foo"]
finissent par utiliser la même clé de cache, mais ["foo", "baz"]
en utiliserait un autre.
Bien sûr, l'idéal serait de ne récupérer que "baz"
comme l'élément manquant dans notre scénario.