Comprendiendo la Arquitectura de Fibra de React

Rate this content
Bookmark

Hemos escuchado mucho sobre la Arquitectura de Fibra de React, pero parece que pocos de nosotros la entendemos a fondo (o tenemos tiempo para hacerlo). En esta charla, Tejas repasará su mejor intento de comprender la Fibra (revisado por otros expertos) y la presentará de una manera 'explicada como si tuviera cinco años'.

29 min
21 Oct, 2022

Video Summary and Transcription

Esta charla explora el argot interno de React, específicamente la fibra, que es una unidad interna de trabajo para renderizar y comprometer. Las fibras facilitan actualizaciones eficientes a los elementos y desempeñan un papel crucial en el proceso de reconciliación. El bucle de trabajo, el trabajo completo y la fase de compromiso son pasos esenciales en el proceso de renderizado. Comprender los aspectos internos de React puede ayudar a optimizar el código y las revisiones de solicitudes de extracción. React 18 introduce las funciones de bucle de trabajo sincrónico y asíncrono para características y priorización concurrentes. La fibra ofrece beneficios como el renderizado asíncrono y la capacidad de descartar árboles en progreso, mejorando la experiencia del usuario.

Available in English

1. Understanding React's Internal Jargon

Short description:

Bienvenidos de vuelta después del almuerzo. Esta charla trata sobre la jerga interna de React, específicamente el fiber. Fiber es una unidad interna de trabajo que React utiliza para renderizar y comprometer. No se expone a los usuarios, a diferencia de los elementos de React. Los elementos describen el estado deseado de la interfaz de usuario, mientras que los fibers son internos y efímeros. Trabajan juntos para construir aplicaciones excelentes.

Bienvenidos de vuelta después del almuerzo. Espero que estén listos para adentrarse en este congreso muy advanced. Permítanme comenzar diciendo que esta es una charla que nadie necesita escuchar. De verdad, nadie necesita escuchar esto. Espero que algunos de ustedes quieran escucharlo. ¿Quieren? De acuerdo. Pero nadie, porque aquí está la cosa, esto se trata de la jerga interna de React. Es algo que puede interesarles, como a mí, si tienen curiosidad. Pero no necesitan saber nada de esto para construir aplicaciones excelentes con React.

React es la mejor manera de construir interfaces de usuario en la web. Y no necesitan conocer los detalles internos para eso. ¿Quién quiere adentrarse en los detalles internos hoy solo por diversión? Sí, eso es correcto. Comencemos. Vamos a hablar de algo llamado fiber. No tengo mucho fiber en mi... Pero ¿qué es en el contexto de React? En pocas palabras, el fiber... Y por cierto, vamos a adentrarnos en la arquitectura del fiber en 20 minutos. ¡Imagínense eso! El fiber en React es una unidad única de trabajo. Hay una unidad única de trabajo que React realiza. Pueden estar pensando, ¿ok, qué es el trabajo? El trabajo es esencialmente renderizar sus cosas y mostrarlas en la pantalla. Renderizar y comprometer. El fiber es algo interno. Nuevamente, no necesitan saber nada de esto para construir excelentes aplicaciones con React. Y como tal, no se expone a los usuarios. Entonces, tal vez una forma más fácil de razonar sobre esto es pensar en algo que está expuesto y partir de ahí. ¿De acuerdo? ¿Qué está expuesto en React? El humilde elemento. Todos escribimos elementos de React. Escribimos un corchete angular con un nombre y eso llama a react.createElement. Y tenemos elementos. Los elementos son con los que trabajamos a diario. No voy a adentrarme en los elementos porque ya lo hice una vez. Esa fue una charla relativamente popular sobre los elementos de React y cómo existen y cómo se crean y todo eso. Siéntanse libres de ver eso en su tiempo libre. Pero lo que quiero hacer es comparar y contrastar elementos y fibers para que tengamos una idea de cómo trabajan juntos. Básicamente, lo que quiero resumir de esa charla en esta charla es que un elemento de React describe el estado deseado de la interfaz de usuario. Un elemento de React te permite describir, de manera declarativa, aquí está mi árbol de elementos de React. Esta es mi aplicación. Y luego React se encarga de hacer que eso sea verdad en un entorno de alojamiento. Entonces, en un navegador, en un dispositivo móvil con React Native, en una interfaz de línea de comandos con React, tus elementos describen lo que quieres. React hace que eso suceda. ¿Está claro? Genial. Entonces, ¿cómo entran los fibers en esta imagen? Para empezar, los elementos son públicos, lo que significa que son externos. Los escribimos. Pero los fibers son internos. No hablamos de ellos porque no necesitamos hacerlo. Hay un equipo completo que trabaja con ellos a diario por nosotros, en nuestro nombre, para que podamos construir aplicaciones excelentes. Los elementos son efímeros, por lo que no duran mucho. Puedes desechar elementos. Puedes crear nuevos.

2. Understanding Elements and Fibers

Short description:

Los elementos son efímeros, mientras que los fibers son estructuras de datos duraderas y con estado utilizadas por React para rastrear el comportamiento y la apariencia de la aplicación. Los fibers facilitan actualizaciones eficientes a los elementos, evitando el renderizado innecesario. La reconciliación es el proceso de alinear la descripción de la interfaz de usuario con el entorno de alojamiento, y los fibers desempeñan un papel crucial en esto.

Son solo una representación. Si hablas de DevOps, son como un manifiesto de Kubernetes. Simplemente describes el estado que deseas y luego un sistema lo hace realidad. O como un archivo de Terraform. ¿Hay personas de DevOps aquí? Oh, genial. Hola. Una persona.

Los elementos son efímeros. Los fibers son estructuras de datos duraderas y con estado que React utiliza para realizar un seguimiento de lo que tu aplicación debe hacer. Lo que deseas que haga y cómo deseas que se vea. Y esa es la propuesta de valor de React en general.

Entonces, la forma de construir interfaces de usuario eficientes y realizar actualizaciones adecuadas en tus elementos es que no los descartes y te den uno nuevo cada vez. ¿Puedes imaginar perder el estado de enfoque de entrada con cada pulsación de tecla? Desagradable. Los fibers facilitan eso. Y en tercer lugar, los elementos son inmutables. Es decir, no los modificas. Los descartas y creas nuevos. Pero los fibers son estructuras de datos duraderas, mutables y con estado utilizadas en el proceso de reconciliación. ¿Qué es la reconciliación? La reconciliación es cuando tomas un árbol de elementos, una descripción, una hoja de ruta de cómo deseas que se vea tu interfaz de usuario y cómo deseas que responda a los eventos y qué efectos deseas. Tomas esta lista de elementos y los reconcilias con un entorno de alojamiento. Ya sea el navegador, un dispositivo móvil o la CLI. Eso es la reconciliación. Básicamente, tomas tu descripción y la conviertes en la verdad. Los fibers son fundamentales en esto.

3. Understanding Fiber Loop and Rendering Process

Short description:

Ahora entendemos cómo los elementos se convierten en fibers y la interacción entre ellos. El trabajo se realiza en el bucle de fibers, que establece indicadores y completa el trabajo en el árbol de fibers. El trabajo completo construye nodos DOM en un estado separado y la fase de confirmación muestra todo en la pantalla. La capacidad de pausar e interrumpir el renderizado es el objetivo principal de Fiber.

Ahora, entendemos los elementos, entendemos los fibers, entendemos la reconciliación. ¿Cómo se convierten los elementos en fibers? ¿Se convierten en fibers? ¿Cuál es la interacción? Hay un código fuente de función. Gracias a Dios que React es de código abierto y con licencia MIT. Puedo simplemente ir a leer. Hay una función llamada crear fiber a partir de tipos y props. Podrías argumentar que simplemente se llama crear fiber a partir de elementos. Si has visto un elemento de React, es un objeto de JavaScript con propiedades de tipo, a veces propiedades de hijos. Puedes decir que un fiber se deriva casi de los elementos y luego es utilizado por el reconciliador de fibers. Entendemos la reconciliación, entendemos los fibers. Todo se une en el reconciliador de fibers para realizar el trabajo de construir tus interfaces de usuario.

El trabajo se realiza en lo que se llama el bucle de fibers. Piénsalo como un bucle de juego. Cuando hay trabajo por hacer, comienzas un bucle en la parte superior de tu árbol de fibers. Comienzas el trabajo. Estos son nombres de funciones en el código fuente. Comienzas el trabajo en el nodo más superior. Y lo que hace el comienzo del trabajo es establecer indicadores. ¿Debería actualizarse esta cosa? ¿Qué ha cambiado? Establece una serie de indicadores. Y cuando termina, pasa al siguiente nodo en tu árbol. Y el trabajo comienza en ese. El siguiente siendo el hijo. El comienzo del trabajo establece algunos indicadores en eso. Si hay un hijo, simplemente sigue bajando, estableciendo indicadores hasta que no haya más hijos y luego, ¿qué sucede? Trabajo completo. Ahora, el trabajo completo hace algo más. También pasará al siguiente hermano como el siguiente. No el hijo. Si hay un hermano. Y luego sube por el árbol, completando el trabajo. El trabajo completo construye nodos DOM, pero no en el DOM, en un estado separado. Entonces no ves nada de esto en tu pantalla. Básicamente, conecta nodos entre sí. Y finalmente tienes la fase de confirmación. Que es poner todo en la pantalla. Así que hasta que se confirme la raíz, nada sucede en la pantalla. Y la razón de esto es que si el trabajo de renderizado necesita interrumpirse o pausarse, no ocurre mientras el usuario está viendo cosas suceder. Puedes descartar un árbol y recrearlo fuera de la pantalla y luego confirmarlo finalmente. Esa es la idea principal de Fiber, la capacidad de pausar e interrumpir el renderizado y priorizar las actualizaciones. Algunas tienen alta prioridad, otras tienen baja prioridad. Pero he estado hablando demasiado y sinceramente no me gusta diseñar diapositivas. Así que simplemente dibujemos un diagrama y veamos algo de código. ¿Está bien? ¿Tengo permiso? De acuerdo. Eso es genial. Un aplauso. Vamos a hacer esto. Así que tengo Excalidraw. Un saludo. ¿A quién le gusta Excalidraw? Sí. Increíble. Vizhou, gracias por esta herramienta. Así que vamos aquí.

4. Dibujando el Árbol de Elementos y la Reconciliación de Fibers

Short description:

Dibujamos un árbol de elementos, que incluye un main, H1, div, span y button. El reconciliador de fibers mantiene dos árboles: el árbol actual y el árbol en progreso. Cuando se hace clic en el botón de suma, el reconciliador de fibers actualiza el árbol en progreso de manera independiente y luego realiza los cambios. Comienza con el nodo main, establece indicadores y recorre el árbol, marcando actualizaciones y completando el trabajo.

Y lo que vamos a hacer es dibujar un árbol de elementos. Así que tenemos un main. Como hijo de main, digamos que tenemos un H1. En realidad, pongamos un div. Sopa de div. Mi desayuno favorito. H1. Y tenemos algunos hermanos para H1. Así que digamos que aquí tenemos un span y un button. De acuerdo. ¿Hay un reloj? Realmente no sé cómo voy de tiempo. Pero eso está bien. No me muestres el reloj.

Entonces, bien, tenemos un H1. Y estos también tienen algo de texto debajo de ellos. Así que H1, digamos que esto es hola mundo así. El span, digamos que esta es una aplicación de contador donde simplemente dibujamos cosas. Y, por supuesto, digamos que esto es solo un contador unidireccional. Todo lo que puedes hacer es incrementar. Si pudiera hacer eso con mi salario, estaría muy feliz. Genial. Así que este es un árbol de, digamos, elementos, digamos cinco, lo que sea, solo un árbol.

¿Cómo funciona el reconciliador de fibers? Ahora, en cualquier momento dado, el reconciliador de fibers mantiene dos árboles. Entonces, paso uno, vamos a duplicar esto. Vamos a duplicar este árbol. Primero, vamos a envolverlo en una bonita cajita, vamos aquí, y luego vamos a duplicar todo esto. Así que simplemente boom, segundo árbol, clon, vamos. Ahora tenemos dos árboles. El primero se llama el árbol actual, el segundo, vamos a llamarlo el árbol en progreso. Y aquí es donde se realizará gran parte del trabajo de renderizado. Ahora la pregunta, ¿qué haría el reconciliador de fibers si yo hago clic en el botón de suma e incremento el contador? Eso es de lo que quiero hablar. ¿Y cómo lo hace? Así que hago clic en más. Lo que sucede es que trabajamos en el árbol en progreso de una manera independiente del entorno host, el navegador, hacemos cualquier actualización y luego lo confirmamos. Y así es como sucede. Cuando hacemos clic en el botón, comenzamos el trabajo, por así decirlo. Y así llamamos a comenzar el trabajo en el nodo más superior, que es el main, y esto simplemente establecerá algunos indicadores, lo marcará como que esta cosa necesita actualizarse o tal vez no. En este caso, no sé si lo hace porque su contenido está cambiando, pero de todos modos. Comenzar el trabajo establece algunos indicadores. Y cuando termina, pasa al div, comienza el trabajo en el div. Lo mismo, marca cualquier actualización requerida. Solo dile a react cuál es el estado. Y luego, cuando eso termine, pasa al hijo aquí, h1. Lo mismo. Comienza el trabajo, márcalo para actualizaciones, continúa. Ahora, aquí no hay hijos. ¿Qué sucede? Completamos el trabajo. No hay hijos. No hay más hijos para entrar. Llamamos a una función llamada completar el trabajo y si no hay hermanos, volvemos al árbol. Si hay hermanos, vamos al hermano.

5. Comprendiendo el Trabajo y la Implementación de Fiber

Short description:

Completamos el trabajo en el árbol de fibers marcando el trabajo completo y moviéndonos al hermano. Después de completar el trabajo en los hijos, volvemos a la raíz. El trabajo completo construye un árbol separado de elementos DOM y conecta todo. El trabajo en progreso se muestra en la pantalla utilizando el nodo raíz de fiber. Cuando el ciclo de trabajo termina, pasamos a la fase de confirmación, donde se ejecutan los efectos y se actualiza la interfaz de usuario. La implementación de Fiber se puede entender al observar el código y la estructura del árbol.

Aquí completamos el trabajo. ¿Cómo marco el trabajo completo? Simplemente voy a decir que el trabajo completo está volviendo de esta manera. Y luego ir al hermano. Aquí al span. Comenzamos el trabajo en el span. ¿Tenemos hijos? ¿No los tenemos? Tenemos nodos de texto y esto probablemente se interpola, así que esto cuenta como un hijo. Entonces, comenzar el trabajo irá allí, trabajo completo porque no hay hijos, regresamos y simplemente caminamos. Caminamos, caminamos, caminamos. Y después de terminar con estos hijos, completamos el trabajo en los que aún no han completado el trabajo. Entonces lo llamaremos trabajo completo y volveremos a la raíz. Ese es el ciclo.

¿Qué hace el trabajo completo? Comenzar el trabajo establece indicadores, el trabajo completo construye un árbol separado de elementos DOM, pero no en el navegador. Eso son props. Construye este árbol, construye, conecta todo. Y luego hemos terminado. Aquí es donde estamos. El siguiente paso es poner esta cosa de trabajo en progreso en la pantalla. Para hacer eso, react tiene una estructura interna oculta llamada un nodo raíz de fiber. No ves esta cosa, pero existe. Y en el momento en que tu aplicación se monta, apuntará al árbol actual. Esto es antes de las actualizaciones. Esto es el estado. Pero luego, cuando el ciclo de trabajo termina, cuando el trabajo completo termina en la última cosa, terminamos el trabajo de renderizado y pasamos a la fase de confirmación. Confirmamos en el entorno principal del host, el navegador, al cambiar el puntero. Ahora eso es la fuente de verdad. Y también la fase de confirmación ejecutará cualquier efecto. Hay diferentes tipos de efectos. Hay efectos de host, que es literalmente como adjuntar los nodos DOM al navegador. Hay efectos pasivos, que son tus llamadas de useEffect y Entonces los efectos se ejecutan, el nodo DOM, tanto el efecto pasivo como el de host se ejecutan en la confirmación y luego se actualiza la interfaz de usuario. Así es como funciona Fiber. Por diagrama. ¿Genial?

¿Cómo funciona Fiber en código? Vamos, realmente no sé cómo voy de tiempo. Solo vamos a mirar el código, lo que sea. No veo un reloj. Cuando enciendas un reloj, me detendré. ¿Cómo funciona esto en código? Abramos el código y lo que voy a hacer es simplemente abrir el código y ejecutaremos yarn parcel index. ¿Adivina qué? Construí esta aplicación de contador, esta aquí, la construí como una demostración solo por diversión, ¿de acuerdo? Voy a abrir esto aquí y lo que tenemos es esto, que es literalmente lo mismo que esto. De hecho, si abrimos el código, ¿abrimos el código? Entonces, si abrimos el código, mira este árbol. Es literalmente main div, H1, span, button. Es la misma estructura, ¿de acuerdo? Pero en código. Si has escrito react, esto te resultará familiar. Si abrimos esto ahora, está abierto. ¿Cómo abro? De acuerdo. Esto funciona como esperas. Vamos al código fuente de react DOM y juguemos. Puedes decir que realmente no me gustan las diapositivas. Me gusta jugar. Así que lo que haremos es ir aquí. Literalmente node modules. Uh-oh.

6. Explorando el Desarrollo de React DOM

Short description:

Nos adentraremos en el desarrollo de React DOM. El código fuente está empaquetado, pero es más fácil de leer en GitHub. Vamos a explorar el ciclo de trabajo sincrónico y sus funciones. La unidad de trabajo realiza un seguimiento del estado y la función begin work envuelve otra función. La fibra actual se compara pero nunca se modifica, mientras que la fibra en progreso es con la que trabajamos.

Nos adentraremos. ¿Dónde está el DOM de React? Ahí está. ¿Common JS? ¿Dónde está? Desarrollo de React DOM. Estamos aquí. Estamos aquí, todos. Hemos ingresado. Mira esto. El número de regiones plegables está limitado a un máximo de 5,000. No es tan complejo. Solo está empaquetado. El código fuente está mucho menos empaquetado para las cosas. Es más fácil de leer en GitHub. Queremos comenzar con el ciclo de trabajo sincrónico. Eso es lo que teníamos en nuestro diagrama. Vamos a buscarlo. Lo tenemos. ¿Qué hace esta función? Vamos a la definición. Entonces, mientras haya trabajo por hacer, realízalo. Es declarativo. Me encanta. ¿Qué hace eso? Vamos más profundo. Es como el tema del pez. Este pez, queremos encontrar el pez. Si crees eso, tuitea `encuentra el pez`. De todos modos, realiza la unidad de trabajo. ¿Qué hace esto? Almacena algún estado. Si estamos en modo perfilado. No estamos en modo perfilado. Estamos en begin work. Vamos más profundo. ¿Qué es begin work? Es una función que envuelve otra función. Vamos a esta. Comenzar el trabajo. Hemos llegado a la zona. Hay tres argumentos. Ese es el que está en el entorno principal. No lo tocamos. Lo pasamos por ahí. La fibra actual la enviamos aquí, la enviamos allá. La comparamos. Nunca la modificamos. No lo es. Pero la fibra en progreso es con la que trabajamos porque es trabajo en progreso. Así que comencemos con console. Log. Veamos una fibra. Todos, están a punto de ver una fibra. Trabajo en progreso. Hagamos esto. Ahora abramos esto.

7. Comprendiendo Begin Work y Complete Work

Short description:

Vamos a la consola. Estamos trabajando en el nodo raíz de la fibra, que es la cosa oculta de la que hablamos. Begin work compara las props antiguas con las nuevas o los cambios de contexto y establece banderas para las actualizaciones. Complete work sigue un proceso similar y completamos el trabajo en el nodo raíz de la fibra.

Vamos a la consola. Bueno, ahí lo tenemos. Permíteme aumentar el tamaño de fuente para ti. ¿En qué? El nodo de estado es en lo que estamos trabajando. Así que estamos trabajando en el nodo raíz de la fibra. Eso es esa cosa oculta de la que hablamos en el diagrama. Comenzamos el trabajo un nivel más abajo en el componente de la aplicación, uno más abajo en el principal. Esto es cómo se ve una fibra, por cierto. El nodo de estado es el elemento real que tiene estado. El nodo con estado. Puedes ver literalmente cómo comienza el trabajo y recorre el árbol. Así que principal, div, span. Comienza el trabajo descendiendo. Y veamos qué hace exactamente begin work. Esto es una cosa interna de debug. No hablaremos de eso. Pero si el nodo actual no es nulo, es decir, si el nodo actual en el entorno de host existe, ¿entonces qué? Es una actualización. No una inserción. ¿De acuerdo? Entonces, en la ruta de actualización, esto es lo que hace begin work. Comparamos las props antiguas con las nuevas o si ha cambiado el contexto. Establecemos algunas banderas. Y si me desplazo, solo estamos estableciendo banderas, asegurándonos de que el reconciliador sepa que esta cosa necesita actualizarse o no. Eso es todo. A medida que nos desplazamos hacia abajo, tenemos un gran switch case para diferentes tipos de componentes, componentes diferidos, componentes de función, componentes de clase, límites de suspense, etc., que simplemente los marca como que esta cosa necesita actualizarse. A medida que nos desplazamos más allá del gran switch case, finalmente llegamos a un error donde la unidad dice: no sé qué estás intentando hacer, pero no puedo trabajar en esta cosa. Y eso es begin work. Ahora veamos complete work. Volvamos al árbol. Complete work, como puedes ver, tiene la misma firma, las render lanes son una preocupación de programación que está fuera del alcance de esta charla, así que no lo abordaremos. Todavía tenemos la fibra actual, la fibra en progreso. Por si acaso, registremos este trabajo en la fibra de complete work. Y simplemente hagamos un console log de la fibra en progreso aquí. Y ahora cuando esto se recargue, veremos, oh mira, se volvió más complejo. Así que begin work. Begin work. Seguimos comenzando el trabajo hasta llegar a H1, ¿verdad? Ahora H1 no tiene hijos. H1 es un hermano. Si miramos el árbol DOM aquí, H1, no más hijos. Un nodo de texto, pero eso no es un elemento. Es solo texto. Así que comenzamos el trabajo en H1. Como puedes ver aquí, el tipo de elemento es H1. Y lo completamos de inmediato. Comenzamos el trabajo en el span, pero nota que aquí hay más hijos porque tengo esta interpolación aquí. De acuerdo, así que se tratan un poco diferente. Pero comenzamos el trabajo y si no hay hijos, completamos el trabajo. Y finalmente completamos el trabajo en el botón, el div, el principal, el componente de la aplicación. Por último, completamos el trabajo en el nodo raíz de la fibra también. Y luego, aquí puedes ver, el nodo de estado es la fibra

8. Comprendiendo Complete Work y Fase de Commit

Short description:

Exactamente. Eso es esa cosa invisible. Ese interruptor es un puntero. Un componente de host es un componente en el entorno de host. Para React DOM, el entorno de host es el DOM. En un componente de host, se propagan las propiedades. Complete work construye el nodo DOM, lo adjunta al padre, lo mueve hacia arriba. Luego cambiamos a la fase de commit llamando a commit root, que vacía los efectos pasivos y cambia el puntero.

Nodo raíz. Exactamente. Eso es esa cosa invisible. Ese interruptor es un puntero. Así que hemos visto, veamos qué hace complete work. Así que si volvemos aquí, es otro gran switch case. ¿Correcto? Para todos estos tipos de componentes, se propagan las propiedades. Y eso es exactamente lo que suena. Y quiero enfocarme aquí en una cosa específica llamada componente de host. Un componente de host es un componente en el entorno de host. ¿Para React DOM, cuál es el entorno de host? Es el DOM. El navegador. En un componente de host, ¿cómo se completa el trabajo? Así es cómo. Se propagan las propiedades. Se verifica si se hidrató desde el renderizado del lado del servidor. Pero en este caso, no lo está. Estamos haciendo renderizado del lado del cliente. Cambiaremos a la otra rama. Vamos aquí. Y la instancia es crear instancia. ¿Sabes qué es eso? Vamos un nivel más profundo. Crear instancia es básicamente un documento que valida algunos anidamientos y llama a crear elemento. Y ahora estamos en lo que hace complete work. Básicamente está creando un elemento, como desvinculado del navegador, pero aún está construyendo un árbol. Complete work construye el nodo DOM, lo adjunta al padre, lo mueve hacia arriba. De acuerdo. Simplemente recorre el árbol. Y puedes ver eso. Añadimos todos los hijos, establecemos el nodo de estado en la instancia y marcamos algunas actualizaciones, etc., y simplemente seguimos en el switch case. Complete work eventualmente llega al nodo raíz y se termina el renderizado. Luego cambiamos a la fase de commit. Ponemos cosas en la pantalla. Cambiamos. Si volvemos al diagrama, lo que es la fase de commit, si recuerdas, es cambiar el puntero, así. ¿Cómo cambiamos el puntero? Hay una función llamada commit root. Sí, esa es la que es. Vamos a profundizar en esto y ver. Lo que quiero hacer es console.log, commit root. Y registraremos el nodo raíz aquí, pero preferiblemente así. Guardar. Ahora ves, hemos confirmado el nodo raíz. Literalmente solo cambia el puntero. Este es el nodo raíz de la fibra que estás viendo. Cada vez que llamo a esto, hace lo mismo una y otra vez muy, muy rápido. ¿Qué hace commit root? Vacia los efectos pasivos. Un efecto pasivo, mira, hay incluso una explicación aquí. Un efecto pasivo no es un efecto de host. No es como adjuntar cosas al DOM. En los efectos de host, hay diferentes tipos. Hay un efecto de inserción, hay un efecto de colocación, hay un efecto de actualización, estos efectos implican literalmente mutar el DOM y hay efectos pasivos que son efectos de cero componente. Así que vaciamos esas cosas, marcamos algunos eventos y finalmente cambiamos el puntero aquí.

9. Internos de React y Comprendiendo el Código

Short description:

Así que simplemente ejecutamos, hay muchos efectos en ejecución, realmente muchos efectos que se están comprometiendo. Pero en algún momento, lo que verás es que cambiamos los árboles del actual al trabajo en progreso. Los internos de React son complejos, pero los externos son poderosos debido a eso. Comprender los internos me ha ayudado en casos de revisiones de solicitudes de extracción donde tenemos debates o algo así. Me mantengo alejado de las micro-optimizaciones porque sé lo que está sucediendo. Ayuda a determinar cuánto debo optimizar.

Así que simplemente ejecutamos, hay muchos efectos en ejecución, realmente muchos efectos que se están comprometiendo. Pero en algún momento, lo que verás es que cambiamos los árboles del actual al trabajo en progreso. Y también llamamos a un hook. ¿Qué sucede cuando termina? Eventualmente, marcamos la confirmación como detenida y termina donde todas las últimas cosas terminan. Así que lo que quiero mostrarte con esto es, uno, cómo funciona con el ciclo, pero también que hay muchos casos especiales, hay muchas cosas que React resuelve por ti y que no necesitas resolver tú mismo, y esa es toda la propuesta de valor, ¿cómo actualizamos la interfaz de usuario de manera rápida, predecible y de una manera que nos permita construir aplicaciones rápidamente, sin preocuparnos demasiado por los internos? ¿Está bien? Muy bien. Hablemos de lo que aprendí. ¿Qué podemos aprender de esta charla? Podemos aprender que los internos de React son complejos, pero los externos son poderosos debido a eso. Como, podemos construir todos esos casos especiales, esos enormes casos de cambio que viste, nuestro trabajo que el equipo hace en nuestro nombre, para que no tengamos que hacerlo nosotros, para que React pueda tener un entorno realmente bueno para construir aplicaciones de manera poderosa y rápida. Dicho esto, los internos son divertidos. Y mi conclusión para ti es recordar, hey, escucha, React, he escuchado a mucha gente decir que React es demasiado difícil o demasiado complejo, como los internos. Toda esta charla que preparé fue leyendo el código fuente en GitHub porque es de código abierto e intentando participar, y de hecho, ahora estoy participando, supongo, hablé con algunos miembros del equipo que son muy acogedores y solidarios, y es un ecosistema. Así que mi conclusión es que estoy agradecido de ser parte de este ecosistema y espero que tú también te sientas animado a hacerlo. React Advanced London, muchas gracias por el tiempo. Gracias, gracias, gracias. Por favor, deja tu computadora portátil y sígueme a la sala de interrogatorios. Uh-oh. Sí. Estoy a punto de ser interrogado. Estás en problemas, joven. No, gracias, eso fue una inmersión profunda. Realmente estás cumpliendo tus promesas y el nombre de esta conferencia. ¿Soy un pez? ¿Eres un pez? ¿Quieres ser un pez? ¿Ser un pez es algo bueno? Hay un superhéroe en este programa llamado The Boys que es un pez. The Deep, de todos modos. Sí, Aquaman es subestimado, esa es mi opinión. Esa es mi opinión. ¿Deberíamos hablar más de eso? No, está bien. Vamos a las preguntas del público. La primera pregunta del público es, ¿de qué manera has descubierto que una comprensión más profunda de React bajo el capó ha informado o cambiado el código que escribes? Me gusta mucho esta pregunta. Me gusta mucho esta pregunta. Así que en pequeñas cosas. Y no puedo enfatizar lo suficiente lo importante que es no preocuparnos demasiado por los internos. Hay personas bien pagadas para hacer eso por nosotros, ¿verdad? Y lo hacen bien por nosotros para que no tengamos que hacerlo, y el enfoque es usar React. Y ese es el enfoque. No necesariamente entender los internos. Pero comprender los internos me ha ayudado en casos de revisiones de solicitudes de extracción donde tenemos debates o algo así, podemos mirar el código y puedo enseñar y orientar. Creo que ayuda. Pero también me mantengo alejado de las micro-optimizaciones porque sé lo que está sucediendo. No necesito poner todo en useMemo. No necesito hacer que todos mis componentes sean lazy. Me ayuda a determinar cuánto debo optimizar porque sé cuánta optimización se está haciendo por mí detrás de escena, así que definitivamente. Quiero agregar mi propia pregunta a eso. Recuerdo cuando solíamos trabajar con herramientas más simples que no eran tan poderosas, pero también eran más simples. En un momento, creo que recordaba la mayor parte del código fuente de Backbone de memoria. Ahora, con estas herramientas que usamos actualmente, la complejidad es demasiado para un programador de productos en funcionamiento para poder analizar. Entonces, ¿cuánto crees que es importante, a medida que te vuelves, digamos, más senior en una organización, tener a una persona en un equipo que comprenda estas herramientas? ¿O es simplemente una pérdida de tiempo? No sé si es una pérdida de tiempo, porque creo que una parte importante de ser un ingeniero senior es la capacidad de orientar. Hay una sala de habilidades blandas, ¿verdad? Realmente quiero asistir a eso porque siento que eso es en realidad más importante que el propio código a veces. Y creo que si hay al menos una persona que tiene un conocimiento profundo allí, pueden usarlo para educar e informar. Y hay muchos patrones en esta base de código de los que puedo aprender personalmente.

10. React 18 y el Ciclo de Trabajo

Short description:

Las funciones work loop sync y work loop async en React 18 facilitan características concurrentes y un sistema de prioridades. Aunque el código mostrado todavía está en React 18 y no ha cambiado, es posible que work loop async se convierta en el valor predeterminado en el futuro. Si se elimina un elemento directamente a través del objeto document, puede haber problemas con el reconciliador de React. Se recomienda utilizar refs en su lugar. XcaliDraw es la herramienta de dibujo utilizada, pero también hay otras alternativas excelentes como tlDraw y stately.ai.

Solo como ejemplo, ¿verdad? Esta función se llama work loop sync. Mientras haya trabajo por hacer, haz el trabajo. Esta forma de estructurar el código es algo que puedo aprender y luego enseñar a mi equipo. Así que no creo que sea inútil. También creo que si eres una empresa en esta economía, es algo bueno tener. Pero no creo que sea obligatorio. Genial. La siguiente pregunta principal es, ¿React 18 cambió algo en este algoritmo? Esa es una buena pregunta. Lo que estaba usando, estoy bastante seguro, era React 18. ¿Es React 18 la última versión? Eso fue React 18, así que no tal vez, pero hay... Así que había un work loop sync del que hablé. También hay un work loop async. Esa es la característica concurrente. Y eso utiliza, hasta donde sé, aquí es donde se pone complicado, pero eso utiliza un planificador en el fondo que literalmente calculará qué actualización tiene alta prioridad, cuál no, y el objetivo principal de Fiber es ser interrumpible. Cambiar de work loop sync a work loop async facilitará muchas de estas características concurrentes donde ahora hay un sistema de prioridades y un planificador para ellas. El código que mostré todavía está en React 18 y no ha cambiado, pero en algún momento, sospecho que work loop async será el valor predeterminado y work loop sync será el respaldo. Sí, espero que el próximo año puedas volver y dar una charla sobre el planificador asíncrono. Sí. Creo que esa es la parte que todavía es un poco de magia negra para mí. Entiendo que funciona, pero no estoy seguro de cómo en absoluto. Me está dando ideas para mi próxima charla. ¿Quieres ver eso? No. No. Yo tampoco. Yo tampoco. Pero eso fue ese tipo. Deberías hablar con él después. Sí. De acuerdo, pregunta principal. Sigamos el orden democrático. Esto se siente casi como una pregunta de entrevista de trabajo. Si se elimina un elemento directamente a través del objeto document, por lo que supongo que manipulando el DOM, ¿existe la posibilidad de causar una fuga de memoria ya que Fiber mantiene la referencia? No sé cómo Fiber mantiene las referencias. No he investigado eso, pero sí. Conoces el reconciliador de pila antes del de Fiber. Así solía ser, ¿verdad? Las cosas se mutaban sobre la marcha. El problema con eso es que no puedes salir a mitad de camino. Si solo actualizas la mitad del DOM y llega una actualización de mayor prioridad, ¿qué haces? No puedes deshacerlo. ¿Deberías deshacerlo? No puedes. Se vuelve complicado. Así que si se elimina un elemento a través del objeto document directamente, básicamente vuelves a React como en la versión anterior a la 16, que fue deprecada por una razón. Y creo que si el elemento es mantenido por React mismo, creo que el próximo ciclo de trabajo se agregará o fallará de una manera indefinida. Así que eso probablemente es una mala idea y no deberías hacerlo. Utiliza refs. Sí. Eso también forma parte del trabajo completo, así como la actualización de refs. Genial. Pregunta principal, por supuesto, no qué fuente usaste, sino ¿cuál es el nombre de la herramienta de dibujo que utilizaste? XcaliDraw, la usé porque me gusta, pero hay otras alternativas excelentes como tlDraw y stately.ai. Excelente. Realmente no nos faltan herramientas increíbles aquí.

11. Diferencias y Beneficios de Fiber

Short description:

Fiber trae varias diferencias en comparación con las antiguas heurísticas de reconciliación. Permite el renderizado asíncrono, la programación y la capacidad de realizar trabajos a medias y descartar árboles en progreso. Esto no era posible con el antiguo reconciliador de pila, que a menudo bloqueaba las actualizaciones de baja prioridad de la entrada del usuario.

Genial. Tenemos tiempo para una o dos preguntas más. Permíteme responder a esta. ¿Qué diferencias trae Fiber en comparación con las antiguas heurísticas de reconciliación? Quiero decir, supongo que la capacidad de realizar renderizado asíncrono y todo eso es algo futuro, pero ¿hay algo más que te gustaría agregar? Creo que la programación, realmente. Esa es una gran diferencia. Como la capacidad de realizar trabajos a medias y luego descartar un árbol en progreso, eso es genial. Antes nunca se podía hacer eso. No había forma de hacer trabajos a medias, y por eso, debido a que no se podían hacer trabajos a medias de la forma anterior, el reconciliador de pila, creo que esa es la pregunta. Olvidé la pregunta. Estoy improvisando. No se pueden hacer trabajos a medias, así que lo que ocurría era que una actualización de baja prioridad, como algo relacionado con una imagen que tal vez no era importante, bloqueaba un problema de entrada del usuario. Y luego Dan Abramov dio esta charla en JSConf Iceland sobre CPU-bound y I O-bound, y yo estaba como, wow, eso es increíble. En fin. Genial. Muy bien. Hagamos una última pregunta. Creo que tenemos un par de preguntas sobre el mismo tema. Creo que esta es una pregunta muy razonable dada la cambio de terminología en general. Entonces, ¿cómo encaja el concepto de DOM virtual en este tipo de cosa de fiber? ¿Es el fiber el DOM virtual? ¿Cuál es la relación entre estos dos términos? Esa es una buena pregunta. Hasta donde sé, conocimiento falible. Hasta donde sé, el DOM virtual es simplemente una estructura virtualizada... es como una estructura de datos. Es solo una... es una representación clonada de tu DOM pero para que una biblioteca haga lo que quiera con ella y luego, ya sabes, seguimiento de cambios y diferencias y todo eso es separado hasta donde sé. Genial. Bueno, eso es todo el tiempo que tenemos en el escenario. Pero cualquiera que quiera hablar con Tejas puede encontrarlo en los pasillos o en la sala de preguntas y respuestas de los oradores a la que también puedes unirte a través del chat espacial si te estás uniendo de forma remota. Muchas gracias, Tejas. Demos a Tejas un último gran aplauso.

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

React Advanced Conference 2022React Advanced Conference 2022
25 min
A Guide to React Rendering Behavior
Top Content
React is a library for "rendering" UI from components, but many users find themselves confused about how React rendering actually works. What do terms like "rendering", "reconciliation", "Fibers", and "committing" actually mean? When do renders happen? How does Context affect rendering, and how do libraries like Redux cause updates? In this talk, we'll clear up the confusion and provide a solid foundation for understanding when, why, and how React renders. We'll look at: - What "rendering" actually is - How React queues renders and the standard rendering behavior - How keys and component types are used in rendering - Techniques for optimizing render performance - How context usage affects rendering behavior| - How external libraries tie into React rendering
React Summit Remote Edition 2021React Summit Remote Edition 2021
33 min
Building Better Websites with Remix
Top Content
Remix is a new web framework from the creators of React Router that helps you build better, faster websites through a solid understanding of web fundamentals. Remix takes care of the heavy lifting like server rendering, code splitting, prefetching, and navigation and leaves you with the fun part: building something awesome!
Remix Conf Europe 2022Remix Conf Europe 2022
23 min
Scaling Up with Remix and Micro Frontends
Top Content
Do you have a large product built by many teams? Are you struggling to release often? Did your frontend turn into a massive unmaintainable monolith? If, like me, you’ve answered yes to any of those questions, this talk is for you! I’ll show you exactly how you can build a micro frontend architecture with Remix to solve those challenges.
React Advanced Conference 2023React Advanced Conference 2023
33 min
React Compiler - Understanding Idiomatic React (React Forget)
React provides a contract to developers- uphold certain rules, and React can efficiently and correctly update the UI. In this talk we'll explore these rules in depth, understanding the reasoning behind them and how they unlock new directions such as automatic memoization. 
React Advanced Conference 2022React Advanced Conference 2022
30 min
Using useEffect Effectively
Top Content
Can useEffect affect your codebase negatively? From fetching data to fighting with imperative APIs, side effects are one of the biggest sources of frustration in web app development. And let’s be honest, putting everything in useEffect hooks doesn’t help much. In this talk, we'll demystify the useEffect hook and get a better understanding of when (and when not) to use it, as well as discover how declarative effects can make effect management more maintainable in even the most complex React apps.
React Summit 2022React Summit 2022
20 min
Routing in React 18 and Beyond
Top Content
Concurrent React and Server Components are changing the way we think about routing, rendering, and fetching in web applications. Next.js recently shared part of its vision to help developers adopt these new React features and take advantage of the benefits they unlock.In this talk, we’ll explore the past, present and future of routing in front-end applications and discuss how new features in React and Next.js can help us architect more performant and feature-rich applications.

Workshops on related topic

React Summit 2023React Summit 2023
170 min
React Performance Debugging Masterclass
Featured WorkshopFree
Ivan’s first attempts at performance debugging were chaotic. He would see a slow interaction, try a random optimization, see that it didn't help, and keep trying other optimizations until he found the right one (or gave up).
Back then, Ivan didn’t know how to use performance devtools well. He would do a recording in Chrome DevTools or React Profiler, poke around it, try clicking random things, and then close it in frustration a few minutes later. Now, Ivan knows exactly where and what to look for. And in this workshop, Ivan will teach you that too.
Here’s how this is going to work. We’ll take a slow app → debug it (using tools like Chrome DevTools, React Profiler, and why-did-you-render) → pinpoint the bottleneck → and then repeat, several times more. We won’t talk about the solutions (in 90% of the cases, it’s just the ol’ regular useMemo() or memo()). But we’ll talk about everything that comes before – and learn how to analyze any React performance problem, step by step.
(Note: This workshop is best suited for engineers who are already familiar with how useMemo() and memo() work – but want to get better at using the performance tools around React. Also, we’ll be covering interaction performance, not load speed, so you won’t hear a word about Lighthouse 🤐)
React Advanced Conference 2021React Advanced Conference 2021
132 min
Concurrent Rendering Adventures in React 18
Top Content
Featured WorkshopFree
With the release of React 18 we finally get the long awaited concurrent rendering. But how is that going to affect your application? What are the benefits of concurrent rendering in React? What do you need to do to switch to concurrent rendering when you upgrade to React 18? And what if you don’t want or can’t use concurrent rendering yet?

There are some behavior changes you need to be aware of! In this workshop we will cover all of those subjects and more.

Join me with your laptop in this interactive workshop. You will see how easy it is to switch to concurrent rendering in your React application. You will learn all about concurrent rendering, SuspenseList, the startTransition API and more.
React Summit Remote Edition 2021React Summit Remote Edition 2021
177 min
React Hooks Tips Only the Pros Know
Top Content
Featured Workshop
The addition of the hooks API to React was quite a major change. Before hooks most components had to be class based. Now, with hooks, these are often much simpler functional components. Hooks can be really simple to use. Almost deceptively simple. Because there are still plenty of ways you can mess up with hooks. And it often turns out there are many ways where you can improve your components a better understanding of how each React hook can be used.You will learn all about the pros and cons of the various hooks. You will learn when to use useState() versus useReducer(). We will look at using useContext() efficiently. You will see when to use useLayoutEffect() and when useEffect() is better.
React Advanced Conference 2021React Advanced Conference 2021
174 min
React, TypeScript, and TDD
Top Content
Featured WorkshopFree
ReactJS is wildly popular and thus wildly supported. TypeScript is increasingly popular, and thus increasingly supported.

The two together? Not as much. Given that they both change quickly, it's hard to find accurate learning materials.

React+TypeScript, with JetBrains IDEs? That three-part combination is the topic of this series. We'll show a little about a lot. Meaning, the key steps to getting productive, in the IDE, for React projects using TypeScript. Along the way we'll show test-driven development and emphasize tips-and-tricks in the IDE.
React Advanced Conference 2021React Advanced Conference 2021
145 min
Web3 Workshop - Building Your First Dapp
Top Content
Featured WorkshopFree
In this workshop, you'll learn how to build your first full stack dapp on the Ethereum blockchain, reading and writing data to the network, and connecting a front end application to the contract you've deployed. By the end of the workshop, you'll understand how to set up a full stack development environment, run a local node, and interact with any smart contract using React, HardHat, and Ethers.js.
React Summit 2023React Summit 2023
151 min
Designing Effective Tests With React Testing Library
Featured Workshop
React Testing Library is a great framework for React component tests because there are a lot of questions it answers for you, so you don’t need to worry about those questions. But that doesn’t mean testing is easy. There are still a lot of questions you have to figure out for yourself: How many component tests should you write vs end-to-end tests or lower-level unit tests? How can you test a certain line of code that is tricky to test? And what in the world are you supposed to do about that persistent act() warning?
In this three-hour workshop we’ll introduce React Testing Library along with a mental model for how to think about designing your component tests. This mental model will help you see how to test each bit of logic, whether or not to mock dependencies, and will help improve the design of your components. You’ll walk away with the tools, techniques, and principles you need to implement low-cost, high-value component tests.
Table of contents- The different kinds of React application tests, and where component tests fit in- A mental model for thinking about the inputs and outputs of the components you test- Options for selecting DOM elements to verify and interact with them- The value of mocks and why they shouldn’t be avoided- The challenges with asynchrony in RTL tests and how to handle them
Prerequisites- Familiarity with building applications with React- Basic experience writing automated tests with Jest or another unit testing framework- You do not need any experience with React Testing Library- Machine setup: Node LTS, Yarn