La Búsqueda del Suspense - Dentro de la Magia de React

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

No más cargadores, no más errores - Suspense ha revolucionado la forma en que los desarrolladores manejan operaciones asíncronas.

Pero alguna vez te has preguntado qué magia permite que Suspense funcione? ¿Cómo sabe Suspense que tiene que mostrar un fallback porque va a ocurrir una consulta en un componente inferior?

En esta charla, exploraremos el funcionamiento interno de Suspense para descubrir la magia que potencia uno de los componentes más queridos de React.

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

Charlotte Isambert
Charlotte Isambert
30 min
14 Jun, 2024

Comments

Sign in or register to post your comment.
Video Summary and Transcription
Esta Charla explora el componente suspense en React y sus beneficios en el manejo de datos obtenidos. Se adentra en el proceso de renderizado de los componentes de React y cómo suspense anticipa las solicitudes. El offscreen fiber se presenta como un componente oculto que garantiza la continuidad del estado. La Charla también discute el uso de suspense para manejar consultas concurrentes y lanzar promesas, así como la integración de Redux y los próximos cambios en React 19. En general, la Charla proporciona información sobre el funcionamiento del suspense y sus posibles aplicaciones en el desarrollo de software.

1. Introducción a Suspense

Short description:

Hoy vamos a hablar del componente suspense y por qué nos encanta. Con suspense, podemos usar directamente los datos obtenidos sin preocuparnos por los cargadores o errores. Ahora vamos a adentrarnos en React y entender cómo funciona.

Hola a todos. Soy Charlotte. Soy una líder técnica de React Native en VAM, y estoy muy emocionada de estar aquí con ustedes hoy.

Hoy vamos a hablar de un componente muy especial, suspense. ¿Sabes por qué suspense? ¿Sabes por qué es una herramienta tan poderosa? ¿Sabes por qué nos encanta? Pero ¿sabes cómo funciona suspense? ¿Cómo sabe suspense que se va a realizar una solicitud en mis hijos? Debería mostrar una carta en su lugar.

Hoy vamos a adentrarnos en el componente suspense, y a medida que lo hacemos, vamos a aprender más sobre React también. Así que esta no será una charla sobre concurrencia. Nos vamos a centrar únicamente en este componente. Pero antes de adentrarnos en el cómo de suspense, permítanme recordarles el por qué. ¿Por qué nos encanta tanto suspense?

Antes de suspense, nuestros componentes solían verse así. Obteníamos algunos datos, mostrábamos un cargador mientras se cargaban, un error si era necesario, y finalmente llegábamos a la parte que realmente es la más interesante de nuestros componentes, aquella en la que realmente aportamos valor al usuario. Con suspense, nuestros componentes ahora se ven así. Obtenemos algunos datos y podemos usarlos directamente. Ya no tenemos que preocuparnos por estos casos especiales de cargadores y errores. Se manejan arriba. Encima de nuestros componentes, definimos este límite de suspense que maneja el cargador, y este límite de error que maneja el error. De esta manera, en nuestros componentes, podemos usar directamente nuestros datos. Por eso nos encanta tanto suspense. No más cargadores, no más errores dispersos en todos nuestros componentes. Podemos acceder directamente a los datos.

Ahora vamos a adentrarnos en el cómo. Para el cómo, vamos a tener que adentrarnos en React. Pero antes, permítanme recordarles rápidamente cómo funciona React. React tiene algunos roles fundamentales. Uno de ellos es este. React llama a los componentes y hooks. Esto significa que React decide cuándo quiere renderizar tus componentes. Tú no. Cuando llamamos a nuestros componentes, lo hacemos de esta manera, con esta sintaxis JSX, pero llamar a un componente de esta manera no significa que se ejecutará de inmediato, al menos no de inmediato. Cuando instanciamos un componente de esta manera, con esta sintaxis JSX, JSX en realidad es solo azúcar sintáctica, y es equivalente a la llamada de esta función JSX.

Read also

2. Building the Fiber Tree

Short description:

La función JSX instancia fibras en el árbol virtual de elementos de React. React decide cuándo renderizar y volver a renderizar componentes basándose en este árbol. Disparamos un renderizado al hacer clic en un botón y React actualiza la fibra correspondiente.

Y esta función JSX, cuando se llama, instancia un nodo en el árbol virtual de fibras de nuestros elementos de React, y cada uno de estos nodos se llama fibra. Es un término que es posible que hayas escuchado antes. Cuando construimos nuestra aplicación por primera vez, React crea este árbol virtual con nuestros componentes y sus data, y a partir de este árbol, decide cuándo renderizar y volver a renderizar nuestros componentes.

Construyamos juntos este árbol de fibras. El primer componente que instanciamos con esta sintaxis JSX es la aplicación, por lo que creamos este nodo de la aplicación, esta fibra de la aplicación, pero no ejecutaremos esta función de la aplicación de inmediato. React agregará este puntero de trabajo en progreso a la fibra. El trabajo en progreso es un objetivo que apunta a la fibra en la que se está trabajando actualmente. React funciona de alguna manera como un bucle de juego. Mientras haya trabajo en progreso, mientras haya una fibra en la que trabajar, realizamos algún trabajo en esta fibra. Tal vez renderizarla. Tal vez volver a renderizarla. Luego pasamos a la siguiente. Así que React recorre nuestro árbol de esta manera hasta que llega al final del árbol o hasta que ocurre otro renderizado. Al principio, el trabajo en progreso apunta a la aplicación. Entonces React realizará algún trabajo en la aplicación. Va a renderizar la aplicación. Por lo tanto, ejecuta esta función. Aquí instanciamos los componentes A y B con esta sintaxis JSX, por lo que creamos las fibras A y B. Y hemos terminado con la aplicación, así que podemos pasar al siguiente.

3. Proceso de Renderizado del Árbol

Short description:

React recorre el árbol de arriba a abajo, renderizando componentes basados en cambios de estado y renderizado del padre. Se agrega una bandera de renderizado a la fibra con estado cambiado. La aplicación no se renderiza.

React recorre nuestro árbol de arriba a abajo, por lo que la siguiente fibra es A. React renderiza A, por lo que ejecutamos esta función. Creamos aquí la fibra del párrafo y del botón debido a esta sintaxis JSX, y así sucesivamente y así sucesivamente. Cuando se renderiza B, ejecutamos esta función B y también creamos este párrafo. Y este es nuestro árbol.

¿Qué sucede en el renderizado? ¿Qué sucede si hacemos clic en este botón aquí? Disparamos un cambio de estado. Vamos a renderizar. Entonces React va a agregar esta bandera de renderizado a la fibra que contiene el estado que fue cambiado recientemente. Una fibra es simplemente un objeto donde puedes almacenar algunos valores, por lo que puedes simplemente agregar esta propiedad de renderizado si quieres. Es solo un objeto. Luego, React va a recorrer nuestro árbol nuevamente y renderizar los componentes que desee. Comenzando desde la parte superior de nuestro árbol.

Un componente se renderiza por una de dos razones. Ya sea si contiene un estado que acaba de cambiar, lo que significa que fue marcado con esta bandera de renderizado, cuando llamamos a set state, React marca la fibra que contiene el estado con esta bandera de renderizado, luego cumple con este criterio. O un componente se renderiza si su padre se renderizó. Entonces, aquí la aplicación no pertenece a ninguno de estos casos. Por lo tanto, la aplicación no se renderiza.

4. Comprendiendo Suspense

Short description:

A, párrafo y botón se renderizan debido al renderizado del padre, mientras que B y su párrafo no lo hacen. Suspense maneja la visualización de los hijos o un cargador basado en las solicitudes que ocurren internamente. ¿Cómo anticipa y funciona suspense? Comienza con el primer renderizado, donde se renderizan los hijos y las solicitudes activan la visualización de un cargador. El truco consiste en lanzar promesas para interactuar con suspense sin acceder a su código.

Luego podemos pasar a la siguiente fibra. A se va a renderizar debido a esta bandera de renderizado. Cumple con este criterio. Y también el párrafo y el botón, porque su padre se renderizó. En cuanto a B y este párrafo, no tienen ningún estado que haya cambiado recientemente y su padre no se renderizó, por lo que tampoco se renderizan. Y esto es todo lo que necesitas saber para lo que viene a continuación.

Suspense. El trabajo de suspense es mostrar los hijos o un cargador si hay una solicitud dentro de los hijos. Pero cuando se renderiza suspense, ¿cómo sabe que va a haber una solicitud en los hijos? Debería mostrar el fallback en su lugar. Sabiendo que React renderiza los componentes de arriba a abajo, ¿cómo sabe que una consulta va a ocurrir más abajo en el árbol de antemano? ¿Cómo funciona suspense? Esa es la pregunta a la que intentaremos responder hoy.

Así que comencemos desde el principio. Digamos que es el primer renderizado. Suspense primero intentará renderizar los hijos. Así que agrega esta fibra de hijos y React la ejecutará. Ejecutamos esta función fetch data que simplemente lanza promesas libremente. Lanzamos una solicitud aquí. Entonces nos gustaría informar a suspense, oye, tenemos un cargador aquí. Tenemos una solicitud. Por favor, muestra un cargador. ¿Y cómo podemos, desde esta promesa, desde nuestro propio code, interactuar con suspense? Recuerda esta línea del code de React. Este árbol de fibra con este componente suspense con el que queremos interactuar se define en este nivel. Mientras que nuestro componente con nuestra promesa se ejecuta en algún lugar dentro de esta función de trabajo. Entonces, desde el alcance de mi code, no tengo acceso al code de React. No tengo acceso a suspense, ni quiero como usuario de esta API. No quiero preocuparme por ningún detalle de implementación. ¿Entonces cómo funciona esto? El truco que encontré realmente interesante es este. No solo ejecutamos una promesa. La lanzamos. Lanzamos esta promesa. Y esta función de trabajo que está en algún lugar debajo se encuentra anidada dentro de este try catch.

5. Trabajando con Suspense

Short description:

Cuando se lanza una promesa a suspense, React sube por el árbol para encontrar el límite de suspense más cercano y agrega la bandera didSuspense. Agrega un listener a la promesa y mueve el puntero de trabajo en progreso al límite de suspense. Suspense renderiza el fallback cuando didSuspense es verdadero, y luego vuelve a cambiar la bandera a falso. Cuando la promesa se resuelve, React agrega la bandera de renderizado al límite de suspense y muestra nuevamente los hijos.

Entonces, cuando lanzamos esta promesa a tu suspense, sube hasta que llega a este catch. Y aquí estamos dentro del código de React. Entonces aquí, React puede decidir, puede hablar con suspense y pedirle que muestre un cargador. Entonces, varias cosas van a suceder en este catch. Primero, React va a subir por el árbol para encontrar el límite de suspense más cercano. Y le va a agregar a este la bandera didSuspense en verdadero. Nuevamente, solo una propiedad que se agrega a la fibra. Luego va a agregar un listener a la promesa para que sepa cuándo termina y pueda actuar sobre ella. Y por último, va a mover este puntero de trabajo en progreso hasta el límite de suspense y comenzar el proceso de renderizado desde allí.

Vamos a renderizar suspense aquí. Pero esta vez, con didSuspense en verdadero, sabe que el renderizado anterior se suspendió. Entonces sabe que tiene que mostrar el fallback. Así que va a eliminar esta fibra de hijos y en su lugar agregar este fallback. Antes de continuar, va a cambiar esta bandera didSuspense a falso porque ya manejó la suspensión. Y continuando, mostramos nuestro fallback. Bien. Tenemos nuestro fallback en la pantalla. Pero solo se ha completado la mitad del trabajo aquí porque pronto la consulta se resolverá. Cuando la promesa se completa, React lo sabe gracias al listener que se adjuntó a la promesa. Así que puede actuar sobre ella. Agregará esta bandera de renderizado al límite de suspense y comenzará un nuevo recorrido por el árbol, un nuevo bucle de renderizado que comienza con la aplicación que no se renderiza. Recuerda estos criterios. No mantiene el estado que acaba de cambiar. Su variante no se ha renderizado. Pero suspense sí, debido a esta bandera de renderizado. Suspense se renderiza con didSuspense en falso esta vez. Recuerda que suspense vuelve a cambiar la bandera didSuspense a falso cuando maneja la suspensión cuando muestra el fallback. Así que sabe que tiene que mostrar los hijos nuevamente. Así que vamos a ejecutar nuestra función de hijos y la promesa se resuelve, por lo que podemos ver directamente nuestros datos en la pantalla. Genial.

6. Comprendiendo el Offscreen Fiber

Short description:

Ahora, si ocurre otra consulta, suspense no eliminará por completo la fibra de hijos. La fibra offscreen muestra u oculta la porción del árbol según la propiedad visible. Offscreen evita la pérdida de datos y garantiza la continuidad del estado. Es un componente oculto en desarrollo, utilizado para suavizar transiciones y mejorar el rendimiento de la aplicación. En resumen, suspense muestra los hijos, luego el fallback si ocurre una solicitud. Cuando la consulta se resuelve, suspense vuelve a renderizar los hijos. Finalmente, ¿qué sucede si hay una nueva renderización por encima del fallback?

Ahora que hemos terminado, si ocurre otra consulta, esta vez suspense no eliminará por completo la fibra de hijos de la pantalla. Los hijos están realmente anidados dentro de esta fibra offscreen. El objetivo de offscreen es mostrar la porción del árbol que se encuentra debajo o ocultarla según esta propiedad visible. Si es verdadera, se muestra. Si es falsa, se bloquean los objetivos de trabajo en progreso. Entonces no se avanza y no se pueden ver los componentes ubicados debajo. Esto es muy importante porque si elimináramos por completo la fibra de hijos, perderíamos todos los data que contiene. El objetivo de la fibra no es solo saber qué componentes tenemos en nuestro árbol. También es saber qué tenemos en ellos. Si agregamos, entonces, sí, otra promesa sucede. Oh, lo siento, me confundí en mis diapositivas. Si ocurre otra promesa, suspense cambia la propiedad visible a falso y muestra el fallback. De acuerdo.

Entonces, si ocurre otra consulta, no queremos perder los data de los hijos. Si agregamos este data de conteo a los hijos, este estado se mantendrá dentro de esta fibra. Esto significa que cuando renderizas los hijos, tu estado leerá este valor desde aquí. Entonces, si eliminamos por completo los hijos, cuando tengamos otra promesa, cuando queramos mostrar nuevamente el fallback, perderíamos nuestros conteos y comenzaríamos desde el principio en la siguiente renderización. Este es el objetivo de offscreen. Según lo que he leído, offscreen aún está en desarrollo. Es posible que se utilice en otros casos más adelante, como siempre con el objetivo de suavizar transiciones y hacer que tu aplicación sea más rápida. Pero no es un componente que usarás tú mismo. Es un componente oculto. Entonces, en resumen, así es como funciona suspense.

Para resumir, primero suspense intenta mostrar los hijos. Luego, puede ocurrir una solicitud en los hijos, en cuyo caso suspense muestra el fallback. Y cuando se resuelve la consulta, suspense intenta renderizar los hijos nuevamente. Siguiendo esto, hay algunas cosas que quería discutir. Primero, digamos que actualmente estamos mostrando un fallback. Entonces aquí tenemos en R3 el fallback y la propiedad visible en falso. ¿Qué sucede si tenemos otra renderización por encima en R3? Eso no tiene nada que ver con la promesa resuelta.

7. Trabajando con Suspense: Disparadores y Manejo de Consultas

Short description:

Para probar esto, podemos agregar este estado a la aplicación y desencadenar una nueva recorrida. Suspense muestra el fallback y los hijos se renderizan nuevamente. Las consultas múltiples en un componente ocurren en serie, no en paralelo. Puedes lanzar consultas juntas utilizando useSuspendQuery de react-query. Las consultas en diferentes componentes pueden causar problemas.

Para probar esto, podemos agregar este estado a la aplicación y desencadenar este cambio de estado aquí. Entonces, cuando hacemos clic en este botón, vamos a agregar esta bandera de renderizado a la fibra que contiene el estado que acaba de cambiar y desencadenar una nueva recorrida. La aplicación se renderiza debido a la bandera y también lo hace suspense porque su padre se ha renderizado. Entonces renderizamos suspense con esta bandera did suspense en falso. Recordamos que suspense cambió la bandera did suspense una vez que mostró el fallback. Entonces hemos renderizado este componente con did suspense en falso. Entonces decide mostrar los hijos nuevamente. Así que vamos a pasar por esta función. Nos encontraremos con la promesa nuevamente que lanzamos. Volveremos a suspense que mostrará el fallback nuevamente. Me parece fascinante que React sea tan rápido que ni siquiera nos damos cuenta de que todo esto está sucediendo justo debajo de nuestra atención.

Ahora pasemos a la segunda conclusión. Si tienes varias solicitudes, varias consultas dentro de un componente, estas dos consultas en realidad ocurrirán en serie. No se lanzarán juntas. No se lanzarán en paralelo. Suspense primero mostrará los hijos. Nos encontraremos con esta promesa, la lanzaremos. Nos suspendemos, mostramos otro. Y cuando se resuelva, suspense volverá a renderizar este componente de hijos y solo entonces llegaremos a esta línea. Pero eso es realmente malo para el performance, ¿verdad? De hecho, me sorprendió mucho ver que no vi un impacto tan grande. Intenté tener varias consultas pequeñas y realmente no vi muchas diferencias. Pero esto puede ser un problema. Si tienes muchas consultas grandes, es posible que desees lanzarlas juntas. Entonces puedes hacer esto. En lugar de lanzar múltiples promesas, puedes lanzarlas todas a la vez. Esto es lo que hace useSuspendQuery de react-query en lugar de useSuspendQuery. No hablaré de otros manejadores de consultas de estado porque react-query es realmente el único que conozco. Entonces, si quieres lanzar tus consultas en paralelo, es posible que desees usar este. Sin embargo, todavía se realizan algunas otras optimizaciones. Lo siento, es posible que tengas un problema si tus consultas están en diferentes componentes.

QnA

Manejo de Consultas Concurrentes y Preguntas y Respuestas

Short description:

Las consultas se lanzan en serie, no en paralelo. Usa useSuspendQuery para precargar datos antes de lanzar la consulta más rápido. Suspense lanza las consultas de sus hijos directos. React 19 muestra el cargador lo antes posible. Futura mezcla de comportamiento del 18 y 19. Sesión de preguntas y respuestas: ¿Qué día es hoy? Viernes.

Si tengo un primer componente que lanza una consulta y luego maneja este otro componente que tiene esta otra consulta, estas dos consultas no se lanzarán en paralelo. Y useSuspendQuery no puede hacer nada por ti aquí. Pero no creo que sea algo tan malo para suspense porque antes de suspense, esto todavía era el caso. Antes de suspense, tenías este cargador que bloqueaba tu proceso de renderizado. Así que no cambia mucho. Pero es posible que desees precargar tus data antes en tu aplicación para lanzar tus consultas más rápido.

Todavía hay, como dije, algunas optimizaciones realizadas. Suspense lanzará las consultas de todos sus hijos directos, lo que significa que si hay una consulta en perfil, suspense aún intentará lanzar al menos las primeras consultas de ayuda y boletín de todos los hermanos. Ese es el comportamiento de React 18. En React 19, esto ya no será el caso porque el equipo de React se dio cuenta de que era mejor mostrar un cargador lo más rápido posible. Pero algún día podrían volver a una mezcla del comportamiento del 18 y 19. Puedes obtener más información al respecto aquí, pero algún día podrían lanzar lo más rápido posible para mostrar un cargador, y luego activar otra pasada de renderizado para los hermanos.

Y esto es todo lo que quería compartir hoy sobre suspense. Espero que hayas disfrutado explorando sus secretos más oscuros. Llevo 18 años desarrollando y no tengo ni idea de lo que estás haciendo. Así que me quito el sombrero. Muchas gracias. Wow. Ahora vamos a pasar a las preguntas del público. Tengo que decir que esta es mi primera sesión de preguntas y respuestas y estoy realmente estresado por esta. OK. Vamos a empezar suavemente. Por favor. Primera pregunta, entonces. Solo para tranquilizarte, ¿qué día es hoy? No tengo idea. Si no puedo responder eso, debería dejar el escenario. Viernes. Es viernes. OK. Sí, tienes razón.

Lanzamiento de Promesas y Límites de Error

Short description:

Lanzar promesas como parte normal de la ejecución del código puede parecer incorrecto, pero puede ser beneficioso cuando se anidan dentro de una API o se utilizan a nivel de framework. Permite eliminar cargadores y errores. Sin embargo, se debe tener precaución y no se recomienda para el uso normal del código. Siguiente pregunta de Ensgar: ¿Puede un componente suspenderse al lanzar cualquier promesa dentro de él? Sí, esto es similar a cómo funcionan los límites de error.

Pronto podremos. De acuerdo. ¿De qué color es el suelo? Diría que es gris. Espero que estemos de acuerdo. De acuerdo. Luego una pregunta real. Lanzar promesas como parte normal de la ejecución del code se siente un poco incorrecto. ¿Puede lanzar reservarse para excepciones? Oh. De acuerdo. Entonces esto... Lo siento. Tuve que leerlo tres veces. No te preocupes. Esto es muy cierto, pero estás anidado dentro de una API. Eso no es algo que debas hacer. Por lo general, se utiliza un controlador de solicitudes u otra biblioteca que lo hace, y sí, no parece correcto, pero está anidado, está oculto. Entonces, como te permite eliminar todos tus cargadores, todos tus errores, creo que tiene tantos beneficios que está bien. Entonces no lo hagas en tu code normal, pero a nivel de framework, lo permitiremos. O si quieres hacerlo en tu code, no sé por qué sería una buena opción, pero podrías hacerlo y simplemente ocultarlo en una función que solo... Con una advertencia, estamos haciendo esto aquí, no lo hagas en ningún otro lugar. Sé que esto es sucio, no me juzgues. Sí. Muy bien.

Siguiente pregunta. De Ensgar. Charlotte. ¿Entonces simplemente puedes lanzar cualquier promesa dentro de un componente y el componente se suspenderá? Sí. Según lo que he leído. Sí. En realidad, esto es prácticamente cómo funcionan los límites de error también.

Lanzamiento de Promesas y Comportamiento de Respaldo

Short description:

Cuando se lanza una promesa, React verifica si es para suspense. Los hijos de suspense no necesariamente tienen que ser componentes asíncronos, sino que pueden ejecutar una promesa. ¿Qué sucede si un respaldo se suspende en el árbol de fibra? Puede resultar en un error o un bucle infinito. La compatibilidad de suspense con promise.all es incierta. El momento en que suspense recoge la obtención de datos dentro de useEffect con dependencias vacías no está claro debido a la próxima eliminación de useEffect en React 19.

Lanzas, y se propaga hasta el mismo tricatch, y React verifica los argumentos a los que estás presionando este error lanzado. Si tienes una promesa, supone que debe ser para suspense. Genial. Gracias.

Siguiente pregunta. ¿Los hijos de suspense necesitan ser componentes asíncronos, o solo necesitan ejecutar una promesa? Los hijos de suspense se han ido. ¿Los hijos de suspense necesitan ser componentes asíncronos, o solo necesitan ejecutar una promesa? Esa es una muy buena pregunta. Supongo que no... No estoy seguro, no lo he intentado. Pero supongo que no tiene que ser asíncrono. Simplemente lo hice asíncrono para obtener los resultados, pero supongo que si lanzas, lanzas. Así que esa es una buena pregunta, deberíamos probar esto. Cinco en la fuente.

Pregunta de Rob. Charlotte, ¿qué sucede si el árbol de fibra... ¿Qué sucede en el árbol de fibra si un respaldo también se suspende? Vaya, esta es una pregunta realmente buena. Supongo que tienes un error. Creo que definitivamente deberíamos probar esto. Pero supongo que podrías tener un bucle infinito. A todos les encantan los bucles infinitos, está bien.

¿Suspense también funciona con promise.all? No lo he probado, pero supongo que sí, sí. Realmente no lo sé. Esa es una respuesta válida. Quiero decir, si no lo hace, es solo unas pocas líneas de code que podrían agregarse a React y decidieron no hacerlo. De acuerdo. Muy bien, siguiente. ¿Cuándo recoge suspense la obtención de data dentro de useEffect con dependencias vacías? Cuando queremos obtener data solo una vez. Bueno, useEffect desaparecerá con React 19. Sí. Realmente no lo sé.

React 19, Integración de Redux y Visualización de Cargadores

Short description:

En React 19, ya no se utilizará useEffect debido al nuevo compilador. La integración de Redux con suspense es incierta. React query afirma que el soporte de suspense es experimental, pero se está utilizando en producción. La visualización de cargadores en suspense puede requerir frameworks habilitados para suspense, excepto en versiones anteriores a React 19.

Lo siento. Supongo que no es necesario porque en React 19, ya no vamos a utilizar useEffect debido al nuevo compilador sofisticado del que todos estamos contentos.

De acuerdo. ¿Cómo se integra suspense con Redux, si lo sabes? No tengo idea. No lo he intentado. No sé por qué sería un problema. Probablemente. Sí. ¿Podrías decir la respuesta de un experto? Depende. Tal vez deberíamos intentar reunirnos con Mark Erickson aquí y preguntarle. Bueno, intentémoslo.

De acuerdo. React query aún afirma que el soporte de suspense es experimental. ¿Ya lo estás utilizando en producción? Sí, lo estamos utilizando. Sí. No lo sabía... Francamente, no sabía que todavía era experimental. Creo que es seguro, pero... Sí. Es lo suficientemente seguro. Aunque si ellos lo dicen, tal vez no deberíamos. La empresa todavía está en funcionamiento. Nadie se ha declarado en quiebra. Entonces, está bien. Nuestra aplicación aún no ha sido rechazada por la tienda.

De acuerdo. La documentación menciona que la visualización de cargadores en suspense solo funciona con frameworks habilitados para suspense. ¿Funciona el patrón que muestras sin ese framework? No lo creo. Debo haber seguido la documentación, así que supongo que lo agregué. Creo que mencionan que los frameworks habilitados para suspense son la única forma en que funciona en versiones anteriores a React 19.

Understanding React 19 Suspense and Promises

Short description:

En React 19, debemos entender cómo funciona suspense y leer el código fuente. Surge una pregunta sobre los tiempos de espera y las promesas en los componentes secundarios. ¿Cómo identifica suspense el componente que desencadenó la promesa? Le pediremos a Lou que se conecte en Twitter para obtener más información. Otra pregunta pregunta si React MonkeyPatch promete hacerlos lanzables, pero el orador no está seguro.

Porque en el mundo de React 19, creo que ya funciona. Realmente no tengo idea. Necesitamos leer el código fuente.

Una pregunta de Lou. ¿Qué sucede si el componente secundario contiene algo como un tiempo de espera y luego lanza una promesa? No veo... No veo por qué el tiempo de espera afectaría la promesa. Sí. Probablemente si detiene el ciclo de renderizado. O si... Oh, si la promesa ocurre dentro del... Tiempo de espera. De acuerdo. Lo entiendo. Esa es realmente una buena pregunta. Tengo que recordar.

¿Cómo sabe suspense que este componente desencadenó la promesa? No recuerdo esta parte. Esa es una buena pregunta. ¿Cómo sabe suspense que este es el componente que lanzó esta promesa? Tengo que decirlo. No lo recuerdo. Lo siento. Le pediremos a Lou que te busque en Twitter y luego podrán descubrirlo juntos. Puedo verificar después. Lo siento. No estás aquí porque lo sabes todo. Sabes un poco y queremos tener ese conocimiento. Así que no te preocupes.

La siguiente pregunta es de Ren. ¿React MonkeyPatch promete hacerlo lanzable, o cómo funciona eso? Realmente no lo sé. Pero una promesa es lanzable. Sí, no conozco a React Monkey, lo siento.

Caching Promises and Using Suspense for Full Pages

Short description:

Ren preguntó sobre el almacenamiento en caché de promesas con OffscreenComponent en React 17. El orador sugiere hacer una actualización de NPM para comprender mejor. Otra pregunta pregunta si es una buena práctica usar suspense para páginas completas con una carga de respaldo. El orador recomienda tener solo un cargador en lugar de varios cargadores para una mejor experiencia de usuario.

No lo sabemos, Ren. Lo siento. Alex Pax pregunta, ¿quieres decir que con OffscreenComponent no necesitamos almacenar en caché la promesa para que funcione suspense? Y Alex todavía está en React 17. No sé por qué necesitamos almacenar en caché una promesa. Oh. Con Offscreen. De acuerdo. Entonces, el objetivo de Offscreen no es mantener las promesas en caché. Es mostrar u ocultar tus hijos, ya sea que quieras mostrar la carga de respaldo o los hijos. No estoy seguro de entender la pregunta.

De acuerdo. Bueno, es un poco difícil de responder ya que Alex todavía está en React 17. El consejo sería tal vez hacer una actualización de NPM. Siguiente pregunta. ¿Se considera una buena práctica usar suspense para renderizar páginas completas con una carga de respaldo? ¿Entonces si envuelves toda tu aplicación con un suspense para un cargador? ¿Para páginas completas? Bueno, no sé acerca de las mejores prácticas de diseño, pero supongo que quieres tener tanto como solo un cargador en lugar de tener varios cargadores y tener una cascada de cargadores. Así es como lo hacemos. Pero no estoy seguro de que sea la mejor práctica. Por un lado, quieres mostrar los pequeños fragmentos de datos. Si tienes como cinco fuentes de datos, quieres mostrar los datos que llegan. No quieres tener que esperar. Si hay una llamada que tarda dos segundos y la otra tarda 10, quieres mostrar los datos después de dos segundos, ¿verdad? No quieres hacer esperar al usuario. Pero por otro lado, mostrar también cinco cargadores, sí. Supongo que depende de tu aplicación. Si tienes esqueletos bonitos, entonces puede ser bueno tener proveedores de suspense solo para estas partes para que puedas, como dijiste, mostrar los datos de esta parte lo más rápido posible. Si solo tienes algunos cargadores, entonces tener grandes cargadores en todas partes no es bonito. Así que supongo que depende de cuánto tiempo tengas en tus decisiones de diseño. Eso es un final perfecto porque no tenemos más tiempo. Así que quiero agradecerles mucho por estar aquí hoy y por esta encantadora sesión de preguntas y respuestas. ¿Puedo tener un cálido aplauso para Charlotte? Así que tómense un momento para calificar la charla de Charlotte. Cualquier comentario es muy apreciado. Ahora vamos a tomar un descanso. No olviden conseguir algunos sellos y ganar esos increíbles auriculares de Apple. Y ahora tomen un refrigerio, tomen algo y nos vemos en 30 minutos.

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.