React Suspense with Apollo Client

This ad is not shown to multipass and full ticket holders
React Summit US
React Summit US 2025
November 18 - 21, 2025
New York, US & Online
The biggest React conference in the US
Learn More
In partnership with Focus Reactive
Upcoming event
React Summit US 2025
React Summit US 2025
November 18 - 21, 2025. New York, US & Online
Learn more
Bookmark
Rate this content

Para muchos desarrolladores de aplicaciones, GraphQL es fundamental para construir excelentes experiencias de usuario. Con la introducción de React Suspense, los desarrolladores tienen una forma ergonómica de orquestar estados de carga para mejorar el status quo. En esta charla, el equipo de Apollo Client te mostrará cómo construimos una aplicación no trivial utilizando las nuevas características de Suspense de Apollo Client, características de GraphQL como la directiva @defer, y cómo combinarlas para construir excelentes experiencias de usuario en tus propias aplicaciones.

This talk has been presented at React Advanced 2023, check out the latest edition of this React Conference.

FAQ

UseSuspenseQuery es una versión suspenseful del hook UseQuery de Apollo Client que integra características de React Suspense para mejorar la gestión de estados de carga en aplicaciones web.

React Suspense permite una gestión más eficiente y estética de los estados de carga, reduciendo los destellos y mejorando las transiciones, lo que resulta en una experiencia de usuario más fluida y agradable.

La charla no cubrirá los componentes del servidor React ni el SSR en streaming, enfocándose en lugar de ello en la gestión de datos en suspense con los hooks de Apollo Client.

En la versión 3.8 de Apollo Client se lanzaron nuevos hooks como UseSuspenseQuery, que incorpora características de React 18 y mejora la integración con React Suspense.

UseSuspenseQuery elimina la necesidad de manejar booleanos de carga, permitiendo que React Suspense maneje la renderización de los estados de carga, simplificando el código y mejorando la experiencia del usuario.

Se discuten estrategias como el uso de UseSuspenseQuery para gestionar los estados de carga y la directiva 'defer' en GraphQL para controlar la carga de datos, optimizando así la performance y la experiencia del usuario.

Se puede contactar a los mantenedores de Apollo Client a través de sus perfiles en línea o consultando el paquete experimental de Next.js mostrado durante la charla.

Jerel Miller
Jerel Miller
Alessia Bellisario
Alessia Bellisario
29 min
20 Oct, 2023

Comments

Sign in or register to post your comment.
Video Summary and Transcription
Esta charla discute el uso de suspense y GraphQL con el cliente Apollo para construir excelentes experiencias de usuario. Explica los conceptos básicos de React Suspense y cómo obtener datos en suspense con los nuevos hooks de suspense del cliente Apollo. La charla también cubre la optimización de la experiencia de carga añadiendo límites de suspense, utilizando la directiva defer en GraphQL, e integrando hooks de suspense con las transiciones de React 18. Los planes futuros incluyen nuevas APIs como suspenseful use fragment y lazy use background query en Apollo Client 3.9. También se mencionan estrategias de prueba para suspense en componentes y la personalización de estados de carga.

1. Introducción a la Charla

Short description:

Estamos emocionados de estar aquí en Londres para hablar sobre el uso de suspense y GraphQL con el cliente Apollo. También discutiremos sobre cómo construir excelentes experiencias para el usuario final. Permítanos presentarnos rápidamente. Soy Gerald Miller, un ingeniero de software principal en Apollo, y puedes encontrarme en línea como Gerald Miller. Soy Alessia Balissario, una ingeniera de software en Apollo, y estoy en AlessBell.

Qué día tan increíble. Estamos muy emocionados de estar aquí con todos ustedes en Londres. Y vamos a hablar sobre cómo usar suspense y GraphQL con el cliente Apollo y cómo construir experiencias realmente excelentes para el usuario final. Pero primero, permítanos presentarnos muy rápidamente porque Amber ya hizo un gran trabajo. No sé si se va a decir algo nuevo aquí, pero yo soy Gerald Miller. Soy un ingeniero de software principal en Apollo trabajando como mantenedor en el cliente Apollo. Y puedes encontrarme prácticamente en todas partes en línea con mi nombre de usuario Gerald Miller. Y yo soy Alessia Balissario. Soy una ingeniera de software también en Apollo y estoy en AlessBell.

Read also

2. Introducción a React Suspense y Apollo Client

Short description:

Esta charla trata sobre la reintroducción de los conceptos básicos de React Suspense en el contexto de las aplicaciones web renderizadas por el cliente y se centra en cómo obtener datos en suspense con los nuevos hooks de suspense de Apollo Client. No cubriremos los componentes del servidor React ni el SSR en streaming. Consulta el paquete experimental de Next.js para obtener más información.

Así que vamos a sumergirnos y hablar sobre lo que vamos a cubrir hoy. Esta charla va a ser sobre la introducción o reintroducción para algunos de ustedes, de algunos conceptos básicos de React Suspense en el contexto de las aplicaciones web renderizadas por el cliente y centrándonos en cómo obtener datos en suspense con los nuevos hooks de suspense de Apollo Client que lanzamos en agosto en la versión 3.8 de Apollo Client. Y también hablar sobre lo que no vamos a cubrir hoy. No vamos a cubrir los componentes del servidor React o el SSR en streaming. Parece que hay muchas sesiones aquí hoy. Esperamos que eches un vistazo a algunos de esos avances súper interesantes en el ecosistema de React. Pero si tienes curiosidad sobre este espacio con Apollo específicamente, puedes consultar nuestro paquete experimental de Next.js como ves en la pantalla aquí. También un saludo a nuestro co-mantenedor Lens que ha hecho gran parte del trabajo para esto aquí. Así que si tienes preguntas sobre esto, definitivamente contáctalo. También lo que no vamos a cubrir es cómo implementar realmente el soporte para suspense en una biblioteca de obtención de datos, porque en realidad es un poco más complicado de lo que parece.

3. Explorando React Suspense y Estados de Carga

Short description:

Volvamos a 2018 cuando Andrew Clark destacó la diferencia en los estados de carga entre plataformas nativas como iOS y la web. React suspense va más allá de la representación de los estados de carga y proporciona una forma componible de gestionar las transiciones. Discutiremos el suspense en el contexto de Apollo Client y el hook UseSuspenseQuery. Presta atención a los cuadros de colores en la pantalla, que representan áreas de nuestra interfaz de usuario con hooks UseQuery. Echemos un vistazo a la UX de carga.

Bueno, volvamos en el tiempo a 2018 cuando Andrew Clark, miembro del equipo central de React, envió este tweet en enero de 2018. Esto fue más de un mes antes de la charla de Dan Abramov en JSConf Islandia titulada más allá de React 16, que dio una mirada al futuro de React e introdujo suspense con algunas de las primeras demostraciones públicas. Creo que este es un buen lugar para empezar porque Andrew aquí está hablando de ciertos patrones de interacción que simplemente se sentían mucho más agradables y aún lo hacen de muchas maneras en plataformas nativas como iOS en comparación con la web y las experiencias que se ven más a menudo en esas plataformas.

Andrew escribió, una razón por la que iOS se siente mejor que la web, menos estados de carga innecesarios. Mira lo que sucede aquí en esta grabación de pantalla cuando tocas una opción en la aplicación de configuración. En lugar de hacer una transición inmediata y mostrar un spinner por una fracción de segundo, se pausa por un momento hasta que la vista está lista y esa vista se desliza. Mucho más fluido. Creo que esto es realmente previsor, fue en 2018, y presagió mucho de hacia dónde iba el ecosistema en términos de gestión de estas transiciones en la web.

Sí. Entonces, si has usado Apollo durante algún tiempo, probablemente has usado este hook bastante veces, useQuery. Esta es la forma en que normalmente obtienes data en tus aplicaciones hoy en día. Esto viene con realmente dos exportaciones que usas la mayoría de las veces, la propiedad data y el booleano de carga que usas para determinar cuándo mostrar un estado de carga en tus componentes. Solo para echar un vistazo a un pequeño ejemplo aquí, tenemos este pequeño componente de álbumes aquí que usa el hook useQuery para obtener algunos data y mostrar este booleano de carga. No es sorpresa cuando tocas este botón, ves este estado de carga aquí. Cuando ese booleano de carga es verdadero, obtenemos ese pequeño bit. Cuando termina de cargar, podemos ver nuestra lista de álbumes aquí. Y así, mientras acabamos de mirar el status quo y ese destello de un spinner de carga, y vamos a hablar mucho sobre los estados de carga hoy, y cómo eso impacta en la UX de nuestras aplicaciones que estamos construyendo, realmente queríamos poner una advertencia ahí fuera de que React suspense no se trata solo de tener un mecanismo diferente para representar los estados de carga. Solo una API diferente para mostrar spinners y fallbacks. Realmente nos da esta forma muy componible, muy Reacty de orquestar y gestionar estas transiciones en nuestras aplicaciones. Así que va mucho más allá de los simples estados de carga, si quieres pensar en ello de esa manera.

Entonces, en términos de Apollo Client, estamos aquí para hablar de suspense, y estamos hablando de suspense en Apollo Client. Vamos a hablar de esto en el contexto de un hook que lanzamos en Apollo Client 3.8, llamado UseSuspenseQuery. ¿Qué es UseSuspenseQuery? Esencialmente es una versión suspenseful de nuestro hook UseQuery que obtiene algunos data que está integrado con todas las características de suspense de React 18, que incluye las transiciones de React 18. Así que durante la mayor parte del resto de la charla, en realidad vamos a estar mirando esto en el contexto del clon de Spotify que construimos aquí. Y hay un par de áreas en la pantalla a las que queremos que prestes atención mientras avanzamos a través de algunas de estas demostraciones aquí. ¿Ves todos estos cuadros de colores en la pantalla? Cada uno de estos representa un área de nuestra interfaz de usuario que tiene un hook UseQuery que está cargando algunos data del servidor. Esto es realmente para tener una idea de cómo funciona el status quo hoy, y cómo podemos hacer esto mejor con el hook UseSuspenseQuery y simplemente el suspense de React 18. Para tener una idea de cómo se ve la UX de carga hoy, vamos a echar un vistazo a esto aquí. Sí, así que aquí vemos cada uno de esos cuatro componentes cuando nuestra aplicación se carga por primera vez. De nuevo, están usando UseQuery bajo el capó, y podemos ver el efecto popcorn mientras la UI se carga.

4. Transición a UseSuspenseQuery

Short description:

Cada componente renderiza su propio fallback de carga y los datos tan pronto como la solicitud de red los devuelve. Estamos haciendo la transición de UseQuery a UseSuspenseQuery. Comenzamos con el componente del menú de usuario. Eliminamos el Booleano de carga y el estado de carga ya que Suspense se encarga de ello. El tipo de consulta se convierte en el tipo de consulta del menú de usuario en la aplicación habilitada para Suspense. Vemos una pantalla en blanco brevemente antes de que se cargue el UserMenu. Necesitaremos un SuspenseBoundary para un fallback de carga.

Cada componente es responsable de renderizar su propio fallback de carga, y va a renderizar data tan pronto como su solicitud de red devuelva esos data. No tenemos más control sobre ello que eso, simplemente estamos dejando que estos componentes se rendericen cuando los data estén listos.

Es un poco visualmente distractorio, tener esas cuatro áreas cargadas completamente dependiendo de cuándo se resuelve esa solicitud de red. Así que en realidad vamos a escribir algo de código juntos. Vamos a hacer la transición de esta aplicación habilitada para UseQuery a una aplicación habilitada para UseSuspenseQuery.

Así que vamos a abrir esta demostración aquí, y de nuevo, como dije, con esto es con lo que vamos a trabajar hoy. Sólo para refrescar, esta es exactamente la misma experiencia que viste en ese video hace un segundo. Ese efecto de palomitas de maíz que ves cuando se cargan los data. Y sólo para orientarnos un poco con esta aplicación aquí, aquí tengo mi diseño aquí. Puedes ver esas cajas de colores, cada uno de esos componentes allí, la barra lateral, el menú de usuario, la ruta, y la barra de reproducción, que cada uno representa una de esas áreas que carga algunos data.

Así que vamos a empezar y en realidad convertir uno de estos componentes a UseSuspenseQuery. Vamos a empezar con el menú de usuario allí, que es esa caja verde en la parte superior derecha. Así que para hacerlo, aquí está mi componente, UseQuery. Ves que tengo mi consulta GraphQL, mi importación de UseQuery, y un sitio bastante familiar aquí, ese data y los Booleanos de carga. Cuando ese Booleano de carga es verdadero, devolvemos nuestro estado de carga, y eso es lo que vemos.

Así que para convertir esto a Suspense, voy a empezar importando UseSuspenseQuery, reemplazar el uso aquí, y algo que vas a notar de inmediato cuando hagamos este cambio es que obtenemos este error aquí, la propiedad de carga no existe en el tipo UseSuspenseQueryResult. Y eso es porque con la mecánica de Suspense, en realidad no necesitamos ese Booleano de carga porque vamos a dejar que Suspense se encargue de esto por nosotros. Así que no tiene sentido, en realidad podemos eliminar eso. Y debido a eso, ya no necesitamos nuestro estado de carga. Algo a lo que también debes prestar atención aquí, con esto, si fuera a echar un vistazo al tipo de esa propiedad data, si estás acostumbrado a usar esto con UseQuery, estás acostumbrado a ver una unión con indefinido aquí también. Con la aplicación habilitada para Suspense, en realidad funciona como si esto fuera un código sincrónico. Ves que nuestro tipo de consulta aquí es ese tipo de consulta de UserMenu, lo cual es realmente genial, permite algunas cosas bonitas sobre esto. Para esta demostración, queremos hacer un cambio. Nos gusta dar pequeños pasos y ver qué hace ese cambio en nuestra aplicación. Así que volvamos a nuestra aplicación aquí y refresquémosla para ver qué hizo ese cambio.

Bueno, ahora estamos viendo una pantalla en blanco por una fracción de segundo, y en la primera pintura vemos que el UserMenu fue cargado allí. Fue bastante rápido, así que tal vez podamos refrescar de nuevo, Gerald. Así que no verás el resaltado verde alrededor del UserMenu en la parte superior derecha porque para el momento en que nuestra aplicación se renderiza por primera vez, los data están presentes para ese UserMenu. Así que estamos obteniendo los data para nuestro UserMenu con nuestro hook habilitado para Suspense, pero no estamos mostrando un fallback de carga todavía. Para eso, vamos a necesitar un SuspenseBoundary.

5. Añadiendo Suspense a los Componentes

Short description:

Vamos a añadir suspense a nuestros componentes uno por uno. Comenzamos con el componente UserMenu, envolviéndolo con el componente Suspense y utilizando el estado de carga de UserMenu como fallback. Después de refrescar, vemos el resaltado verde alrededor del UserMenu en su estado de carga. Ahora vamos a añadir límites de suspense y usar la consulta de suspense en los componentes de la barra lateral y de la barra de reproducción. Reemplazamos las importaciones con useSuspenseQuery, eliminamos el booleano de carga y el estado, y hacemos los cambios necesarios en el diseño.

Así que vamos a añadir eso, Gerald. Vamos a hacerlo. Así que voy a venir aquí a mi diseño, y para añadir suspense, voy a importar el componente Suspense de React. Y luego simplemente vamos a envolver esto, nuestro UserMenu, aquí con eso. Si puedo dar en la pantalla correcta, este es el problema de ser tan alto en esto aquí. Y esto va a tomar un solo prop, que es el componente que queremos mostrar cuando el componente está suspendido. Así que aquí, simplemente voy a usar ese estado de carga de UserMenu aquí. Y de nuevo, pasos de bebé. Vamos a refrescar y ver qué hizo este cambio aquí.

Genial. Así que ahora vemos el resaltado verde alrededor del UserMenu mientras está en su estado de carga. Pero por lo demás, todo lo demás no ha cambiado. Quiero decir, toda la UX sigue siendo totalmente inalterada, ¿verdad? Así que vamos a añadir límites de suspense y usar la consulta de suspense en nuestros otros tres componentes antes de que podamos hacer un poco más de progreso aquí. Genial. Así que simplemente voy a empezar. Vamos a la barra lateral aquí. Lo mismo que hicimos con el UserMenu. Voy a reemplazar mi importación con useSuspenseQuery. Ya no necesitamos ese booleano de carga, lo que significa que puedo deshacerme de ese estado de carga en mi componente. Haremos lo mismo con la barra de reproducción aquí. useSuspenseQuery. Vamos a reemplazar el uso, deshacerse del booleano de carga. Y espero que estén empezando a ver un poco de un patrón aquí. Una de las cosas que queríamos asegurarnos de hacer con la consulta de suspense es hacer que se sienta muy familiar a useQuery en que tiene muchas de las mismas opciones y tipo de sensación que tiene. Obviamente, la ergonomía de cómo manejas ese estado de carga es un poco diferente. Pero esperamos que en la mayoría de los casos, cambiar a suspense sea más o menos tan fácil como esto es. Así que vamos a conseguir nuestro último aquí. useSuspenseQuery. Deshacerse del booleano de carga. Y luego en nuestro diseño, vamos a añadir nuestros fallbacks de suspense alrededor de cada uno de estos.

6. Optimizando la Experiencia de Carga

Short description:

Voy a copiar esto varias veces. Y luego asegurémonos de que cada uno de estos use los estados de carga correctos aquí. Este es el play bar. Gracias a Dios por prettier, de lo contrario mi código se vería horrendo. Suspense no es una varita mágica que podemos agitar en nuestro código y mejorar la UX. Pero ahora que todos nuestros componentes están usando suspense para mostrar esas alternativas, tenemos un superpoder aquí porque podemos reorganizar estos límites de suspense. Hagamos el primer cambio real sustantivo aquí a la experiencia de carga envolviendo toda nuestra aplicación en un solo límite de suspense en lugar de esos cuatro límites granulares para cada componente. Así que tenemos una sola actualización en la pantalla ahora, solo por el hecho de poder mover ese límite de suspense al nivel más externo de nuestra aplicación. Pero ahora digamos que estamos empezando a interactuar con nuestro clon de Spotify aquí. Queremos escuchar una lista de reproducción diferente. Vemos algo interesante, que es que veo que esa alternativa de suspense aparece cuando navego a otra ruta aquí. Hemos ido un poco demasiado al extremo en una dirección de tener un solo límite de suspense para toda nuestra aplicación. Al hacer la transición de la ruta, esa transición y esas solicitudes de red para buscar una nueva lista de reproducción están activando esa única alternativa de suspense para toda nuestra aplicación. Obviamente, esa no es la experiencia de usuario que queremos aquí.

Voy a copiar esto varias veces. Y luego asegurémonos de que cada uno de estos use los estados de carga correctos aquí. Este es el play bar. Gracias a Dios por prettier, de lo contrario mi código se vería horrendo.

Bueno, de nuevo, pasos de bebé. Vamos a refrescar esto y ver qué pasa. Y es un poco anticlimático porque aún nada ha cambiado, ¿verdad? Suspense no es una varita mágica que podemos agitar en nuestro código y mejorar la UX. Todo lo que hemos hecho es cambiar el mecanismo que estamos usando para renderizar, para mostrar esa alternativa de carga, para ser suspense en lugar de que nuestros componentes sean responsables de renderizar esas alternativas de carga.

Pero ahora que todos nuestros componentes están usando suspense para mostrar esas alternativas, tenemos un superpoder aquí porque podemos reorganizar estos límites de suspense. Y entonces hagamos el primer cambio real sustantivo aquí a la experiencia de carga envolviendo toda nuestra aplicación en un solo límite de suspense en lugar de esos cuatro límites granulares para cada componente. Genial. Entonces, como antes, voy a agregar un límite de suspense aquí. Esta vez va a ser alrededor de toda mi aplicación. Asegurémonos de usar el estado de carga correcto aquí. Voy a eliminar todos esos límites de suspense que agregamos antes. Así que ahora aquí tenemos un solo límite de suspense alrededor de todo. Veamos qué hace este cambio a nuestra aplicación aquí. Ah, tada. Así que tenemos una sola actualización en la pantalla ahora, solo por el hecho de poder mover ese límite de suspense al nivel más externo de nuestra aplicación. Y debo decir, eso es mucho más agradable a la vista, tener una sola pintura en la pantalla con todos nuestros data listos para que el usuario interactúe con ellos.

Pero ahora digamos que estamos, ya sabes, empezando a interactuar con nuestro clon de Spotify aquí. Queremos escuchar una lista de reproducción diferente. Gerald, ¿por qué no vamos y navegamos por ahí y elegimos algo más para escuchar? Sí, eso está genial. Así que mi hija estaría emocionada si todos escucháramos su lista de reproducción juntos. Así que voy a navegar aquí y vemos algo interesante, que es que veo esa alternativa de suspense aparecer cuando navego a otra ruta aquí. Entonces, ¿qué podría estar pasando aquí, Alessia? Sí. Así que hemos ido un poco demasiado al extremo en una dirección de tener un solo límite de suspense para nuestra aplicación completa. Así que al hacer la transición de la ruta, ya sabes, esa transición y esas solicitudes de red para buscar una nueva lista de reproducción están activando esa única alternativa de suspense para toda nuestra aplicación. Y, ya sabes, obviamente esa no es la user experience que queremos aquí.

7. Añadiendo un Segundo Componente Suspense

Short description:

Añadimos un segundo componente suspense alrededor de nuestra ruta para mantener el diseño persistente mientras el componente de ruta interna se suspende. Cuando refrescamos y navegamos de nuevo a nuestra lista de reproducción avanzada de React, la carcasa exterior de nuestra aplicación se desactiva primero, seguida de un ligero retraso mientras se busca el componente de ruta. Si el límite de suspense interno está listo para renderizar antes que el límite de suspense externo, React coordina los tiempos. Usamos la directiva at synthetics en nuestras consultas para entender los tiempos. Al eliminar la directiva synthetics y refrescar la página, se muestran los efectos de una carga de ruta de lista de reproducción más rápida.

Queremos mantener ese Chrome de la aplicación, ese tipo de diseño persistente en la pantalla mientras nuestro usuario navega y el componente de ruta interna se suspende. Así que vamos a añadir un segundo componente suspense alrededor de nuestra ruta. Genial. Así que voy a entrar aquí alrededor de la ruta, que es ese componente que se suspende mientras navegamos alrededor. Asegurémonos de que estamos usando el componente correcto aquí, estado de carga de la ruta. Vamos a refrescar y luego vamos a navegar de nuevo a nuestra lista de reproducción avanzada de react aquí. Y ahora podemos ver que hemos vuelto a la user experience que estábamos buscando. Bien. Sí. Esto se ve genial. Y así vemos que, ya sabes, ahora cuando cargamos en nuestra la carcasa exterior de nuestra aplicación se desactiva primero, y luego hay otro ligero retraso mientras seguimos buscando el componente de ruta, que luego se desactiva con sus data cuando está listo para renderizar. Pero, Gerald, ¿qué pasa si el límite de suspense interno, ese componente de ruta tiene sus data y está listo para renderizar antes que ese límite de suspense externo? Sí, esa es una gran pregunta. Inviértelo. Sí. Sí. Así que para controlar estos tiempos que podemos ver, sólo voy a señalar que algo que notarán en nuestras consultas aquí, estamos usando esta directiva at synthetics aquí sólo para entender mejor cómo funcionan cada uno de estos tiempos. Así que de nuevo, queremos ver qué pasa si esa ruta de la lista de reproducción se carga mucho más rápido que nuestra carcasa exterior. Así que voy a eliminar esta directiva synthetics y vamos a refrescar y ver qué pasa aquí.

8. Optimizando la Experiencia de Carga con la Directiva Defer

Short description:

Si nuestro componente de ruta interna está listo para renderizar antes que la carcasa exterior, React puede coordinar eso para nosotros. En el peor de los casos, tendremos dos actualizaciones en la pantalla, pero en el mejor de los casos, tendremos una única actualización. Podemos mejorar la experiencia de carga utilizando la directiva defer en GraphQL. Esto nos permite cargar algunos datos más rápido y transmitir partes más lentas más tarde. Cuando nuestro componente de ruta es más lento, todavía vemos dos actualizaciones en la pantalla.

De acuerdo. Entonces, si nuestro componente de ruta interna está listo para renderizar antes que la carcasa exterior, ahora, gracias al uso de suspense, React puede coordinar eso para nosotros y orquestarlo. Así que nunca veremos el límite de suspense interno antes que el externo, pero eso significa que, ya sabes, ahora en el peor de los casos, si nuestra ruta interna está lista un poco más tarde que nuestra aplicación shell, tendremos dos actualizaciones en la pantalla. Pero por otro lado, en el mejor de los casos, cuando está listo, ya sabes, alrededor del mismo tiempo o antes, tendremos una única actualización muy agradable en la pantalla en el mejor de los casos escenario. Y todo eso es simplemente gracias al poder de suspense y al uso de estas herramientas que React nos da, lo cual es realmente agradable.

Así que ahora veamos si cargamos algunas pistas más aquí. Sí, en realidad, primero voy a ir a cada uno de estos componentes, porque probablemente viste directivas sintéticas alrededor de cada uno de esos, y queremos tener una mejor idea de cómo se verá la verdadera experiencia del usuario final aquí. Así que simplemente voy a ir a cada una de estas consultas. Voy a eliminar esto aquí. Vamos a la barra de reproducción. Lo mismo, simplemente deshazte de esta directiva sintética. Ya no la queremos. Y ahora vemos que el estado de carga es mucho más como cabría esperar. Sin embargo, hay algo que señalar aquí, y es que si refresco esto, esa lista de reproducción que vemos aquí en realidad todavía tarda un poco demasiado para nuestro gusto en cargar esto aquí. Y queremos mejorar esta experiencia. Ahora hemos hecho algunas cosas con suspense, pero también queremos hacer algunas cosas con GraphQL porque GraphQL también nos da algunas herramientas geniales aquí. No sé cuántos de ustedes han visto alguno de los avances de la especificación últimamente, pero hay una nueva directiva de etapa dos que está casi lista para el uso generalizado llamada defer que nos permite marcar parte de nuestra consulta como algo que puede ser transmitido en un momento posterior. Así que nos da la capacidad de decir, Oye, entendemos que puede haber una parte lenta de nuestra consulta aquí, pero queremos obtener algunos datos más rápido. Y luego cargaremos algunas de esas cosas lentas más tarde. Así que fingimos que hemos hecho algunas investigaciones y vemos que nuestro campo de pistas aquí es lo que realmente está tardando más en cargar aquí y lo que nos gustaría ver, estamos bien si esas pistas se cargan un poco más tarde, pero nos gustaría ver esos detalles de la lista de reproducción un poco más rápido aquí así que podemos usar defer. Voy a usar un fragmento en línea aquí y vamos a refrescar eso y ver qué qué nos da defer aquí. Bueno, agradable. Así que ahora vimos dos actualizaciones en la pantalla. Vimos que nuestro componente de ruta se renderizó al mismo tiempo que nuestra carcasa de aplicación y esas pistas diferidas se cargaron en esa segunda renderización en la pantalla, pero Gerald, ¿qué pasa ahora si nuestro componente de ruta es un poco más lento?

Sí, esa es una gran pregunta. Así que volvamos y agreguemos nuestra confiable directiva sintética aquí, si puedo escribir correctamente timeout. Añadamos un segundo de latencia a esto y refresquemos y veamos qué pasa aquí. Probemos eso de nuevo. Hay que amar el WiFi de la conferencia, ¿verdad? O tal vez ni siquiera lo guardé. Bueno, lo que todavía estamos viendo son dos actualizaciones en la pantalla. El WiFi de la conferencia, te lo digo.

9. Optimizando la Experiencia de Carga con Transiciones

Short description:

Agregar capas adicionales de límites de suspense y fallbacks de carga te brinda un control más granular sobre las transiciones de estado de UX de carga. Integramos los hooks de suspense con las transiciones de React 18 para mejorar la experiencia de carga. Al usar transiciones y eliminar directivas sintéticas, podemos evitar los fallbacks de suspense y mantener la interfaz de usuario existente en la pantalla. Hoy, aprendimos cómo migrar los hooks de obtención de datos para usar la consulta de suspense, optimizar la experiencia de carga moviendo los límites de suspense, usar defer para agregar fallbacks adicionales y marcar las solicitudes de red como transiciones en React.

Veamos aquí. Vale, todavía estamos viendo esas dos actualizaciones en la pantalla. Pero si nuestro tiempo de espera en el componente de ruta en nuestra consulta de lista de reproducción estaba funcionando, lo que íbamos a mostrar en este momento era el cambio en UX de ir a dos actualizaciones a la pantalla en el peor de los casos a tres actualizaciones en la pantalla en el peor de los casos puedes imaginar que nuestra carcasa de aplicación se carga primero, luego tendríamos el componente de ruta que se desbloquearía en una segunda renderización en la pantalla, y luego las pistas que están envueltas en defer serían esa tercera actualización en la pantalla. Así que la principal conclusión aquí es realmente solo esta idea de que agregar capas adicionales de suspense límites y fallbacks de carga te brinda un control más granular sobre estas transiciones de estado de UX de carga en general en tu aplicación. Pero hay un compromiso aquí. Podemos mostrar algo de contenido antes a los usuarios en el mejor de los casos, pero en el peor de los casos vamos a agregar momentos adicionales en nuestra aplicación donde estamos mostrando fallbacks de carga en el peor de los casos.

Así que una última cosa, mencionamos al principio que integramos los hooks de suspense con las transiciones de React 18. Vamos a echar un vistazo a eso aquí. Aquí tengo mi lista de reproducción. Voy a desplazarme hacia abajo porque quiero escuchar más pistas en la parte inferior. Vemos algo interesante aquí, que es que a medida que me desplazo y voy a cargar más pistas, vemos que se suspende de nuevo y obtengo un fallback de carga aquí. ¿Cómo podríamos buscar mejorar esto? Algo a destacar aquí es en mi lista de reproducción, para aquellos de ustedes que han usado Apollo durante cualquier cantidad de tiempo, han utilizado la API fetch more para cargar datos en una consulta paginada. En este caso estamos haciendo un escenario de desplazamiento infinito. Tenemos un fetch more exportado desde use suspense query que estamos llamando en esta función handle load more. Cuando llamamos a fetch more, está causando que nuestro componente se suspenda de nuevo porque estamos volviendo a ese estado de carga. Vamos a hacer esto un poco mejor trayendo una transición que nos permite ver lo que tenemos en pantalla y evitar ese fallback de suspense. Antes de hacerlo, también vamos a eliminar las directivas sintéticas ya que no queremos esperar dos segundos para cargar más pistas. Para agregar una transición, solo voy a importar la API start transition de React y vamos a envolver mi llamada fetch more en start transition. Esto le dirá a React que marque esto como una transición. Cuando este componente se suspenda, va a dejar lo que vemos en pantalla y evitar ver ese fallback. Vamos a refrescar. Nos desplazaremos hacia abajo aquí y ahora obtenemos la UX que esperábamos. Mucho mejor. Entonces, ¿qué aprendimos hoy? Miramos nuestro clon de Spotify comenzando con use query debajo del capó y luego migrando nuestros hooks de obtención de datos para usar nuestro nuevo hook habilitado para suspense use suspense query. Luego vimos cómo mover los límites de suspense en nuestra aplicación podría cambiar, impactar drásticamente la experiencia de carga. Y luego vimos cómo usar defer para agregar fallbacks adicionales y, ya sabes, despriorizar algunos de los campos en nuestra consulta. Luego vimos cómo marcar una de nuestras solicitudes de red provenientes de nuestra llamada fetch more aquí como una transición en React para decirle a React que mantenga la interfaz de usuario existente en la pantalla mientras hacemos esa solicitud de red en segundo plano. Así que esa es nuestra demostración para hoy. Sí, gracias. Gracias.

10. Conclusión y Planes Futuros

Short description:

No llegamos a hablar de toda la historia de suspense. Lanzamos otros dos hooks en Apollo client 3.8, use background query y use read query. En el futuro, estamos trabajando en Apollo client 3.9 con nuevas APIs como suspenseful use fragment y lazy use background query. El código de esta aplicación está disponible en el repositorio de Spotify showcase. Gracias por tenernos.

Genial. Entonces, brevemente, nos hemos quedado sin tiempo pero desafortunadamente no llegamos a hablar de toda la historia de suspense. También lanzamos otros dos hooks en Apollo client 3.8, use background query y use read query para ayudar a evitar cascadas de solicitudes. Así que si estás interesado en ellos, consulta nuestra documentation o ven a hablar con nosotros después de nuestra masterclass aquí. Sí, y mirando hacia el futuro, actualmente estamos trabajando en la próxima versión menor de Apollo client 3.9, en la que hemos planeado algunas nuevas APIs emocionantes, como una versión de suspense del hook use fragment, y también una versión lazy de use background query que estamos llamando use interactive query para precargar, prebuscar data en alguna interacción del usuario. Si te gustó la demostración que viste aquí hoy y quieres jugar con ella tú mismo, no dudes en ir a este repositorio, la organización Apollo GraphQL, el Spotify showcase, el código de esta aplicación completa vive allí. Y estamos planeando usar esto como una herramienta de enseñanza y una forma de mostrar algunas de las mejores prácticas de Apollo client, pero también como mantenedores, vamos a usarlo para poner a prueba nuestras propias APIs para realmente tener una idea de cómo es usarlo en una aplicación compleja. Pero con eso, muchas gracias por tenernos aquí. Sí, gracias.

QnA

Pruebas de Suspense y Límite de Suspense Único

Short description:

Para probar suspense en un componente, se pueden utilizar herramientas de prueba de React populares como testing library. La filosofía es probar la aplicación como los usuarios esperarían, por lo que el estado de carga permanece igual. El uso de un límite de suspense único en el nivel superior puede afectar negativamente el rendimiento percibido, pero se pueden agregar límites adicionales. No es necesario que cada componente tenga un estado de carga, y el patrón de estado de carga del menú del usuario es un azúcar sintáctico para no suspense.

Entonces, comencemos con el primero justo en el medio aquí. Vale. Entonces, el primero, ¿cómo procederías para testing suspense? Buena pregunta. Supongo que depende de, supongo que esta persona está hablando de, ¿cómo procederías para testing un componente que está usando suspense para renderizar su fallback? Y la respuesta es realmente usando las herramientas de testing que son súper populares y ubicuas en la React community, como testing library.

Sí, para mantener mi respuesta corta, ¿algo que agregar? Sí, solo agregaré allí, así que una de las filosofías de testing library es usar la aplicación como tus usuarios esperarían. Entonces, presumiblemente ya estás testing algún tipo de estado de carga en tu aplicación. ¿Sabes, mi componente renderiza cualquier spinner o texto de carga o lo que sea que tengas? Va a ser lo mismo. Es solo que tu código en ese componente se organizará un poco diferente. Pero si lo estás usando como una especie de caja negra, como la experiencia final del usuario, realmente no hay mucho que cambiar. Gracias.

Y esta puede ser nuestra última pregunta, pero de nuevo, podrás hablar con ellos alrededor de la esquina. Entonces, última pregunta, ¿cómo afecta el uso de un único límite de suspense en el nivel superior a cosas como SCP y LCP? ¿Y puede ser respondida en dos minutos? Sí, buena pregunta. Entonces, la respuesta corta es que probablemente no quieras solo un límite de suspense en tu aplicación. Sabes, tal vez hay un cierto tipo de aplicación que, sabes, donde realmente quieres esperar a que todas las solicitudes de red iniciales se resuelvan antes de mostrar algo a el usuario. el beneficio de poder usar esa API componible super Reacty que te permite simplemente componer estas cosas muy bien. Entonces, nuevamente, probablemente si tuvieras muchas solicitudes de red ocurriendo en tu aplicación y solo un límite de suspense, sí, eso definitivamente podría afectar negativamente tu percepción de performance en UX de carga, pero por eso es súper simple agregar límites adicionales. Sí. Creo que podemos meter una más. ¿Qué te parece? Hagámoslo. ¿Por qué no? Hagámoslo. Vale. Entonces, usaste un patrón de estado de carga del menú del usuario. ¿Cada componente tiene un estado de carga? ¿Cómo escala esto? Esto parece un azúcar sintáctico para no suspense. Sí, así es como realmente elegí estructurar esto para esta demostración porque es lo más fácil de recordar. No tuve que lidiar con las importaciones porque obviamente lleva tiempo escribir frente a todos ustedes. Entonces, realmente, diría que depende de ti, cualquier patrón que tengas hoy, nuevamente, el cambio más grande que tuvimos es que tomamos ese estado de carga que se renderizaba en nuestro componente y lo movimos a un límite de suspense. Pero no sé si notaste que cada uno de esos componentes que se renderizaban con el use query, si loading usaba ese mismo componente de estado de carga del menú del usuario dentro de allí. Así que realmente no cambié qué componente estaba usando. Solo lo moví al límite de suspense en lugar de renderizarlo en el componente. Pero de nuevo, eso es solo un patrón que elegí específicamente para esta masterclass.

Personalizando Estados de Carga

Short description:

Depende de ti. Sin embargo, eso funciona en tu aplicación. En esta aplicación, tenemos diferentes estados de carga, pero en tu caso, puede ser solo un componente. Depende. Gracias por tu charla.

Depende de ti. Sin embargo, eso funciona en tu aplicación. De nuevo, en esta aplicación en particular también, tenemos tantos estados de carga diferentes porque son pantallas de esqueleto, pero si tienes un solo spinner que usas en tu aplicación, puede ser solo un componente. Así que sí, de nuevo, es con el clásico, depende.

Wow. Son las 11.10 en punto. Muy bien. Muchas gracias. Y también somos el cronometrador. Así que muchas gracias por tu charla. ¿Podemos tener otra ronda de aplausos, por favor?

Check out more articles and videos

We constantly think of articles and videos that might spark Git people interest / skill us up or help building a stellar career

Una Guía del Comportamiento de Renderizado de React
React Advanced 2022React Advanced 2022
25 min
Una Guía del Comportamiento de Renderizado de React
Top Content
This transcription provides a brief guide to React rendering behavior. It explains the process of rendering, comparing new and old elements, and the importance of pure rendering without side effects. It also covers topics such as batching and double rendering, optimizing rendering and using context and Redux in React. Overall, it offers valuable insights for developers looking to understand and optimize React rendering.
Construyendo Mejores Sitios Web con Remix
React Summit Remote Edition 2021React Summit Remote Edition 2021
33 min
Construyendo Mejores Sitios Web con Remix
Top Content
Remix is a web framework built on React Router that focuses on web fundamentals, accessibility, performance, and flexibility. It delivers real HTML and SEO benefits, and allows for automatic updating of meta tags and styles. It provides features like login functionality, session management, and error handling. Remix is a server-rendered framework that can enhance sites with JavaScript but doesn't require it for basic functionality. It aims to create quality HTML-driven documents and is flexible for use with different web technologies and stacks.
Compilador React Forget - Entendiendo React Idiomático
React Advanced 2023React Advanced 2023
33 min
Compilador React Forget - Entendiendo React Idiomático
Top Content
Joe Savona
Mofei Zhang
2 authors
The Talk discusses React Forget, a compiler built at Meta that aims to optimize client-side React development. It explores the use of memoization to improve performance and the vision of Forget to automatically determine dependencies at build time. Forget is named with an F-word pun and has the potential to optimize server builds and enable dead code elimination. The team plans to make Forget open-source and is focused on ensuring its quality before release.
Uso efectivo de useEffect
React Advanced 2022React Advanced 2022
30 min
Uso efectivo de useEffect
Top Content
Today's Talk explores the use of the useEffect hook in React development, covering topics such as fetching data, handling race conditions and cleanup, and optimizing performance. It also discusses the correct use of useEffect in React 18, the distinction between Activity Effects and Action Effects, and the potential misuse of useEffect. The Talk highlights the benefits of using useQuery or SWR for data fetching, the problems with using useEffect for initializing global singletons, and the use of state machines for handling effects. The speaker also recommends exploring the beta React docs and using tools like the stately.ai editor for visualizing state machines.
Enrutamiento en React 18 y más allá
React Summit 2022React Summit 2022
20 min
Enrutamiento en React 18 y más allá
Top Content
Routing in React 18 brings a native app-like user experience and allows applications to transition between different environments. React Router and Next.js have different approaches to routing, with React Router using component-based routing and Next.js using file system-based routing. React server components provide the primitives to address the disadvantages of multipage applications while maintaining the same user experience. Improving navigation and routing in React involves including loading UI, pre-rendering parts of the screen, and using server components for more performant experiences. Next.js and Remix are moving towards a converging solution by combining component-based routing with file system routing.
Concurrencia en React, Explicada
React Summit 2023React Summit 2023
23 min
Concurrencia en React, Explicada
Top Content
React 18's concurrent rendering, specifically the useTransition hook, optimizes app performance by allowing non-urgent updates to be processed without freezing the UI. However, there are drawbacks such as longer processing time for non-urgent updates and increased CPU usage. The useTransition hook works similarly to throttling or bouncing, making it useful for addressing performance issues caused by multiple small components. Libraries like React Query may require the use of alternative APIs to handle urgent and non-urgent updates effectively.

Workshops on related topic

Masterclass de Depuración de Rendimiento de React
React Summit 2023React Summit 2023
170 min
Masterclass de Depuración de Rendimiento de React
Top Content
Featured Workshop
Ivan Akulov
Ivan Akulov
Los primeros intentos de Ivan en la depuración de rendimiento fueron caóticos. Vería una interacción lenta, intentaría una optimización aleatoria, vería que no ayudaba, y seguiría intentando otras optimizaciones hasta que encontraba la correcta (o se rendía).
En aquel entonces, Ivan no sabía cómo usar bien las herramientas de rendimiento. Haría una grabación en Chrome DevTools o React Profiler, la examinaría, intentaría hacer clic en cosas aleatorias, y luego la cerraría frustrado unos minutos después. Ahora, Ivan sabe exactamente dónde y qué buscar. Y en esta masterclass, Ivan te enseñará eso también.
Así es como va a funcionar. Tomaremos una aplicación lenta → la depuraremos (usando herramientas como Chrome DevTools, React Profiler, y why-did-you-render) → identificaremos el cuello de botella → y luego repetiremos, varias veces más. No hablaremos de las soluciones (en el 90% de los casos, es simplemente el viejo y regular useMemo() o memo()). Pero hablaremos de todo lo que viene antes - y aprenderemos a analizar cualquier problema de rendimiento de React, paso a paso.
(Nota: Esta masterclass es más adecuada para ingenieros que ya están familiarizados con cómo funcionan useMemo() y memo() - pero quieren mejorar en el uso de las herramientas de rendimiento alrededor de React. Además, estaremos cubriendo el rendimiento de la interacción, no la velocidad de carga, por lo que no escucharás una palabra sobre Lighthouse 🤐)
Next.js para Desarrolladores de React.js
React Day Berlin 2023React Day Berlin 2023
157 min
Next.js para Desarrolladores de React.js
Top Content
Featured WorkshopFree
Adrian Hajdin
Adrian Hajdin
En esta avanzada masterclass de Next.js, profundizaremos en conceptos clave y técnicas que permiten a los desarrolladores de React.js aprovechar al máximo Next.js. Exploraremos temas avanzados y prácticas prácticas, equipándote con las habilidades necesarias para construir aplicaciones web de alto rendimiento y tomar decisiones arquitectónicas informadas.
Al final de esta masterclass, serás capaz de:1. Comprender los beneficios de los Componentes del Servidor React y su papel en la construcción de aplicaciones React interactivas, renderizadas por el servidor.2. Diferenciar entre el tiempo de ejecución de Edge y Node.js en Next.js y saber cuándo usar cada uno en función de los requisitos de tu proyecto.3. Explorar técnicas avanzadas de Renderizado del Lado del Servidor (SSR), incluyendo streaming, fetching paralelo vs. secuencial, y sincronización de datos.4. Implementar estrategias de caché para mejorar el rendimiento y reducir la carga del servidor en las aplicaciones Next.js.5. Utilizar Acciones React para manejar la mutación compleja del servidor.6. Optimizar tus aplicaciones Next.js para SEO, compartir en redes sociales, y rendimiento general para mejorar la descubrabilidad y la participación del usuario.
Aventuras de Renderizado Concurrente en React 18
React Advanced 2021React Advanced 2021
132 min
Aventuras de Renderizado Concurrente en React 18
Top Content
Featured Workshop
Maurice de Beijer
Maurice de Beijer
Con el lanzamiento de React 18 finalmente obtenemos el tan esperado renderizado concurrente. Pero, ¿cómo va a afectar eso a tu aplicación? ¿Cuáles son los beneficios del renderizado concurrente en React? ¿Qué necesitas hacer para cambiar al renderizado concurrente cuando actualices a React 18? ¿Y qué pasa si no quieres o no puedes usar el renderizado concurrente todavía?

¡Hay algunos cambios de comportamiento de los que debes estar al tanto! En esta masterclass cubriremos todos esos temas y más.

Acompáñame con tu portátil en esta masterclass interactiva. Verás lo fácil que es cambiar al renderizado concurrente en tu aplicación React. Aprenderás todo sobre el renderizado concurrente, SuspenseList, la API startTransition y más.
Consejos sobre React Hooks que solo los profesionales conocen
React Summit Remote Edition 2021React Summit Remote Edition 2021
177 min
Consejos sobre React Hooks que solo los profesionales conocen
Top Content
Featured Workshop
Maurice de Beijer
Maurice de Beijer
La adición de la API de hooks a React fue un cambio bastante importante. Antes de los hooks, la mayoría de los componentos tenían que ser basados en clases. Ahora, con los hooks, estos son a menudo componentes funcionales mucho más simples. Los hooks pueden ser realmente simples de usar. Casi engañosamente simples. Porque todavía hay muchas formas en las que puedes equivocarte con los hooks. Y a menudo resulta que hay muchas formas en las que puedes mejorar tus componentes con una mejor comprensión de cómo se puede usar cada hook de React.Aprenderás todo sobre los pros y los contras de los diversos hooks. Aprenderás cuándo usar useState() versus useReducer(). Veremos cómo usar useContext() de manera eficiente. Verás cuándo usar useLayoutEffect() y cuándo useEffect() es mejor.
Presentando FlashList: Construyamos juntos una lista performante en React Native
React Advanced 2022React Advanced 2022
81 min
Presentando FlashList: Construyamos juntos una lista performante en React Native
Top Content
Featured Workshop
David Cortés Fulla
Marek Fořt
Talha Naqvi
3 authors
En esta masterclass aprenderás por qué creamos FlashList en Shopify y cómo puedes usarlo en tu código hoy. Te mostraremos cómo tomar una lista que no es performante en FlatList y hacerla performante usando FlashList con mínimo esfuerzo. Usaremos herramientas como Flipper, nuestro propio código de benchmarking, y te enseñaremos cómo la API de FlashList puede cubrir casos de uso más complejos y aún así mantener un rendimiento de primera categoría.Sabrás:- Breve presentación sobre qué es FlashList, por qué lo construimos, etc.- Migrando de FlatList a FlashList- Enseñando cómo escribir una lista performante- Utilizando las herramientas proporcionadas por la biblioteca FlashList (principalmente el hook useBenchmark)- Usando los plugins de Flipper (gráfico de llamas, nuestro perfilador de listas, perfilador de UI & JS FPS, etc.)- Optimizando el rendimiento de FlashList utilizando props más avanzados como `getType`- 5-6 tareas de muestra donde descubriremos y solucionaremos problemas juntos- Preguntas y respuestas con el equipo de Shopify
React, TypeScript y TDD
React Advanced 2021React Advanced 2021
174 min
React, TypeScript y TDD
Top Content
Featured Workshop
Paul Everitt
Paul Everitt
ReactJS es extremadamente popular y, por lo tanto, ampliamente soportado. TypeScript está ganando popularidad y, por lo tanto, cada vez más soportado.

¿Los dos juntos? No tanto. Dado que ambos cambian rápidamente, es difícil encontrar materiales de aprendizaje precisos.

¿React+TypeScript, con los IDEs de JetBrains? Esa combinación de tres partes es el tema de esta serie. Mostraremos un poco sobre mucho. Es decir, los pasos clave para ser productivo, en el IDE, para proyectos de React utilizando TypeScript. En el camino, mostraremos el desarrollo guiado por pruebas y enfatizaremos consejos y trucos en el IDE.