Inicio / Artículos

el 90% de los desarrolladores de React optimiza los recálculos incorrectamente

La mayoría de los desarrolladores de React optimizan las actualizaciones de pantalla de la manera incorrecta. A dónde realmente va el rendimiento de React y qué soluciones son útiles, además de una lista de verificación para aplicarlas.

Editor: REACTAPP.TOP13 min de lectura2912 palabras

Fuentes: 90% of React Developers Optimize Re-Renders Incorrectly — Here’s What Actually Works

Las notas siguientes reconstruyen un enfoque práctico basado en el artículo “El 90 % de los desarrolladores de React optimiza las actualizaciones incorrectamente: esto es lo que realmente funciona”. Se pone énfasis en los contratos, las verificaciones y los marcadores de posición para código, en lugar de en un enfoque motivacional. Al trabajar en la etapa de descripción general, primero anote el contrato: las entradas requeridas, la señal de éxito y qué ocurre en caso de un fallo parcial. Esa lista de verificación garantiza que los cambios posteriores en el código sean honestos y precisos. Considere esta etapa como un contrato entre las entradas y los resultados validados. Asigne nombres a los elementos generados, defina las verificaciones de éxito y evite aceptar completaciones parciales silenciosas.

El verdadero problema: no entendemos cuándo React vuelve a renderizar

El verdadero problema es que nuestro enfoque funciona mejor cuando se trata como una superficie medible. Capture un registro ejemplar, un caso de fallo y la nota de reversión antes de ampliar el alcance. Registre los tiempos y el costo de tokens o consultas junto con los resultados funcionales. Tener visibilidad del costo desde el principio evita facturas inesperadas cuando el proceso pasa de la demostración a entornos compartidos. Mantenga los procesos de renderizado económicos y posponga las derivaciones costosas a la memorización solo después de realizar mediciones; una memorización prematura puede ocultar errores en los valores utilizados.

El día en que finalmente abrió React Profiler

The Day you Finally stage funciona mejor cuando se trata como una superficie medible. Capture un registro exitoso, un caso de fallo y la nota de reversión antes de ampliar el alcance. Mantenga la configuración fuera del código de la aplicación. Los archivos de entorno, los almacenes de secretos y las banderas de funcionalidad deben estar en un lugar donde los operadores puedan auditarlos sin tener que leer todo el sistema. Haga que el proceso de renderizado sea económico y posponga las derivaciones costosas a la memorización solo después de realizar mediciones. Una memorización prematura puede ocultar errores en los propios.

La verdad fundamental: Los recálculos de renderizado no son el enemigo; lo son los que son innecesarios

La etapa de The Core Truth Re-Renders funciona mejor cuando se trata como una superficie medible. Capture un registro ideal, un caso de fallo y la nota de reversión antes de ampliar el alcance. Documente tanto el camino óptimo como el de recuperación. Las reintentos, los controles humanos y el manejo de mensajes no entregados forman parte del producto, no son mejoras posteriores. Mantenga los procesos de renderizado económicos y reserve las derivaciones costosas para la memorización solo después de realizar mediciones; una memorización prematura puede ocultar errores en los parámetros obsoletos. La etapa de The Core Truth Re-Renders funciona mejor cuando se trata como una superficie medible. Capture un registro ideal, un caso de fallo y la nota de reversión antes de ampliar el alcance. Considere esta etapa como un contrato entre las entradas y las salidas validadas. Asigne nombres a los artefactos, defina verificaciones de éxito y rechace las completaciones parciales silenciosas.

Sección 1: El modelo mental que finalmente hizo funcionar React

En la Sección 1, etapa Mental, defina las entradas, el responsable de cada paso y los criterios de finalización antes de modificar el código. Los operadores deben poder volver a ejecutar el paso a partir de un punto de control conocido, sin tener que adivinar el estado oculto. Registre los tiempos de ejecución y el costo en tokens o consultas junto con los resultados funcionales. La visibilidad temprana de los costos evita facturas inesperadas cuando el flujo pasa de entornos de demostración a entornos compartidos. Prefiera salidas estructuradas con validación de esquema sobre texto en formato libre cuando el siguiente paso sea la ejecución de código o una llamada a una herramienta.

React = Motor de Ejecución de Funciones

En la etapa del motor de ejecución de funciones de React, defina las entradas, el responsable de cada paso y los criterios de finalización antes de modificar el código. Los operadores deben poder volver a ejecutar el paso a partir de un punto de control conocido, sin tener que adivinar el estado oculto. Mantenga la configuración fuera del código de la aplicación. Los archivos de entorno, los almacenes de datos secretos y las banderas de funcionalidad deben estar en un lugar donde los operadores puedan auditarlos sin necesidad de leer todo el sistema. Coloque el estado junto al componente que gestiona la mutación. Al llevar todo a un almacén global, resulta más difícil detectar errores relacionados con los tiempos de ejecución.

Component(props) → JSX

Sección 2: Por qué sus componentes se vuelven a renderizar más de lo que cree

En la sección 2 “¿Por qué su etapa?”, defina las entradas, el responsable de la tarea y los criterios de finalización antes de modificar el código. Los operadores deben poder volver a ejecutar la tarea a partir de un punto de control conocido sin tener que adivinar el estado oculto. Documente tanto la ruta óptima como la ruta de recuperación. Las reintentos, los controles humanos y el manejo de mensajes no entregados forman parte del producto, no son mejoras posteriores. Coloque el estado junto al componente que es responsable de la mutación. Subir todo a un almacenamiento global hace que los errores relacionados con el tiempo sean más difíciles de detectar. En la sección 2 “¿Por qué su etapa?”, defina las entradas, el responsable de la tarea y los criterios de finalización antes de modificar el código. Los operadores deben poder volver a ejecutar la tarea a partir de un punto de control conocido sin tener que adivinar el estado oculto. Trate esta etapa como un contrato entre las entradas y los resultados validados. Asigne nombres a los artefactos, defina comprobaciones de éxito y rechace las completaciones parciales silenciosas.

1. Objetos y funciones en línea

Al trabajar en la etapa de Objetos y funciones en línea, anote primero el contrato: entradas requeridas, señal de éxito y qué ocurre en caso de fallo parcial. Esa lista de verificación mantiene honestas las futuras modificaciones del código. Registre los tiempos y el costo de tokens o consultas junto a los resultados funcionales. Tener visibilidad del costo desde el principio evita facturas inesperadas cuando el proceso pasa de la fase de demostración a entornos compartidos. Trate los efectos como una sincronización con el mundo exterior, y no como un sustituto de los valores derivados durante la renderización.

<MyComponent options={{ theme: "dark" }} />
{} !== {}
onClick={() => doSomething()}

2. Estado elevado en exceso

Al trabajar en la etapa de “2 State Lifted Too”, anote primero el contrato: las entradas requeridas, la señal de éxito y qué ocurre en caso de fallo parcial. Esa lista de verificación ayuda a mantener honestos los cambios posteriores en el código. Guarde la configuración fuera del código de la aplicación. Los archivos de entorno, los almacenes de secretos y las banderas de funcionalidad deben encontrarse en un lugar donde los operadores puedan auditarlos sin tener que leer todo el código. Trate los efectos como una sincronización con el mundo exterior, y no como un sustituto de los valores derivados durante la renderización.

3. Estado derivado almacenado como estado

Al trabajar en la etapa de 3 Estados Derivados Almacenados, anote primero el contrato: las entradas requeridas, la señal de éxito y qué ocurre en caso de fallo parcial. Esa lista de verificación mantiene honestas las futuras modificaciones del código. Documente tanto el camino óptimo como el de recuperación. Las reintentos, los controles humanos y el manejo de mensajes no entregados forman parte del producto, no de mejoras posteriores. Trate los efectos como una sincronización con el mundo exterior, y no como un sustituto de los valores derivados durante la renderización. Al trabajar en la etapa de 3 Estados Derivados Almacenados, anote primero el contrato: las entradas requeridas, la señal de éxito y qué ocurre en caso de fallo parcial. Esa lista de verificación mantiene honestas las futuras modificaciones del código. Considere esta etapa como un contrato entre las entradas y las salidas validadas. Asigne nombres a los artefactos, defina comprobaciones de éxito y rechace las completaciones parciales silenciosas.

const [filtered, setFiltered] = useState([]);

useEffect(() => {
  setFiltered(items.filter(...));
}, [items]);

Sección 3: La regla que cambió todo para mí

La etapa de Sección 3: La Regla funciona mejor cuando se trata como una superficie medible. Capture un registro exitoso, un caso de fallo y la nota de reversión antes de ampliar el alcance. Registre los tiempos y el costo de tokens o consultas junto con los resultados funcionales. Tener visibilidad del costo desde el principio evita facturas inesperadas cuando el proceso pasa de la versión de demostración a entornos compartidos. Mantenga los procesos de renderizado económicos y posponga las derivaciones costosas a la memorización solo después de realizar mediciones. La memorización prematura puede ocultar errores en los valores utilizados.

Sección 4: Los 4 niveles de control de re-renderizado en React

La Sección 4, el proceso de 4 etapas, funciona mejor cuando se trata como una superficie medible. Capture un registro exitoso, un caso de fallo y la nota de reversión antes de ampliar el alcance. Mantenga la configuración fuera del código de la aplicación. Los archivos de entorno, los almacenes de datos secretos y las banderas de funcionalidad deben estar en un lugar donde los operadores puedan auditarlos sin tener que leer todo el sistema. Haga que el proceso de renderizado sea económico y posponga las operaciones costosas a la memorización solo después de realizar mediciones. Una memorización prematura puede ocultar errores relacionados con propiedades obsoletas.

Nivel 1: Optimización estructural (Lo más importante)

La etapa de Optimización Estructural Nivel 1 funciona mejor cuando se trata como una superficie medible. Capture un registro ideal, un caso de fallo y la nota de reversión antes de ampliar el alcance. Documente tanto el camino óptimo como el de recuperación. Los intentos repetidos, los controles humanos y el manejo de mensajes no entregados forman parte del producto, no son mejoras posteriores. Mantenga los procesos de renderizado económicos y reserve las derivaciones costosas para la memorización solo después de realizar mediciones; una memorización prematura puede ocultar errores en los parámetros obsoletos. La etapa de Optimización Estructural Nivel 1 funciona mejor cuando se trata como una superficie medible. Capture un registro ideal, un caso de fallo y la nota de reversión antes de ampliar el alcance. Considere esta etapa como un contrato entre las entradas y las salidas validadas. Asigne nombres a los artefactos, defina verificaciones de éxito y rechace las completaciones parciales silenciosas.

Nivel 2: Memorización (Cuando sea necesario)

En la etapa de memorización de nivel 2, defina las entradas, el responsable del paso y los criterios de finalización antes de modificar el código. Los operadores deben poder volver a ejecutar el paso a partir de un punto de control conocido sin tener que adivinar el estado oculto. Registre los tiempos de ejecución y el costo en tokens o consultas junto con los resultados funcionales. La visibilidad temprana de los costos evita facturas inesperadas cuando el flujo pasa de entornos de demostración a entornos compartidos. Coloque el estado junto al componente que es responsable de la mutación; llevar todo a un almacén global hace que los errores relacionados con los tiempos de ejecución sean más difíciles de detectar.

Nivel 3: Estabilidad referencial

En la etapa de Estabilidad Referencial Nivel 3, se deben definir las entradas, el responsable del paso y los criterios de finalización antes de modificar el código. Los operadores deben poder volver a ejecutar el paso a partir de un punto de control conocido, sin tener que adivinar el estado oculto. Se debe mantener la configuración fuera del código de la aplicación. Los archivos de entorno, los almacenes de datos secretos y las banderas de funcionalidad deben estar en un lugar donde los operadores puedan auditarlos sin necesidad de leer todo el sistema. El estado debe colocarse junto al componente que es responsable de la mutación. Al llevar todo a un almacén global, resulta más difícil detectar errores relacionados con los tiempos de ejecución.

const handler = () => doSomething();
const handler = useCallback(() => {
  doSomething();
}, []);
const config = useMemo(() => ({
  theme: "dark"
}), []);

Nivel 4: Aislamiento Arquitectónico

En la etapa de Aislamiento Arquitectónico Nivel 4, defina las entradas, el responsable de la tarea y los criterios de finalización antes de modificar el código. Los operadores deben poder volver a ejecutar la tarea a partir de un punto de control conocido sin tener que adivinar el estado oculto. Documente tanto la ruta óptima como la ruta de recuperación. Las reintentos, los controles humanos y el manejo de mensajes no entregados forman parte del producto, no son mejoras posteriores. Coloque el estado junto al componente que es responsable de la mutación. Subir todo a un almacenamiento global hace que los errores relacionados con el tiempo sean más difíciles de detectar. En la etapa de Aislamiento Arquitectónico Nivel 4, defina las entradas, el responsable de la tarea y los criterios de finalización antes de modificar el código. Los operadores deben poder volver a ejecutar la tarea a partir de un punto de control conocido sin tener que adivinar el estado oculto. Trate esta etapa como un contrato entre las entradas y los resultados validados. Asigne nombres a los artefactos, defina comprobaciones de éxito y rechace las completaciones parciales silenciosas.

Sección 5: React.memo — La optimización más mal utilizada

Al trabajar en la etapa de React memo de la Sección 5, anote primero el contrato: entradas requeridas, señal de éxito y qué ocurre en caso de fallo parcial. Esa lista de verificación mantiene honestas las futuras modificaciones del código. Registre los tiempos y el costo de tokens o consultas junto con los resultados funcionales. Ver la inversión desde el principio evita facturas inesperadas cuando el entorno pasa de una demostración a entornos compartidos. Trate los efectos como una sincronización con el mundo exterior, y no como un sustituto de los valores derivados durante la renderización.

Cuando React.memo NO hace NADA

Al trabajar en la etapa de “Cuándo React.memo funciona”, anote primero el contrato: las entradas requeridas, la señal de éxito y qué ocurre en caso de fallo parcial. Esa lista de verificación mantiene honestas las futuras modificaciones del código. Guarde la configuración fuera del código de la aplicación. Los archivos de entorno, los almacenes de datos secretos y las banderas de funcionalidad deben estar en un lugar donde los operadores puedan auditarlos sin tener que leer todo el código. Trate los efectos como una sincronización con el mundo exterior, y no como un sustituto de los valores derivados durante la renderización.

Cuándo React.memo brilla

Al trabajar en la etapa “When React memo Shines”, anote primero el contrato: las entradas requeridas, la señal de éxito y qué ocurre en caso de fallo parcial. Esa lista de verificación mantiene honestas las futuras modificaciones del código. Documente tanto el camino óptimo como el de recuperación. Las reintentos, los controles humanos y el manejo de mensajes no entregados forman parte del producto, no de mejoras posteriores. Trate los efectos como una sincronización con el mundo exterior, y no como un sustituto de los valores derivados durante la renderización. Al trabajar en la etapa “When React memo Shines”, anote primero el contrato: las entradas requeridas, la señal de éxito y qué ocurre en caso de fallo parcial. Esa lista de verificación mantiene honestas las futuras modificaciones del código. Considere esta etapa como un contrato entre las entradas y las salidas validadas. Asigne nombres a los artefactos, defina comprobaciones de éxito y rechace las completaciones parciales silenciosas.

Sección 6: La trampa de useCallback

La etapa 6 de useCallback funciona mejor cuando se trata como una superficie medible. Capture un registro ideal, un caso de fallo y la nota de reversión antes de ampliar el alcance. Registre los tiempos y el costo de tokens o consultas junto con los resultados funcionales. La visibilidad temprana del costo evita facturas inesperadas cuando el camino pasa de la demostración a entornos compartidos. Mantenga el trabajo de renderizado económico y posponga las derivaciones costosas a la memorización solo después de realizar mediciones. La memorización prematura puede ocultar errores en los props obsoletos.

const handleClick = useCallback(() => {
  setCount(c => c + 1);
}, []);

Sección 7: El costo oculto del contexto

La sección 7, “El escenario oculto”, funciona mejor cuando se trata como una superficie medible. Capture un registro exitoso, un caso de fallo y la nota de reversión antes de ampliar el alcance. Mantenga la configuración fuera del código de la aplicación. Los archivos de entorno, los almacenes de secretos y las banderas de funcionalidad deben estar en un lugar donde los operadores puedan auditarlos sin tener que leer todo el sistema. Haga que el proceso de renderizado sea económico y posponga las derivaciones costosas a la memorización solo después de realizar mediciones. La memorización prematura puede ocultar errores en los valores utilizados.

Malo:

La etapa “Bad” funciona mejor cuando se trata como una superficie medible. Capture un registro exitoso, un caso de fallo y la nota de reversión antes de ampliar el alcance. Documente tanto el camino óptimo como el camino de recuperación juntos. Las reintentos, los controles humanos y el manejo de mensajes no entregados forman parte del producto, no son mejoras posteriores. Mantenga los procesos de renderizado económicos y posponga las derivaciones costosas a la memorización solo después de realizar mediciones; una memorización prematura puede ocultar errores en los parámetros obsoletos.

<AuthContext.Provider value={{ user, theme }}>

Mejor:

La etapa “Better” funciona mejor cuando se trata como una superficie medible. Capture un registro exitoso, un caso de fallo y la nota de reversión antes de ampliar el alcance. Prefiera unidades pequeñas y verificables en lugar de scripts extensos. Cuando un paso falla, el fallo debe apuntar a una sola responsabilidad y no a un proceso complicado. Mantenga los procesos de renderizado económicos y posponga las derivaciones costosas a la memorización solo después de realizar mediciones; una memorización prematura puede ocultar errores en los valores utilizados.

<UserContext />
<ThemeContext />

Sección 8: Listas, claves y la ilusión de estabilidad

La etapa de Listas Clave de Sección 8 funciona mejor cuando se trata como una superficie medible. Capture un registro exitoso, un caso de fallo y la nota de reversión antes de ampliar el alcance. Trate esta etapa como un contrato entre las entradas y las salidas validadas. Asigne nombres a los artefactos, defina verificaciones de éxito y rechace completaciones parciales silenciosas. Mantenga los procesos de renderizado económicos y posponga las derivaciones costosas a la memorización solo después de realizar mediciones. La memorización prematura puede ocultar errores en los valores utilizados.

items.map((item, i) => <Row key={i} />)
items.map(item => <Row key={item.id} />)

Sección 9: la lista de verificación del rendimiento personal

La Sección 9, la etapa personal, funciona mejor cuando se trata como una superficie medible. Capture un registro exitoso, un caso de fallo y la nota de reversión antes de ampliar el alcance. Registre los tiempos y el costo de tokens o consultas junto con los resultados funcionales. Tener visibilidad del costo desde el principio evita facturas inesperadas cuando el proceso pasa de la demostración a entornos compartidos. Mantenga los procesos de renderizado económicos y posponga las derivaciones costosas a la memorización solo después de realizar mediciones. La memorización prematura puede ocultar errores en los parámetros obsoletos.

Sección 10: El gran cambio de mentalidad

La sección 10, “El gran escenario”, funciona mejor cuando se trata como una superficie medible. Capture un registro exitoso, un caso de fallo y la nota de reversión antes de ampliar el alcance. Mantenga la configuración fuera del código de la aplicación. Los archivos de entorno, los almacenes de datos secretos y las banderas de funcionalidad deben estar en un lugar donde los operadores puedan auditarlos sin tener que leer todo el sistema. Haga que el proceso de renderizado sea económico y reserve las operaciones costosas para después de realizar mediciones, utilizando la memorización solo cuando sea necesario. Una memorización prematura puede ocultar errores relacionados con propiedades obsoletas.

Pensamientos finales: El verdadero secreto

Reflexiones finales: La etapa Real funciona mejor cuando se trata como una superficie medible. Capture un registro ideal, un caso de fallo y la nota de reversión antes de ampliar el alcance. Documente tanto el camino óptimo como el de recuperación. Los intentos repetidos, los controles humanos y el manejo de mensajes no entregados forman parte del producto, no son ajustes realizados posteriormente. Mantenga los procesos de renderizado económicos y reserve las derivaciones costosas para la memorización solo después de realizar mediciones. Una memorización prematura puede ocultar errores en los datos utilizados.

Rendimiento y optimización de React

En la etapa de optimización del rendimiento de React, defina las entradas, el responsable de cada paso y los criterios de finalización antes de modificar el código. Los operadores deben poder volver a ejecutar el paso a partir de un punto de control conocido sin tener que adivinar el estado oculto.

Ganchos y gestión de estado en React

Patrones y arquitectura en React

Desarrollo de aplicaciones con React en el mundo real

Ecosistema y herramientas de React

Ruta de aprendizaje de React (principiante → avanzado)

Seguridad y escalabilidad de las aplicaciones React

Entrevistas y carrera en React

Últimas actualizaciones de React

Otra cosa que podría sorprenderlo

Desarrollo de React con inteligencia artificial

Lista de verificación operativa