El arma secreta de React: Aprovechando las características concurrentes para un rendimiento de primera categoría

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

Descubre cómo las características concurrentes a menudo pasadas por alto de React, como startTransition, useDeferredValue y Suspense, pueden transformar el rendimiento y la capacidad de respuesta de tu aplicación. Aprende técnicas prácticas para priorizar actualizaciones críticas, manejar estados de carga de manera elegante y crear experiencias de usuario fluidas incluso con interacciones de datos complejas.

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

Dara Olayebi
Dara Olayebi
25 min
25 Oct, 2024

Comments

Sign in or register to post your comment.
Video Summary and Transcription
Voy a hablar sobre la concurrencia dentro de React y cómo puedes usarla para mejorar el rendimiento dentro de tus aplicaciones. La concurrencia es crucial para optimizar la capacidad de respuesta y garantizar una buena experiencia de usuario en aplicaciones complejas. React divide el proceso de renderizado en fases de render y commit, permitiendo la interrupción de la fase de render para priorizar las interacciones del usuario. El programador de tareas de React maneja las tareas en pequeños fragmentos, asegurando una experiencia de usuario fluida y capacidad de respuesta. Las tareas de alta prioridad incluyen interacciones del usuario, mientras que las tareas de menor prioridad implican la obtención de datos o el renderizado de listas largas. React introdujo nuevos hooks, useTransition y useDeferredValue, para manejar las prioridades de actualización de estado. El hook de valor diferido permite diferir las actualizaciones de valores de UI no críticos, mientras que Suspense para la obtención de datos mejora el rendimiento de la obtención de datos en aplicaciones React. La concurrencia es útil para manejar entradas de búsqueda en tiempo real, cambios de pestañas o componentes sin problemas, renderizar listas grandes y animar transiciones. Sin embargo, hay desventajas en la concurrencia, como posibles retrasos en actualizaciones no urgentes y beneficios limitados para componentes costosos. La concurrencia puede agregar carga a la CPU y requiere una comprensión del comportamiento en segundo plano de React para una depuración efectiva. Usa suspense en componentes de nivel padre para la obtención de datos. El perfilado de rendimiento puede ayudar a probar la efectividad de los hooks de transición.

1. Introducción a la Concurrencia en React

Short description:

Voy a hablar sobre la concurrencia en React y cómo puedes usarla para mejorar el rendimiento de tus aplicaciones. La agenda de hoy incluye un trasfondo sobre el problema de rendimiento, la concurrencia bajo el capó en React, las principales API concurrentes introducidas en React 18, casos de uso y desventajas. La concurrencia es crucial para optimizar la capacidad de respuesta y garantizar una buena experiencia de usuario en aplicaciones complejas.

Estoy feliz de estar aquí. Gracias por estar aquí. Gracias Natalia por la introducción. Voy a hablar sobre la concurrencia en React y cómo puedes usarla para mejorar el rendimiento de tus aplicaciones. Y sí, soy ingeniero de software y actualmente trabajo en Spotify.

Antes de entrar en la charla en sí, solo un poco de trasfondo sobre mi trayectoria y cómo me adentré en el frontend. Así que comenzó alrededor de 2017. Estudié un curso de ciencias de la computación o un curso muy relacionado con la tecnología, pero construí un sitio web como parte de mi carrera y lo odié absolutamente. Pero me encontré aprendiendo HTML y CSS después de graduarme. Y luego hice eso por un tiempo y finalmente conseguí mi primer puesto en tecnología en 2018. Y básicamente esta fue mi introducción a los frameworks de frontend y más específicamente React. Y luego trabajé allí por un tiempo y me mudé a una startup de comercio de criptomonedas donde trabajaba más intensamente solo con React. Y luego en 2022 comencé un rol de full stack, que es mi primer rol de full stack en Spotify. Así que en realidad trabajo más con el backend estos días, pero trabajo con Java en el backend y React en el frontend.

Bien, suficiente sobre mí. Así que hoy, aquí hay una agenda rápida de lo que voy a hablar. Comenzando con un poco de trasfondo sobre el problema de rendimiento. Entonces, ¿por qué estamos hablando de concurrencia en primer lugar? Y luego hablaremos un poco sobre la concurrencia bajo el capó. Así que cómo React realmente es, cómo React logró la concurrencia. Veremos las principales API concurrentes que se introdujeron en React 18. Hablaré brevemente sobre algunos casos de uso y luego algunas desventajas porque todo viene con una desventaja. Muy bien. Así que si piensas en las aplicaciones que usas en tu día a día hoy, Instagram, Twitter, esas aplicaciones dependen de dar retroalimentación inmediata al usuario, ¿verdad? Cuando desplazo mi feed de Instagram, recibo retroalimentación inmediatamente. Y las aplicaciones que construimos hoy se han vuelto cada vez más complejas, ¿verdad? Comparado con hace muchos años. Así que hay más datos que estas aplicaciones tienen que manejar, lo que significa más renders, más computación. Y todo esto esencialmente significa que hay una mayor probabilidad de una carga aumentada en el rendimiento de estas aplicaciones. Así que esencialmente, aquí es donde entra la concurrencia. Es crucial optimizar para la capacidad de respuesta para asegurar que la experiencia del usuario en estas aplicaciones sea lo mejor posible.

Así que aquí. Y sobre el tema principal.

2. The What and How of Concurrency

Short description:

La concurrencia es la capacidad de gestionar múltiples tareas simultáneamente sin bloquear el hilo principal. React divide el proceso de renderizado en fases de renderizado y de commit. En la fase de renderizado, React compara el DOM existente con el DOM virtual, calcula la diferencia y determina los cambios necesarios. La fase de commit aplica estos cambios al DOM, permitiendo la interrupción de la fase de renderizado para priorizar las interacciones del usuario.

El qué y el cómo de la concurrencia. En pocas palabras, la concurrencia es la capacidad de gestionar múltiples tareas simultáneamente, como renderizar la interfaz de usuario, responder a la entrada del usuario, procesar solicitudes de red, y hacer todo esto sin bloquear o ralentizar el hilo principal. Así que echemos un vistazo al trasfondo de esto y cómo React realmente logra esto.

Imagen superior, sincrónica, imagen inferior, concurrente. Y el proceso de renderizado en React se divide en dos fases. Así que está la fase de renderizado, y está la fase de commit. Así que si miras la primera imagen, notarás que la fase de renderizado, que es donde React comparará el DOM existente con el DOM virtual, calculará la diferencia, y básicamente hará esta computación y determinará qué cambios necesitan hacerse. Y luego la fase de commit es donde React realmente aplicará estos cambios al DOM.

Así que si miras la primera imagen, es solo un bloque continuo largo de renderizado, ¿verdad? Y luego tenemos el commit, y luego tenemos estas tareas. Y lo que eso significa, típicamente, antes de React 18, es que la fase de renderizado no podía ser interrumpida. Así que cuando cargo un componente o una página, React tiene que completar esa fase de renderizado antes de que el usuario pueda realmente interactuar con la página web. Así que la fase de commit, como puedes ver, básicamente hace que este proceso sea interrumpible. Así que si miras la imagen inferior, notarás que esta fase de renderizado se divide en pequeños fragmentos y esencialmente, React ha creado algo bastante inteligente, donde en lugar de renderizar todo en un solo bloque, realmente puede interrumpir esta fase de renderizado y el usuario puede priorizar las interacciones del usuario entre la fase de renderizado.

3. The Task Scheduler and Concurrency Model

Short description:

React maneja tareas en pequeños fragmentos, asegurando una experiencia de usuario fluida y receptiva. El programador de tareas es el motor detrás del modelo de concurrencia, dividiendo el trabajo de renderizado en fragmentos y priorizando tareas como las interacciones del usuario.

Así que nota que tenemos estos pequeños fragmentos de renderizado. Tenemos una tarea, que podría representar un evento de usuario como un clic o escribir. Luego React vuelve al renderizado, maneja la tarea, y es ese ir y venir, lo que significa que nuestras aplicaciones tienen una experiencia de usuario más fluida, y luego son más receptivas.

Así que las posibilidades de tener algún tipo de congelamiento en la UI son menos probables. Así que aquí hay un diagrama muy básico, a un nivel muy alto, algo amateur que creé para representar lo que sucede detrás de escena. Vemos nuestro navegador web, vemos la aplicación React, y luego vemos algo llamado un programador de tareas.

Este programador es como el motor detrás de este modelo de concurrencia. Así que lo que hace es, en primer lugar, he mencionado que el trabajo o el renderizado se divide en pequeñas unidades, ¿verdad? Este concepto se llama time-slicing, por lo que el trabajo de renderizado que se requiere se divide en fragmentos. Y luego lo que hace el programador es, mira todas las tareas que necesitan ser manejadas y las prioriza y luego ejecuta estas tareas.

4. React's Task Priority System

Short description:

Las tareas de alta prioridad incluyen interacciones del usuario como hacer clic en un botón, mientras que las tareas de menor prioridad implican la obtención de datos o el renderizado de listas largas. El programador de tareas incorporado asigna prioridad y cede el control al navegador cada cinco milisegundos, asegurando el manejo oportuno de las tareas de alta prioridad. React toma el control y continúa renderizando después de que el navegador maneja la tarea. Capturas de pantalla del paquete del programador en el repositorio oficial de React demuestran la función de bucle de trabajo que verifica las tareas de alta prioridad y la función should yield to host que determina la transferencia de control al navegador.

Así que una tarea de alta prioridad puede considerarse como un usuario haciendo clic en un campo de entrada, o un usuario intentando desplazarse o escribir. Sí, hacer clic en un botón, por ejemplo, eso es de alta prioridad porque, como dije, el usuario espera una respuesta inmediata, ¿verdad? No quiero hacer clic en un botón y que se congele. Y la menor prioridad es obtener datos de un backend o renderizar algún tipo de lista larga.

Así que esta tarea, este programador de tareas incorporado, básicamente asigna esta prioridad a las diferentes tareas, y luego cede el control de nuevo al navegador cada cinco milisegundos. Así que cada vez que nota que hay un clic en la pantalla, básicamente dirá, navegador, esto es importante, maneja esto. Una vez que eso está hecho, React toma el control y continúa renderizando. Si hay otro clic, cede el control de nuevo al navegador y así sucesivamente. Y hace esto por defecto cada cinco milisegundos. Así que básicamente solo verifica continuamente si hay alguna tarea de alta prioridad que necesita ser completada.

Estas son capturas de pantalla que tomé para hacer esto más real del paquete del programador en el repositorio oficial de React. Así que nota a la izquierda, tenemos esta función de bucle de trabajo. Nuevamente, como dije, esto continúa verificando las tareas de alta prioridad. Y luego a la derecha, hay una función llamada should yield to host, y eso es lo que determina si el host significa el navegador. En este caso, eso es lo que determina si React debe ceder el control al navegador o continuar el proceso de renderizado.

5. Practical Use of Concurrent APIs

Short description:

React introdujo nuevos hooks, useTransition y useDeferredValue, para manejar las prioridades de actualización de estado. useTransition nos permite asignar prioridad a las actualizaciones de estado usando un método startTransition. Distingue entre tareas de alta prioridad como setText y tareas de menor prioridad como setTheme. El método startTransition se puede importar directamente desde React.

Bien, pasemos ahora a las cosas más prácticas. Así que ya sabemos cómo funciona todo esto detrás de escena. Y React ha abstraído toda esta complejidad de los usuarios, que somos tú y yo, a través de estas concurrent APIs. Así que cuando se lanzó la versión 18, que es cuando realmente se introdujo la concurrencia, lanzaron estos dos nuevos hooks, useTransition, useDeferredValue, y luego extendieron suspense para la obtención de datos.

Así que hablaré de cada uno de estos, comenzando con useTransition. Esencialmente, esto nos permite asignar prioridad a una actualización de estado. Así que, tal como mencioné antes, el programador de tareas utiliza una cola de prioridades para determinar qué es importante y qué no lo es. useTransition es lo que nos permite manejar realmente esta prioridad como usuarios, como usuarios finales de React. Así que en el código de la izquierda, es solo un hook normal. Así que devuelve dos valores, una bandera isPending, que es un valor booleano, y luego devuelve un método llamado startTransition. Y si miras dentro de este método handleClick, tenemos este setText, que se considera una tarea de alta prioridad. Tal vez ese no sea el mejor ejemplo, pero solo para compararlo con setTheme, que está envuelto dentro de este método startTransition, y eso se considera de menor prioridad.

Así que cada vez que tienes actualizaciones de estado dentro de startTransition, se considera una actualización de transición que no es tan importante como las otras actualizaciones u otras cosas que necesitan ser renderizadas. También puedes importar directamente este método startTransition. Así que si por alguna razón no quieres usar un hook, o no puedes usar un hook cuando estás en esos componentes específicos, puedes usar el método startTransition, importarlo directamente desde React. Bien, espero que esto funcione.

6. Effects of useTransition Hook

Short description:

La siguiente serie de diapositivas demuestra los efectos de usar el hook useTransition. En una computadora rápida sin useTransition, las actualizaciones del gráfico de burbujas ocurren inmediatamente, pero con useTransition, hay una ligera pausa. En una computadora lenta sin useTransition, hay un retraso significativo, afectando negativamente la experiencia del usuario. Sin embargo, con useTransition, el deslizador permanece receptivo, y los gráficos de burbujas se desvanecen ligeramente para indicar un estado de carga. Esto resulta en una experiencia de usuario más agradable.

Oh, okay, I think it's going to keep looping. Pero estas, la siguiente serie de diapositivas son videos de los sitios web del grupo de trabajo de React 18 que extraje. Es básicamente un sitio web que tiene este gráfico, y este, creo que se llama un gráfico de burbujas, y tiene este deslizador en la parte superior, en algún lugar en la parte superior izquierda, donde ves puntuación mínima. No estoy seguro si puedo hacer que esto se reproduzca de nuevo. Tal vez si retrocedo.

Así que si notas, este es un ejemplo de esta transición o esta interacción que ocurre en una computadora rápida que no usa transición o el hook useTransition. Y solo retrocede de nuevo. Así que nota que mientras deslizas, el contenido cambia según el valor en el que está el deslizador. Así que este se ve normal. Pero así es como se ve con un useTransition. Así que de nuevo, nota que las actualizaciones del gráfico de burbujas son mucho, no ocurren tan pronto como deslizas. De nuevo, ayuda al usuario a determinar, bien, ahora estoy en esta puntuación, y esto es como, hay una ligera pausa. Y esto es aún más prominente o más pronunciado en computadoras lentas.

Así que aquí hay otro ejemplo, una computadora lenta que no usa transición. Y nota cuánto retraso hay. Y esto sucede bastante a menudo. Visitas un sitio web que maneja, digamos, muchos datos, y estamos tratando de mover algo o hacer clic en algo, y simplemente se retrasa. Así que voy a retroceder de nuevo. Solo para ver ese retraso. Y sí, incluso hubo, creo, algún fallo allí, pero no es una experiencia de usuario positiva. Creo que todos podemos estar de acuerdo en eso. Y luego aquí está el ejemplo con useTransition en una computadora lenta. Así que para que esto funcione, realmente reducen la velocidad de la CPU, solo para ver la efectividad de esto. Así que lo reproduciré de nuevo. Y ves que el deslizador no está congelado, así que puedo moverme hacia adelante y hacia atrás con bastante facilidad. Y nota esto, como, los gráficos de burbujas se desvanecen ligeramente, lo que indica algún tipo de estado de carga, y están usando la bandera isPending para poder hacer eso. Así que en general, hace que la experiencia del usuario sea más agradable. Reproduce eso una vez más. Mientras deslizamos, podemos deslizar fácilmente, y luego los datos se nos devuelven a demanda. Así que en este caso, las actualizaciones del gráfico se consideran, o han sido envueltas dentro de un método startTransition y se consideran de menor prioridad.

7. Deferred Value and Suspense for Data Fetching

Short description:

El hook deferred value permite aplazar las actualizaciones de valores de la UI que no son críticos. Esto asegura una experiencia de usuario más fluida al reducir el retraso en ciertos componentes. Otra característica, Suspense para la obtención de datos, permite pausar el renderizado de un componente hasta que se resuelvan los datos requeridos. Esto mejora el rendimiento de la obtención de datos en aplicaciones de React.

Y el deslizador se considera una actualización de alta prioridad, por lo que React priorizará ese movimiento y luego manejará esta actualización del gráfico de burbujas después. Usa deferred value. Así que esto es bastante similar a useTransition, pero en lugar de asignar prioridad a una actualización de estado lo que podemos hacer con esto es básicamente aplazar las actualizaciones de un valor en la UI. Así que si hay un valor que tengo, y no necesito que se actualice inmediatamente, entonces usaría este hook.

Así que es específicamente para valores que podrían potencialmente afectar mi experiencia de usuario que no son críticos para la interacción del usuario, más bien. Así que aquí, simplemente he definido el hook como de costumbre. Toma el valor que deseas aplazar, y luego te devuelve ese valor. Así que aquí, deferred está simplemente en una etiqueta p, y se considera de menor prioridad que el resto de la página.

Así que aquí hay otro video. Básicamente, creé este simple, solo un campo de entrada, y mientras escribo, esencialmente muestra lo que estoy escribiendo en ese campo de entrada. También he añadido ese punto rojo allí, solo para que puedas indicar cuando realmente estoy escribiendo. Así que nota de nuevo, la cantidad de retraso que hay, y también la lista que muestra este campo de entrada ha sido ralentizada artificialmente. De nuevo, para mostrar cómo funciona esto en la práctica, y luego aquí, estoy usando el hook. Y notas el cambio. Así que he definido el hook allí, y el valor que devuelve el hook, luego lo paso a este componente de lista lenta. Así que nota de nuevo, mientras escribo, no hay retraso. El punto rojo está allí más permanentemente, y luego los datos no se actualizan inmediatamente. Así que de nuevo, los nombres no necesariamente necesitan mostrarse inmediatamente, pero mientras escribo, que es una tarea de alta prioridad, quiero que eso suceda, y quiero retroalimentación inmediata.

Bien, y luego la última característica concurrente de la que voy a hablar hoy es Suspense para la obtención de datos. Así que Suspense ha existido desde React 16, pero en React 18, esencialmente han extendido la funcionalidad de Suspense. Así que típicamente, usaríamos Suspense para cargar un componente de manera diferida, así que si no necesariamente queremos que el componente se renderice cuando no es necesario, usaríamos Suspense para eso. Y ahora, lo que podemos usar Suspense es para básicamente pausar el renderizado de un componente hasta que los datos que requiere hayan sido resueltos. Así que aquí tengo un ejemplo. Esta variable de datos tiene que usar datos asincrónicos, y esencialmente, ese Suspense debería tener un componente dentro, pero el componente solo se renderizaría después de que tenga los datos que el componente está usando. Así que aquí tengo dos ejemplos, obtención de datos antes y después. Tengo este componente ArtistList, y así es como típicamente lo haríamos hoy. Así que tendríamos un useEffect donde llamaríamos a esta API, tendríamos un setIsLoading a true, y luego lo estableceríamos a false una vez que el resultado se haya resuelto. Y luego tengo este loadingArtist para verificar cuando loading es true, y luego simplemente renderizo los datos. Así que a la derecha, estoy haciendo prácticamente lo mismo, pero estoy usando Suspense que ahora puede manejar la obtención de datos. Así que aquí tengo mi componente ArtistList envuelto dentro del Suspense.

8. Fallbacks and Suspense for Data Fetching

Short description:

El uso de fallbacks y Suspense para la obtención de datos permite un renderizado eficiente de componentes que dependen de datos asincrónicos. Esta característica funciona mejor con bibliotecas de obtención de datos como React Query.

Tengo mi fallback, y nota que ya no necesito el useEffect. He definido la función ArtistList al final, y luego nuevamente, los datos que ves definidos allí que son iguales a resourced o re-data son los datos que el componente ArtistList necesita. Y esencialmente, hasta que este componente ArtistList tenga, o hasta que estos datos hayan sido resueltos, entonces el componente está básicamente suspendido. Así que React pausa ese renderizado hasta que los datos estén listos. Y solo una advertencia aquí es que esto actualmente solo funciona si estás usando algún tipo de biblioteca de obtención de datos como React Query, por lo que el mecanismo de obtención de datos necesita ser consciente de Suspense. Así que esto típicamente no funcionaría con solo llamadas fetch regulares sin ninguna biblioteca.

9. Perfilado de Rendimiento e Inconvenientes de la Concurrencia

Short description:

Al perfilar el rendimiento de las versiones sincrónica y concurrente, observamos que las tareas en la versión concurrente eran mucho más pequeñas, lo que resultó en una mayor eficiencia. La concurrencia es útil para manejar entradas de búsqueda en tiempo real, cambios fluidos de pestañas o componentes, renderizado de listas grandes y animación de transiciones. Sin embargo, hay inconvenientes en la concurrencia, como posibles retrasos en actualizaciones no urgentes y beneficios limitados para componentes costosos.

Bien, ahora que eso está hecho, con uno de los ejemplos, básicamente hice una grabación rápida del rendimiento. Así que hice un perfilado aquí, y puedes ver que el de arriba es la versión sincrónica, el de abajo es la versión concurrente. Así que creo que esto fue, usé el ejemplo de useDeferredValue con la escritura de los nombres de los artistas. Si te enfocas en la imagen de arriba, puedes ver esta barra roja y en Chrome eso representa lo que se considera una tarea larga. Y he puesto entre paréntesis allí, si pasas el cursor sobre ella, que tomó 403 milisegundos. Así que nuevamente, ves esto, los fragmentos son mucho más largos en comparación con el de abajo cuando añadí este hook useDeferredValue, y ves que las tareas son mucho, mucho más pequeñas. Así es como React maneja estos eventos o estas tareas en pequeños fragmentos. Oh, y sí, 0.1 milisegundos por tarea, mientras que la otra era de 403 milisegundos por tarea. Así que mucho trabajo práctico que acabamos de ver aquí.

¿Cómo usas esto realmente, o cuándo usas esto para otros? Estos son solo algunos ejemplos, hay muchos más de los que podrías imaginar, pero creo que estos son los ejemplos más comunes que quería resaltar. En primer lugar, manejar entradas de búsqueda en tiempo real. Así que si tienes un campo de búsqueda que renderiza algún tipo de datos cada vez que escribes en él, dependiendo de qué entradas hayas escrito, te devuelve datos. La concurrencia es excelente para eso porque nuevamente, previene el congelamiento de la interfaz de usuario. Y luego cambios fluidos de pestañas o componentes. Así que React tiene un buen ejemplo en su documentación, de hecho, de cómo funciona esto. Si tienes algunas pestañas y estás cambiando entre ellas bastante rápido, y digamos que esas pestañas dependen de datos que vienen de un servidor, el botón o la pestaña en sí, el clic podría congelarse. Así que usarías algo como start transition para establecer esta pestaña como una actualización de baja prioridad. Y luego renderizado de listas grandes. Así que nuevamente, esto es intensivo en recursos. Y finalmente, mostrar animaciones y transiciones, así que cualquier cosa que pueda afectar potencialmente la fluidez de las animaciones o transiciones en una página web.

Inconvenientes. Las cosas importantes. Así que sí, hay algunos inconvenientes con la concurrencia, así que definitivamente tiene algún costo. En primer lugar, puede realmente retrasar las actualizaciones no urgentes. Así que lo que estamos haciendo es establecer actualizaciones específicas para que no sean tan importantes. Así que estamos diciendo despriorizar esto y priorizar otra cosa. Y esto podría tener un efecto adverso en la experiencia del usuario, por supuesto, si no lo estás usando de la manera correcta. Así que especialmente si piensas en un dispositivo lento, por ejemplo, las actualizaciones no urgentes podrían ser mucho más lentas de lo que necesitas que sean. Y luego no necesariamente tiene beneficios para componentes costosos. Así que si un componente es bastante grande y tarda 500 milisegundos en renderizarse, independientemente de si estás usando concurrencia o no, esta cantidad de tiempo es lo que te llevaría renderizar ese componente.

10. CPU Strain and Background Behavior of Concurrency

Short description:

La concurrencia puede añadir carga al CPU y requiere una comprensión del comportamiento en segundo plano de React para una depuración efectiva. React puede gestionar y renderizar múltiples versiones de la UI simultáneamente, pero la concurrencia no está habilitada por defecto. Prioriza eventos importantes del usuario para que la aplicación se sienta más rápida.

En tercer lugar, puede añadir carga al CPU. Así que piensa en todas las cosas que están sucediendo en segundo plano, toda la sobrecarga que React ha incluido. Así que la cesión al navegador, la programación, la priorización, todo eso. Añade algún tipo de sobrecarga, y si estás usando concurrencia en un dispositivo de gama baja, o, digamos, en una tarea que, por otro lado, en un componente que ya está optimizado, o en como un componente intensivo en CPU, podría realmente tener beneficios insignificantes para ti. Así que es importante sopesar los compromisos de rendimiento cuando se trata de concurrencia.

Y finalmente, creo que requiere no es la palabra correcta aquí, pero es más un... Si te gustaría usar concurrencia dentro de tus aplicaciones, ayuda tener algo de conocimiento de lo que está sucediendo detrás de escena para que puedas depurar mejor. Si hay algún comportamiento extraño ocurriendo, entonces sabes, está bien, esto es por lo que entiendo lo que React está haciendo en segundo plano. Así que solo hay esa curva de aprendizaje para los desarrolladores.

Bien, así que para redondear los puntos clave, la concurrencia significa que React ahora puede gestionar y renderizar múltiples versiones de la UI a la vez. Así que está haciendo todo esto simultáneamente. La concurrencia no está habilitada por defecto, así que realmente tienes que optar por la concurrencia a través de estas características concurrentes que destaqué. Y finalmente, en realidad no hace que tu aplicación sea más rápida, pero la hace sentir más rápida mediante la priorización de eventos importantes del usuario.

11. Suspense and Testing with Transition Hooks

Short description:

Usa suspense en componentes a nivel de padres para la obtención de datos. Los hooks de transición se centran en la capacidad de respuesta de la interfaz de usuario, mientras que debounce tiene un alcance más amplio. El perfilado de rendimiento puede ayudar a probar la efectividad de estos hooks. No hay diferencias significativas en las pruebas, pero el uso excesivo puede afectar negativamente a la aplicación.

Así que, y eso es todo. Muchas gracias por escuchar.

Muy bien. Así que tenemos algunas preguntas que llegaron, y las revisaré. Y una de las primeras es sobre suspense y pregunta, ¿deberíamos usar suspense en componentes a nivel de padres o hijos, creo? Bien. Esa es una buena pregunta. Creo que cuando se trata de, si estás, están preguntando específicamente sobre suspense para la obtención de datos, si consideras cualquier aplicación que, así que creo que los beneficios de suspense es que te permite dividir esta lógica de obtención de datos de la aplicación que realmente la utiliza. Así que puedes tener tu lógica en otro componente que está envuelto en suspense y luego tener este componente hijo donde solo estás renderizando la interfaz de usuario o los datos que se reciben. Así que diría que lo uses en los padres y luego en el hijo, solo renderizas los datos que se devuelven.

Genial. Gracias. Y por cierto, solo quiero recordarles a todos también, por favor escaneen el código QR también y den su calificación. Pueden calificar la charla de cinco estrellas. Y tenemos algunas preguntas más llegando. Y esta es sobre cuáles son los beneficios de usar transiciones sobre alguna forma de como un de-balance también? Sí, esa es una buena pregunta. Definitivamente algo que los usuarios consideran. Así que creo que use deferred, use transition o use deferred value. Esos hooks están muy enfocados en la capacidad de respuesta de la interfaz de usuario, ¿verdad? Mientras que algo como de-balance tiene, creo que diría un alcance más amplio donde puedes controlar las llamadas a funciones. Así que si tienes un caso de uso donde la capacidad de respuesta o la interactividad tiene algún tipo de problema de rendimiento, entonces diría que uses deferred value o use transition. Pero si es, supongo, más amplio que eso, y estás tratando de, limitar la cantidad de veces que se llama a una cierta función dentro de tu componente, entonces de-balance funciona mejor para eso. Así que esos hooks están muy enfocados en la capacidad de respuesta de la interfaz de usuario y asegurando que haya una interacción fluida entre el usuario y la aplicación.

Me encanta eso. Y también la especie de distinción entre algo que tal vez está siendo rendimiento en un segundo plano y algo que se siente rendimiento para el usuario y usar la herramienta correcta para obtener uno de esos. La siguiente pregunta, porque siempre pensamos en las pruebas y asegurarnos de que podemos probar nuestro código, ¿cómo afecta esto a la capacidad de prueba? ¿O hay algunas formas en que podemos probar o implementar pruebas en este tipo de cosas? Buena pregunta. Creo que sí. Me centré en este perfilado de rendimiento cuando se trataba de probar la efectividad real de estos hooks. Así que eso es algo que podrías hacer, medir o perfilar lo que estaba sucediendo antes y lo que está sucediendo ahora. Pero creo que no diría que hay diferencias significativas cuando se trata de pruebas. Creo que es más poder identificar si estos antes de sumergirse en el uso de estos hooks, poder identificar si los, supongo, los resultados o lo que te gustaría lograr es lo suficientemente significativo. Porque a veces si hay un uso excesivo de estas características, podría tener un impacto negativo en la aplicación. Genial. Muchas gracias.

Como pueden ver, hay más preguntas, pero no tenemos tiempo para preguntas, desafortunadamente, pero pueden encontrarla en el Q&A de los ponentes. Y también, ¿dónde puede la gente encontrarte en línea? LinkedIn, Dara Olaibi, Twitter, Dara Olaibi, Instagram, Dara Olaibi. Genial. Gracias. ¿Podemos dar un aplauso de cinco sobre cinco para Dara una vez más? Gracias.

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.
Acelerando tu aplicación React con menos JavaScript
React Summit 2023React Summit 2023
32 min
Acelerando tu aplicación React con menos JavaScript
Top Content
Mishko, the creator of Angular and AngularJS, discusses the challenges of website performance and JavaScript hydration. He explains the differences between client-side and server-side rendering and introduces Quik as a solution for efficient component hydration. Mishko demonstrates examples of state management and intercommunication using Quik. He highlights the performance benefits of using Quik with React and emphasizes the importance of reducing JavaScript size for better performance. Finally, he mentions the use of QUIC in both MPA and SPA applications for improved startup performance.
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.
Entendiendo la Arquitectura Fiber de React
React Advanced 2022React Advanced 2022
29 min
Entendiendo la Arquitectura Fiber de React
Top Content
This Talk explores React's internal jargon, specifically fiber, which is an internal unit of work for rendering and committing. Fibers facilitate efficient updates to elements and play a crucial role in the reconciliation process. The work loop, complete work, and commit phase are essential steps in the rendering process. Understanding React's internals can help with optimizing code and pull request reviews. React 18 introduces the work loop sync and async functions for concurrent features and prioritization. Fiber brings benefits like async rendering and the ability to discard work-in-progress trees, improving user experience.
How React Compiler Performs on Real Code
React Advanced 2024React Advanced 2024
31 min
How React Compiler Performs on Real Code
Top Content
I'm Nadia, a developer experienced in performance, re-renders, and React. The React team released the React compiler, which eliminates the need for memoization. The compiler optimizes code by automatically memoizing components, props, and hook dependencies. It shows promise in managing changing references and improving performance. Real app testing and synthetic examples have been used to evaluate its effectiveness. The impact on initial load performance is minimal, but further investigation is needed for interactions performance. The React query library simplifies data fetching and caching. The compiler has limitations and may not catch every re-render, especially with external libraries. Enabling the compiler can improve performance but manual memorization is still necessary for optimal results. There are risks of overreliance and messy code, but the compiler can be used file by file or folder by folder with thorough testing. Practice makes incredible cats. Thank you, Nadia!
El Futuro de las Herramientas de Rendimiento
JSNation 2022JSNation 2022
21 min
El Futuro de las Herramientas de Rendimiento
Top Content
Today's Talk discusses the future of performance tooling, focusing on user-centric, actionable, and contextual approaches. The introduction highlights Adi Osmani's expertise in performance tools and his passion for DevTools features. The Talk explores the integration of user flows into DevTools and Lighthouse, enabling performance measurement and optimization. It also showcases the import/export feature for user flows and the collaboration potential with Lighthouse. The Talk further delves into the use of flows with other tools like web page test and Cypress, offering cross-browser testing capabilities. The actionable aspect emphasizes the importance of metrics like Interaction to Next Paint and Total Blocking Time, as well as the improvements in Lighthouse and performance debugging tools. Lastly, the Talk emphasizes the iterative nature of performance improvement and the user-centric, actionable, and contextual future of performance tooling.

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 🤐)
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.
Next.js 13: Estrategias de Obtención de Datos
React Day Berlin 2022React Day Berlin 2022
53 min
Next.js 13: Estrategias de Obtención de Datos
Top Content
Workshop
Alice De Mauro
Alice De Mauro
- Introducción- Prerrequisitos para la masterclass- Estrategias de obtención: fundamentos- Estrategias de obtención – práctica: API de obtención, caché (estática VS dinámica), revalidar, suspense (obtención de datos en paralelo)- Prueba tu construcción y sírvela en Vercel- Futuro: Componentes de servidor VS Componentes de cliente- Huevo de pascua de la masterclass (no relacionado con el tema, destacando la accesibilidad)- Conclusión
Depuración del Rendimiento de React
React Advanced 2023React Advanced 2023
148 min
Depuración del Rendimiento de React
Workshop
Ivan Akulov
Ivan Akulov
Los primeros intentos de Ivan en la depuración de rendimiento fueron caóticos. Veía una interacción lenta, probaba una optimización aleatoria, veía que no ayudaba, y seguía probando 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. Hacía una grabación en Chrome DevTools o React Profiler, la examinaba, intentaba hacer clic en cosas al azar, y luego la cerraba 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 cómo 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, cubriremos el rendimiento de interacción, no la velocidad de carga, por lo que no escucharás una palabra sobre Lighthouse 🤐)
Comenzando con Suspense y Renderizado Concurrente en React
React Summit 2020React Summit 2020
125 min
Comenzando con Suspense y Renderizado Concurrente en React
Workshop
Maurice de Beijer
Maurice de Beijer
React sigue evolucionando y haciendo que las cosas difíciles sean más fáciles para el desarrollador promedio.
Un caso en el que React no era particularmente difícil pero muy repetitivo, es trabajar con solicitudes AJAX. Siempre hay una trinidad de estados de carga, éxito y posibles errores que deben manejarse cada vez. Pero ya no, ya que el componente `<Suspense />` facilita mucho la vida.
Otro caso es el rendimiento de aplicaciones más grandes y complejas. Por lo general, React es lo suficientemente rápido, pero con una aplicación grande, la renderización de componentes puede entrar en conflicto con las interacciones del usuario. El renderizado concurrente se encargará de esto, en su mayoría de forma automática.
Aprenderás todo sobre cómo usar <Suspense />, mostrar indicadores de carga y manejar errores. Verás lo fácil que es comenzar con el renderizado concurrente. Harás que el suspense sea aún más capaz combinándolo con el renderizado concurrente, el gancho `useTransition()` y el componente <SuspenseList />.
Construyendo aplicaciones web que iluminan Internet con QwikCity
JSNation 2023JSNation 2023
170 min
Construyendo aplicaciones web que iluminan Internet con QwikCity
WorkshopFree
Miško Hevery
Miško Hevery
Construir aplicaciones web instantáneas a gran escala ha sido elusivo. Los sitios del mundo real necesitan seguimiento, análisis y interfaces y interacciones de usuario complejas. Siempre comenzamos con las mejores intenciones pero terminamos con un sitio menos que ideal.
QwikCity es un nuevo meta-framework que te permite construir aplicaciones a gran escala con un rendimiento de inicio constante. Veremos cómo construir una aplicación QwikCity y qué la hace única. El masterclass te mostrará cómo configurar un proyecto QwikCity. Cómo funciona el enrutamiento con el diseño. La aplicación de demostración obtendrá datos y los presentará al usuario en un formulario editable. Y finalmente, cómo se puede utilizar la autenticación. Todas las partes básicas para cualquier aplicación a gran escala.
En el camino, también veremos qué hace que Qwik sea único y cómo la capacidad de reanudación permite un rendimiento de inicio constante sin importar la complejidad de la aplicación.