Entonces, esta es una aplicación básica de toma de notas. ¡Vaya! ¡Espera! ¡Oh, no! Yo—Yo, espera. Lo siento. Yo— Esto. Sí. ¡Ah! Sí, hemos vuelto. Entonces, esta es una aplicación básica de toma de notas, y tiene una lista de nodos que puedes filtrar. Y si intentas filtrar estos nodos, la aplicación se ralentizará. Puedes notarlo si miras este cubo de hielo que gira. Es un spinner que se congela cuando la aplicación se congela, cuando la página se congela, y, bueno, gira cuando no está congelado, algo así como lo opuesto al hielo.
Si intento escribir, si intento filtrar nodos, si intento escribir la letra F, por ejemplo, puedes notar cómo el spinner se congela durante un segundo o dos. Si intento escribir más, podrías ver cómo la aplicación simplemente se retrasa mientras estoy escribiendo. Entonces realmente no puedes sentirlo, porque estoy escribiendo detrás del teclado. Pero podrías ver cómo estoy escribiendo, y la aplicación se siente realmente, realmente lenta. Las actualizaciones de la UI, ocurren con retraso, y la aplicación simplemente se congela durante un segundo o dos.
Entonces, ahora, cada vez que tengo un problema de performance, lo que me gusta hacer es abrir DevTools Profiler, DevTools Performance, e intentar grabar lo que está sucediendo en la aplicación con el panel de performance. Entonces, en este caso, si hago clic en grabar, e intento escribir, y detengo la grabación, veré que lo que está sucediendo en la aplicación es que tengo este enorme pico de actividad de la CPU de 500ms, y si amplío ese pico de actividad de la CPU, veré que tengo un solo evento keydown que tarda 550ms en procesarse, y debajo de ese evento, hay un montón de llamadas a funciones de React.
Entonces, ahora, si intentara debug esto un poco más a fondo e intentara averiguar qué está pasando, vería esto. Entonces, aquí está lo que sucede en la aplicación. Lo que sucede es que estoy escribiendo en el campo de texto, los inputs de filtro, eso llama a esta función set filter que es solo un hook useState, que, a su vez, cambia el estado en un montón de componentes, y eso hace que React renderice todos estos componentes uno por uno hasta que termine. Y como tenemos muchos componentes, muchos botones de nodos, eso lleva un tiempo. Entonces, este re-renderizado es una operación de detener el mundo. Nada puede suceder hasta que React termine. Si un usuario intenta interactuar con la aplicación de cualquier manera, tendrá que esperar hasta que el re-renderizado termine. Si el re-renderizado de la aplicación tarda dos segundos, el usuario tendrá que esperar dos segundos. Así es como funciona React 17, React 16, incluso React 18 funciona de serie. Un comportamiento de bloqueo de JavaScript bastante estándar.
Ahora, retrocedamos un paso. Tenemos un problema de performance, ¿verdad? Estoy escribiendo en el campo de texto, y ese campo de texto va a una lista de nodos para re-renderizar, y este re-renderizado es bloqueante y costoso, lo que ralentiza la aplicación y ralentiza todo el proceso de escritura. Entonces, mi pregunta para ustedes, si fueran los desarrolladores de esta aplicación, y esta aplicación estuviera usando React 17, ¿cómo intentarían resolver esto? Hay múltiples soluciones aquí, ¿qué intentarían? ¿Perdón? De-balanceo.
Comments