Esta es una explicación muy simplificada, pero como pueden ver, en realidad ya es bastante complicada. Así que cualquiera que haya usado esos hooks en la vida real sabe lo difícil que es rastrear esas referencias cambiantes y lo rápido que nuestras hermosas aplicaciones se convierten en un lío incomprensible e inutilizable de useMemo y useCallbacks. Así que resolver esta situación es la principal promesa del React Compiler.
El compilador es una herramienta que nos ha dado el equipo de React. Se conecta a nuestro sistema de construcción, toma el código original del componente y luego intenta convertirlo en código donde los componentes, las props y las dependencias de los hooks están memoizados por defecto. El resultado final es como si nuestro código normal de React se comportara como si todo estuviera envuelto en memoUse, memoUseCallback, lo cual ya es muy genial. Pero en realidad no hace esto. No envuelve las cosas ciegamente. Es mucho más inteligente que eso.
Por ejemplo, algo tan simple como esto se transformará en esto. Noten cómo onClick se almacena en caché en la parte inferior, pero el objeto data no está realmente almacenado en caché. Simplemente se movió dentro de la declaración if. Sin embargo, si hago referencia a este data dentro de onClick, el compilador entiende esto y reorganiza el código para que suene así. La mecánica de todo esto es absolutamente fascinante. Sin embargo, en este caso, estoy más interesado en las aplicaciones prácticas de este milagro de la ingeniería.
Así que más específicamente, quiero saber si nuestras expectativas del compilador coinciden con la realidad. Y tres preguntas principales surgen inmediatamente para casi todos. La primera es, ¿qué pasa con el rendimiento de carga inicial? Uno de los grandes argumentos en contra de memoizar todo por defecto siempre ha sido que puede afectar negativamente la carga inicial, porque React necesita hacer muchas más cosas de antemano donde todo está memoizado. La segunda es, ¿realmente tendrá un impacto positivo? ¿Cuánto problema representan realmente los re-renderizados? Y la tercera es, JavaScript es notorio por ser fluido y ambiguo. ¿Es el compilador lo suficientemente inteligente como para captar realmente absolutamente todo? ¿Es cierto que nunca más tendremos que pensar en la memorización y los re-renderizados? Antes de responder a esas preguntas, revisemos rápidamente el compilador en algunos ejemplos sintéticos. Tal vez, quién sabe, tal vez no funcione en absoluto.
Así que nuestro primer ejemplo, tenemos un componente con un diálogo, un estado para este diálogo y un botón que puede abrirlo. Y un componente muy lento en algún lugar debajo. Así que digamos que tarda cinco milisegundos en re-renderizarse. El comportamiento normal de React aquí sería re-renderizar todo, incluido el componente muy lento cuando el estado cambia. Y como resultado, el diálogo aparece con un retraso debido al componente lento. Si quisiera solucionarlo con memoización, tendría que hacer esto. Simplemente envolverlo en el React memo. Vamos a deshacernos de él y habilitar el compilador para este código y ver qué sucederá. En las herramientas de desarrollo, veo el mágico memo apareciendo por todas partes, las cosas azules.
Comments