Relay es una biblioteca de JavaScript desarrollada por Facebook que se utiliza para gestionar datos en aplicaciones React utilizando GraphQL. Relay se centra en la eficiencia, la consistencia y la escalabilidad, permitiendo a los desarrolladores construir aplicaciones rápidas y robustas.
Objetivos de Aprendizaje
Al final de esta sección, deberías ser capaz de:
- Comprender qué es Relay y por qué se utiliza.
- Configurar un entorno básico de Relay.
- Realizar consultas y mutaciones utilizando Relay.
- Implementar fragmentos y contenedores de datos en Relay.
¿Qué es Relay?
Relay es una biblioteca de gestión de datos para aplicaciones React que utiliza GraphQL para especificar los datos que necesita una aplicación. Relay se encarga de:
- Obtener datos: Realiza consultas a un servidor GraphQL para obtener los datos necesarios.
- Actualizar datos: Maneja mutaciones para actualizar los datos en el servidor.
- Optimizar el rendimiento: Minimiza la cantidad de datos transferidos y optimiza las actualizaciones de la interfaz de usuario.
Ventajas de Usar Relay
- Declarativo: Especificas los datos que necesitas y Relay se encarga de obtenerlos.
- Consistencia: Mantiene una caché de los datos para asegurar que la interfaz de usuario esté siempre sincronizada con el estado del servidor.
- Escalabilidad: Diseñado para aplicaciones grandes y complejas.
Configuración de un Entorno Básico de Relay
Requisitos Previos
- Node.js y npm instalados.
- Conocimientos básicos de React y GraphQL.
Instalación
Primero, instala las dependencias necesarias:
Configuración del Entorno
-
Configura Babel: Relay requiere Babel para transformar el código. Instala las dependencias de Babel:
npm install --save-dev babel-plugin-relay
Luego, añade el plugin de Relay a tu configuración de Babel (
.babelrc
):{ "plugins": ["relay"] }
-
Configura Relay Compiler: Relay Compiler es una herramienta que analiza tus consultas GraphQL y genera código optimizado. Instálalo:
npm install --save-dev relay-compiler
Añade un script en tu
package.json
para ejecutar Relay Compiler:"scripts": { "relay": "relay-compiler --src ./src --schema ./schema.graphql" }
Asegúrate de tener un archivo de esquema GraphQL (
schema.graphql
) en tu proyecto.
Realizando Consultas con Relay
Definiendo una Consulta
Crea un archivo de consulta GraphQL (MyQuery.graphql
):
Creando un Contenedor de Datos
Crea un componente React que utilice la consulta:
import React from 'react'; import { QueryRenderer, graphql } from 'react-relay'; import environment from './environment'; // Configura tu entorno de Relay const MyComponent = ({ viewer }) => ( <div> <h1>{viewer.name}</h1> </div> ); const MyQueryRenderer = () => ( <QueryRenderer environment={environment} query={graphql` query MyQuery { viewer { id name } } `} render={({ error, props }) => { if (error) { return <div>Error: {error.message}</div>; } if (!props) { return <div>Loading...</div>; } return <MyComponent viewer={props.viewer} />; }} /> ); export default MyQueryRenderer;
Explicación del Código
- QueryRenderer: Componente de Relay que ejecuta una consulta GraphQL y renderiza el resultado.
- environment: Configuración de Relay que define cómo se comunican las consultas con el servidor GraphQL.
- graphql: Etiqueta de plantilla que define la consulta GraphQL.
Realizando Mutaciones con Relay
Definiendo una Mutación
Crea un archivo de mutación GraphQL (MyMutation.graphql
):
Creando una Mutación en Relay
Crea un archivo de mutación en JavaScript:
import { commitMutation, graphql } from 'react-relay'; import environment from './environment'; const mutation = graphql` mutation MyMutation($input: MyInput!) { myMutation(input: $input) { viewer { id name } } } `; function commit(input, onCompleted, onError) { return commitMutation(environment, { mutation, variables: { input }, onCompleted, onError, }); } export default { commit };
Usando la Mutación en un Componente
Crea un componente React que utilice la mutación:
import React from 'react'; import MyMutation from './MyMutation'; class MyComponent extends React.Component { handleClick = () => { const input = { /* datos de entrada */ }; MyMutation.commit(input, response => { console.log('Respuesta:', response); }, error => { console.error('Error:', error); }); }; render() { return ( <button onClick={this.handleClick}> Ejecutar Mutación </button> ); } } export default MyComponent;
Explicación del Código
- commitMutation: Función de Relay para ejecutar una mutación.
- mutation: Definición de la mutación GraphQL.
- commit: Función que ejecuta la mutación con las variables de entrada y callbacks para manejar la respuesta y errores.
Fragmentos y Contenedores de Datos
Definiendo un Fragmento
Crea un archivo de fragmento GraphQL (MyFragment.graphql
):
Usando el Fragmento en un Componente
Crea un componente React que utilice el fragmento:
import React from 'react'; import { createFragmentContainer, graphql } from 'react-relay'; const MyComponent = ({ viewer }) => ( <div> <h1>{viewer.name}</h1> </div> ); export default createFragmentContainer(MyComponent, { viewer: graphql` fragment MyFragment on Viewer { id name } ` });
Explicación del Código
- createFragmentContainer: Función de Relay que crea un contenedor de datos para un componente React.
- fragment: Definición del fragmento GraphQL.
Ejercicio Práctico
Ejercicio
- Configura un entorno de Relay en una aplicación React.
- Crea una consulta GraphQL para obtener una lista de usuarios.
- Implementa un componente React que utilice la consulta para mostrar la lista de usuarios.
- Crea una mutación GraphQL para añadir un nuevo usuario.
- Implementa un componente React que utilice la mutación para añadir un nuevo usuario a la lista.
Solución
-
Configura el entorno siguiendo los pasos de la sección "Configuración de un Entorno Básico de Relay".
-
Crea la consulta (
UsersQuery.graphql
):query UsersQuery { users { id name } }
-
Implementa el componente (
UsersList.js
):import React from 'react'; import { QueryRenderer, graphql } from 'react-relay'; import environment from './environment'; const UsersList = ({ users }) => ( <ul> {users.map(user => ( <li key={user.id}>{user.name}</li> ))} </ul> ); const UsersQueryRenderer = () => ( <QueryRenderer environment={environment} query={graphql` query UsersQuery { users { id name } } `} render={({ error, props }) => { if (error) { return <div>Error: {error.message}</div>; } if (!props) { return <div>Loading...</div>; } return <UsersList users={props.users} />; }} /> ); export default UsersQueryRenderer;
-
Crea la mutación (
AddUserMutation.graphql
):mutation AddUserMutation($input: AddUserInput!) { addUser(input: $input) { user { id name } } }
-
Implementa el componente (
AddUser.js
):import React, { useState } from 'react'; import AddUserMutation from './AddUserMutation'; const AddUser = () => { const [name, setName] = useState(''); const handleAddUser = () => { const input = { name }; AddUserMutation.commit(input, response => { console.log('Usuario añadido:', response); }, error => { console.error('Error:', error); }); }; return ( <div> <input type="text" value={name} onChange={e => setName(e.target.value)} placeholder="Nombre del usuario" /> <button onClick={handleAddUser}> Añadir Usuario </button> </div> ); }; export default AddUser;
Conclusión
En esta sección, hemos aprendido sobre Relay, una poderosa biblioteca para gestionar datos en aplicaciones React utilizando GraphQL. Hemos cubierto cómo configurar un entorno básico de Relay, realizar consultas y mutaciones, y utilizar fragmentos y contenedores de datos. Relay ofrece una forma eficiente y escalable de manejar datos en aplicaciones React, asegurando que la interfaz de usuario esté siempre sincronizada con el estado del servidor.
En el próximo módulo, exploraremos las suscripciones de GraphQL, que permiten a las aplicaciones recibir actualizaciones en tiempo real desde el servidor.
Curso de GraphQL
Módulo 1: Introducción a GraphQL
- ¿Qué es GraphQL?
- GraphQL vs REST
- Configuración de un Servidor GraphQL
- Conceptos Básicos del Esquema de GraphQL
Módulo 2: Conceptos Fundamentales
Módulo 3: Diseño Avanzado de Esquemas
Módulo 4: Trabajando con Datos
Módulo 5: Rendimiento y Seguridad
Módulo 6: Herramientas y Ecosistema
Módulo 7: Pruebas y Despliegue
- Pruebas Unitarias de Resolvers
- Pruebas de Integración
- Integración Continua
- Despliegue de Servidores GraphQL