Reactividad de Grano Fino Sin Ningún Compilador

Rate this content
Bookmark

Lograr una reactividad de alto rendimiento en React sin comprometer la experiencia del desarrollador siempre ha sido un desafío clave. Al construir aplicaciones en tiempo real diseñadas para mostrar cientos de millones de filas sin retraso notable, la reactividad de grano fino es esencial. Pero cuando comencé mi viaje en Pigment, ni Recoil, Jotai, ni Zustand eran lo suficientemente maduros, y React Compiler aún no existía. Vamos a explorar juntos cómo logramos ingerir, mostrar y actualizar grandes conjuntos de datos sin problemas, sin sacrificar la experiencia del desarrollador o del usuario.

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

Nicolas Dubien
Nicolas Dubien
29 min
13 Dec, 2024

Comments

Sign in or register to post your comment.
Video Summary and Transcription
Mi nombre es Nicolas, y hoy voy a hablar sobre la Reactividad de Grano Fino sin el compilador esta vez. React es reactivo, pero vuelve a renderizar componentes innecesarios. La reactividad de grano fino se logra actualizando elementos específicos en lugar de componentes completos. Pigment encontró problemas de reactividad al construir tableros de datos financieros en tiempo real. Crearon su propio sistema reactivo sobre React para lograr una reactividad de grano fino. Usaron hooks personalizados como useShell, useComputed y useWatch para integrar React con su sistema reactivo. También consideraron usar JavaScript nativo para la optimización, pero optaron por preservar React. Usan bibliotecas externas como Zestand para flexibilidad, y mantener la reactividad durante las actualizaciones de React no ha sido un problema.

1. Introduction to Fine-Grain Reactivity

Short description:

Me llamo Nicolas, y hoy voy a hablar sobre la Reactividad de Grano Fino sin el compilador esta vez. Primero necesitamos entender de qué se trata la Reactividad y si React es reactivo hoy en día. Veamos si React es reactivo considerando una aplicación simple compuesta por tres contadores. Para que funcione correctamente, necesitas mover los estados más arriba en el árbol y pasar props hacia abajo a los contadores y el total. El componente de la aplicación es el componente principal en esta aplicación, compuesto por tres estados pasados a cada contador. Esta es una aplicación básica.

Me llamo Nicolas, y hoy voy a hablar sobre la Reactividad de Grano Fino sin el compilador esta vez. Esta es la última charla antes del lanzamiento. Después de eso, podrán almorzar, así que por favor quédense.

Pero antes de entrar en la Reactividad de Grano Fino, primero necesitamos entender de qué se trata la Reactividad y si React es reactivo hoy en día. Para entender de qué se trata la Reactividad, tomé esta definición del ecosistema de Vue. Cuando modificas el estado, la actualización de Vue hace que la gestión del estado sea simple e intuitiva. Tenemos otra versión de esta, que simplemente dice que el DOM o el Vue es una función del estado.

Así que la primera pregunta que deberíamos hacernos es, ¿es React reactivo o no? Y para responder a esa pregunta, una cosa muy simple de hacer es simplemente intentarlo y ver si React es reactivo. Así que para hacer eso, consideraré esta aplicación muy simple. Está compuesta por tres contadores. Así que las primeras tres líneas son solo contadores. Puedes incrementar, decrementar los contadores, y puedes ver el valor del contador. Al final, tienes la última línea, y la última línea es solo el total de los tres contadores arriba.

Si fueras a construir tal aplicación, podrías llegar a algo como eso, con tres componentes principales, un componente de aplicación, un componente de contador y un total. Y obviamente, dentro de tu aplicación, usarás el componente de contador tres veces. Pero con ese, no funciona tan bien. Necesitas poner algo, diría yo, de interactividad para que los usuarios puedan usar tus contadores. Así que pondrás algunos estados directamente dentro de los contadores, y con eso, solo podrás jugar con cada uno de los contadores independientemente. Puedes incrementar, decrementar tus contadores, y estará bien para los usuarios. Pero en algún momento, necesitas el total, y si necesitas el total, necesitas saber sobre el estado de cada uno de estos contadores directamente dentro de tu total. Y en este punto, el truco habitual es mover los estados más arriba en el árbol, y así obtenemos los primeros tres estados directamente en la aplicación, y simplemente mueves los props hacia abajo a los contadores y al total.

Ahora que tenemos todo, veamos cómo funciona al final. Así que veamos cuál es el código de este componente de aplicación, porque es el componente principal en toda esta aplicación. Así que simplemente, así es como será tu componente de aplicación en ese caso. Así que mi componente de aplicación está compuesto por tres estados. Cada uno tiene un valor y un conjunto de valores. Y puedes ver que paso el valor más la función de establecimiento directamente a cada uno de los contadores. Y al final, puedes ver el componente total, que está recibiendo los tres valores. Esta es una aplicación básica.

A la derecha de la pantalla, puedes ver la aplicación en acción. Así que solo estoy jugando con esta aplicación.

2. Reactivity and the React Compiler

Short description:

Estoy incrementando, decrementando contadores, y puedes ver que todo funciona bien. React es reactivo, ya que los valores en mi estado se replican correctamente en la pantalla. Sin embargo, cuando habilito las React DevTools, veo que cada vez que incremento o decremento un contador, no solo se renderizan ese contador y el total, sino también todos los demás contadores y el componente de la aplicación. Recientemente, intenté usar el compilador y noté una ligera diferencia. Se renderizan el contador y el total, pero también se renderiza el componente de la aplicación. Quería entender qué estaba haciendo el compilador, así que revisé el playground con el código.

Estoy incrementando, decrementando contadores, y puedes ver que todo funciona bien. Así que React es reactivo, porque al final, cuando hago clic en algo, puedo ver que los valores que he instalado en mi estado se replican correctamente en la pantalla. Puedo ver el total siendo actualizado, puedo ver los valores siendo actualizados. Pero hay algo que habilito en las React DevTools que está resaltando todo en la pantalla. Cada vez que hago clic en algún lugar, algo está resaltado. Todo lo que está resaltado está relacionado con una cosa de renderizado. Así que cada vez que React está renderizando uno de mis componentes, puedes ver esta pequeña flecha detenerse alrededor del componente. Significa que mi función ha sido llamada de nuevo. Y en mi caso, puedes ver que cada vez que incremento o decremento un contador, no solo este contador más el total tiene que ser renderizado de nuevo, sino también todos los demás contadores más la aplicación en sí.

La primera vez que vi eso, pensé, ¿qué está haciendo React? Es una locura. Quiero decir, ¿qué demonios? Quiero decir, estoy incrementando un contador, y todo se vuelve a calcular una y otra vez. Y tuve que aceptarlo. Quiero decir, estaba bien. Pensé, tal vez es normal. Digamos que es normal. Y recientemente, me encontré con cosas del compilador. Pensé, sí. Seré salvado. Tal vez seré salvado esta vez. Habilité el compilador, de nuevo, el código que te mostré. Esta vez, obtenemos algo un poco diferente. Cuando incremento el contador, solo vemos un renderizado de este contador más el total, obviamente. Pero también vemos un renderizado del componente de la aplicación. Así que mejora. Es mejor, o al menos, diremos que es más intuitivo. Pero como el compilador está haciendo algo muy extraño, quería echar un vistazo a lo que estaba haciendo.

Así que revisé el playground con ese fragmento de código. Así que si alternamos el playground del compilador de React contra ese fragmento de código, obtenemos lo siguiente más precisamente, este código. No pasaré demasiado tiempo en ello. Pero hay una pregunta.

QnA

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

SolidJS: Reactivity Unchained
JSNation 2022JSNation 2022
20 min
SolidJS: Reactivity Unchained
Solid.js is a declarative JavaScript library for building user interfaces that addresses performance optimization. It introduces fine-grained reactivity and avoids using a virtual DOM. The Talk explores rethinking performance and reactivity in web applications, understanding reactivity and primitives, and creating DOM elements and using JSX in Solid.js. It also covers rendering components, sharing state, and the advantages of fine-grained rendering and the reactive approach in Solid.js.
5 Años de Construir React Table
React Summit 2022React Summit 2022
24 min
5 Años de Construir React Table
Top Content
React Table is a popular table library that started with HTML5 tables and transitioned to React. It faced challenges with integration and user requests, leading to the development of React Table. The introduction of the Headless UI pattern and TypeScript support improved the library's capabilities and quality. Generics and TypeScript played a significant role in reducing the code size and improving development. React Table is now going framework agnostic and partnering with AG Grid.
Gestión de Estado Moderna con Vue 3
Vue.js London Live 2021Vue.js London Live 2021
22 min
Gestión de Estado Moderna con Vue 3
Top Content
Vanessa introduces Vue Free and discusses the benefits of using the Composition API. The order of execution and grouping logical units using the Composition API is explained. The Composition API is used for state management and refactoring components. The speaker shares their initial experience with state management using Vuex. Composables are explored as an alternative for state management in Vue 3.
Llevando Vue.js al Backend
Vue.js London Live 2021Vue.js London Live 2021
23 min
Llevando Vue.js al Backend
This talk explores using Vue.js in the backend, specifically focusing on Vue 3 Reactivity. It discusses how Vue 3 Reactivity leverages ES6 proxies to update changes and intercept hooks. The talk also covers implementing Vue.js backend with live demos, showcasing the modification of proxies and the use of reactive functions. It demonstrates the creation of a reactive array and the implementation of join, leave, and message functionalities. The talk concludes by mentioning the possibility of using computed properties and inviting further questions.
Por Qué React No Debería Adoptar Signals
React Advanced 2024React Advanced 2024
10 min
Por Qué React No Debería Adoptar Signals
Today I want to talk about why React should not adopt signals. By adopting signals in React, we can automatically track dependencies for effects and memos, leading to more efficient component rendering. Accessing specific parts of the JSX that read signals allows for fine-grained reactivity across component boundaries. Adopting signals in React requires migrating to single execution components, which only update specific parts of the application. This can become complex when dealing with components that read from different signals. In contrast, React assumes everything can change and enforces this assumption through linters and compilers, leading to more robust code and easier updates. If you're interested in signals in React or need performance improvements, let's chat!

Workshops on related topic

Construye una Biblioteca Universal de Datos Reactiva con Starbeam
JSNation 2023JSNation 2023
66 min
Construye una Biblioteca Universal de Datos Reactiva con Starbeam
WorkshopFree
Yehuda Katz
Yehuda Katz
Esta sesión se centrará en los bloques de construcción universales de Starbeam. Usaremos Starbeam para construir una biblioteca de datos que funcione en múltiples frameworks.Escribiremos una biblioteca que almacene en caché y actualice datos, y admita relaciones, ordenación y filtrado.En lugar de obtener datos directamente, funcionará con datos obtenidos de forma asíncrona, incluidos los datos obtenidos después de la representación inicial. Los datos obtenidos y actualizados a través de web sockets también funcionarán bien.Todas estas características serán reactivas, por supuesto.Imagina que filtras tus datos por su título y luego actualizas el título de un registro para que coincida con el filtro: cualquier resultado que dependa de los datos filtrados se actualizará para reflejar el filtro actualizado.En 90 minutos, construirás una increíble biblioteca de datos reactiva y aprenderás una nueva herramienta poderosa para construir sistemas reactivos. La mejor parte: la biblioteca funciona en cualquier framework, incluso si no piensas en (o dependes de) ningún framework al construirla.
Tabla de contenidos- Almacenar un registro obtenido en una celda- Almacenar múltiples registros en un Mapa reactivo- La iteración reactiva es una iteración normal- El filtrado reactivo es un filtrado normal- Obtener más registros y actualizar el Mapa- La ordenación reactiva es una ordenación normal (¿se está volviendo un poco repetitivo?)- Modelar la invalidación de la caché como datos- Bonus: relaciones reactivas