Y del autor, obtiene el ID, nombre y avatar. Y hay un truco mágico que hace que la caché de GraphQL sea realmente excelente. Y eso es el campo meta __typename. Puedes agregarlo a cualquier objeto de GraphQL, en tu consulta, puedes agregarlo a cualquier tipo de objeto, y obtendrás el nombre del tipo de respuesta. Así que, por ejemplo, con esta consulta, agregaríamos el nombre del tipo en estos dos lugares para la publicación y también para el autor.
Cuando el origen responde con los datos, la respuesta se verá algo así, siendo lo más importante que ahora tenemos los datos de la publicación y sabemos que el tipo que se devolvió allí fue una publicación, y lo mismo para el autor, obtuvimos los datos del autor y también sabemos que el autor es un usuario. Y cuando tomamos esta respuesta y la almacenamos en nuestra caché localmente en el navegador, ahora podemos asociar esa respuesta de consulta en caché con esos dos objetos. Podemos etiquetarla con la publicación con el ID 5 y el usuario con el ID 1.
De acuerdo, eso está bien. Así que acabamos de tomar esta respuesta de consulta, la hemos almacenado en la caché, la hemos identificado por la consulta que vimos, por la consulta de obtener publicación. Y cada vez que vemos la misma consulta, devolvemos los mismos datos. ¿Por qué son relevantes estas etiquetas? ¿Por qué me importa que esto contenga la publicación con el ID 5 y el usuario con el ID 1? Bueno, aquí es donde entra la magia. GraphQL también tiene algo llamado mutaciones, que son básicamente acciones. Cualquier cosa que cambie los datos debe ser una mutación. Por ejemplo, si tuviéramos una mutación que se llamara editar publicación, que edita una publicación, en este caso, estamos editando la publicación con el ID 5 y cambiando su título. Cualquier mutación también debe obtener lo que cambió. Así que en este caso, estamos obteniendo de vuelta la publicación. Y nuevamente, podemos hacer lo mismo que hicimos para la consulta y agregar el campo __typename a la respuesta.
Ahora, cuando esa respuesta regresa desde el origen a nuestro cliente, el cliente puede mirar esta respuesta y decir, oh, mira, acabamos de enviar una mutación al origen. Esa mutación ha regresado del origen y los datos que se devolvieron fueron la publicación con el ID 5. ¡Ajá! En realidad tengo una respuesta de consulta en caché que contiene esa publicación con el ID 5. Y ahora puedo invalidar automáticamente ese resultado de consulta en caché que contiene los datos obsoletos de esta publicación. ¡Eso es increíble, verdad? Y esto es lo que hacen los clientes de GraphQL bajo el capó. Hacen esta invalidación mágica basada en el campo __typename y el campo ID, y luego los combinan para invalidar cualquier dato obsoleto que haya sido cambiado en el origen.
Hay un pequeño caso especial aquí donde la magia termina, que es la invalidación de listas. Si te imaginas una consulta que obtiene una lista de publicaciones de blog, en este caso, solo su ID y título, cuando miramos la respuesta a esta consulta, es una matriz que solo contiene la única publicación que tenemos en este momento, la publicación con el ID cinco, cómo almacenar en caché los APIs de GraphQL en el borde. Ahora, una mutación que crea una nueva publicación ahora plantea un problema interesante, porque por supuesto, la respuesta a esta mutación de crear publicación se verá algo así. Devolverá un objeto de una publicación con el ID seis, pero por supuesto, nuestros resultados de consulta en caché para la lista de publicaciones no contienen la publicación con el ID seis. Y eso es realmente molesto, porque eso significa que los clientes de GraphQL no pueden invalidar automáticamente las listas cuando se crean nuevos elementos. Bastante frustrante.
Comments