En esta charla, hablaré sobre el modo concurrente, más sobre mi modelo mental hacia las características concurrentes. Así que no hay un modo concurrente como tal que llegue en el React 18, es más como una característica concurrente incremental.
Sobre mí, soy Sudhanshu Yadav, trabajo en Proficy como arquitecto de front-end, soy el autor de Brahmos, la biblioteca React, y también he compartido muchas otras herramientas de código abierto. Soy un fanático de los internos y me encanta discutir los detalles internos de las bibliotecas que uso, me gusta hacer teorías al respecto, puedes encontrarme en Twitter o puedes revisar mi proyecto en GitHub.
Antes de comenzar, entendamos por qué necesitamos el modo concurrente, qué significa para una aplicación React o cualquier aplicación en general. La razón más importante por la que existe la característica concurrente es proporcionar una mejor experiencia personal. Muchas bibliotecas se centran en mejorar el rendimiento de la biblioteca en sí, lo cual debería ser una prioridad, pero a veces esas mejoras no son perceptibles para el usuario, y si un usuario no siente que su aplicación es fluida, entonces su aplicación no es fluida. Deberían perseguir que su aplicación sea fluida.
Hay un problema con los patrones actuales que se centran en mejorar la experiencia personal. Tienen un buen contexto en la aplicación, pero no tienen control sobre la fase de renderizado. Debido a esto, esos patrones no pueden utilizar eficazmente los recursos. Con las características concurrentes, se permite utilizar eficazmente todos los recursos disponibles mientras se mantiene la aplicación receptiva. Las características concurrentes también permiten el renderizado en segundo plano y eso habilita muchas cosas como suspender un renderizado, pausarlo, reanudarlo o agrupar renderizados juntos. Muchas cosas más. También elimina una parte difícil de la longitud del usuario, que es orquestar todo el proceso de renderizado. Proporciona API declarativas que pueden ayudarte a construir, definir más el orden, dar una pista a React o a la aplicación como una biblioteca de que esta es la forma en que quiero que sea mi secuencia de renderizado, o si quiero que las mejores cosas obtengan una pre-renderización o cargar algo de forma perezosa. Todas esas cosas se pueden hacer de una manera más declarativa.
Definitivamente, la característica concurrente tiene mucho alcance, pero ¿qué habilita las características concurrentes? Y el primer y más importante patrón, diría yo, es el time slicing. Para entender el time slicing, veamos un árbol de React aquí, todos los nodos, puedes pensar en un componente que tarda un poco en procesar y cómo se produciría una actualización, como cambiar un estado en cualquier componente y luego desencadenará un nuevo renderizado en ese componente que internamente desencadenará un nuevo renderizado de sus hijos y todas estas cosas sucederán de forma asíncrona de una vez. Y una vez que encuentres qué cambios son necesarios para el DOM real, después de conocer esos cambios, se aplican esos cambios al DOM real.
Ahora, veamos cómo se juega en una línea de tiempo de fotogramas. La mayoría de las bibliotecas intentan lograr 60 FPS y eso generalmente significa que tienes un fotograma que dura 16 milisegundos y tienes 16 milisegundos para ejecutar, incluso menos que eso, para hacer todas las cosas de JavaScript. Entonces, si tienes, hay dos tipos de tareas, tarea de JavaScript y tarea del navegador. La tarea de JavaScript sería como el procesamiento del componente, y la tarea del navegador sería como pintar en el navegador o dar una respuesta de la entrada del usuario, animaciones o cualquier cosa. Ahora, si tu JavaScript es grande y se extiende a través de varios fotogramas, ¿qué sucederá si hay una tarea del navegador en el medio? Tendrá que esperar hasta que se termine la tarea de JavaScript. Básicamente, tu aplicación se entrecortará un poco porque habrá caídas de fotogramas. Entonces, con el time slicing, la idea es que tienes un trabajo grande, así que divide ese trabajo grande en unidades de trabajo. Y después, procesa unidad por unidad y después de cada unidad, verifica si el navegador tiene algo que hacer y básicamente da un espacio de respiración para el navegador. Con eso, digamos que si una tarea del navegador llega en el medio, puede encajar fácilmente en tu lado de renderizado, puede encajar fácilmente entre tus tareas de JavaScript.
Comments