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 venga en React 18, es más como una característica concurrente incremental.
Sobre mí, soy Sudhanshu Yadav, trabajo en Proficy como arquitecto de front end, he sido autor de Brahmos, la biblioteca de React, y también he liberado muchos otros herramientas. Soy un fanático interno, y me encanta discutir los internos de la biblioteca 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 de React o cualquier aplicación en general. La razón más importante por la que existe la característica concurrente es para proporcionar una mejor experiencia personal. Ahora, muchas bibliotecas se centran en mejorar el rendimiento de la biblioteca en sí, lo cual debería ser la prioridad, pero a veces esas mejoras no son notables por el usuario, y si un usuario no siente que tu aplicación es fluida, entonces tu aplicación no es fluida. Deberían percibir tu aplicación como fluida.
Hay un problema con los patrones actuales, que se trata de mejorar la experiencia personal. Tienen un buen contexto en la aplicación, pero no tienen control sobre tu fase de renderizado. Debido a lo cual esos patrones no pueden usar efectivamente los recursos. Con las características concurrentes, se permite usar efectivamente todos los recursos disponibles mientras se mantiene la aplicación receptiva. Las características concurrentes también habilitan el renderizado en segundo plano y eso permite muchas cosas como suspender un renderizado, pausarlo, reanudarlo, o como agrupar renderizados juntos. Muchas cosas. Y también elimina una parte difícil de la longitud del usuario, que es orquestar todo el proceso de renderizado. Proporciona APIs declarativas que pueden ayudarte a construir, definir más los órdenes, 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 como si quiero que las mejores cosas obtengan un pre-renderizado de algo o cargar algo de manera diferida. Todas esas cosas se pueden hacer de una manera más declarativa.
Ahora 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 la división de tiempo. Para entender la división de tiempo, veamos un árbol de React aquí todos los nodos, puedes pensar en un componente que toma un poco de tiempo para procesar y cómo sucedería la actualización como cambias un estado en cualquier componente y luego desencadenará un re-renderizado en ese componente que internamente desencadenaría el re-renderizado de sus hijos y todas estas cosas sucederán de manera asincrónica de una sola vez. Y una vez que encuentras qué cambios son necesarios para el DOM real, después de conocer esos cambios, comprometes 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 es de 16 milisegundos y tienes 16 milisegundos para ejecutar, ni siquiera realmente 16 milisegundos, menos que eso, para ejecutar, para hacer todas las cosas de JavaScript. Así que, 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 retroalimentación de la entrada del usuario, animaciones o cualquier cosa. Ahora, si tu JavaScript es grande y se extiende a través de múltiples fotogramas, entonces ¿qué pasará si hay una tarea del navegador en el medio? Tiene que esperar hasta que todas las tareas de JavaScript hayan terminado. Así que básicamente, tu aplicación se entrecortará un poco porque habrá caídas de fotogramas. Así que con la división de tiempo, la idea es que tienes un gran trabajo, así que divide ese gran trabajo en unidades de trabajo. Y después, como procesar unidad por unidad y después de cada unidad, verificar si el navegador tiene algo que hacer y básicamente dar un espacio de respiración para el navegador. Con eso digamos que si una tarea del navegador viene en el medio, puede encajar fácilmente en tu lado de renderizado como puede encajar fácilmente entre tu tarea de Javascript.
Comments