¿Cómo ofrecerán los componentes sin estado de React 0.14 mejoras de rendimiento sin shouldComponentUpdate?

8

Esta pregunta ha estado dando vueltas y vueltas en mi cabeza desde que leí las notas de la versión (y otras exageraciones relacionadas) sobre React 0.14: soy un gran admirador de React y creo que los componentes sin estado ( https: //facebook.github. io / react / blog / 2015/09/10 / react-v0.14-rc1.html # stateless-function-components ) son una excelente idea, tanto por la facilidad de escribir dichos componentes como por expresar en código la intención de que estos los componentes deben ser "puros" en términos de representación consistente para los mismos datos de utilería.

La pregunta es: ¿cómo será posible que React optimice estas funciones de componentes sin estado sin ir por completo y suponiendo que las referencias de accesorios no solo sean inmutables ya que no deben manipularse dentro del componente, sino también que nunca pueden cambiar? fuera del ciclo de vida del componente? La razón por la que los componentes "regulares" (también conocidos como componentes con estado - en otras palabras, los componentes que pasan por todo el ciclo de vida; componentWillMount, getInitialState, etc.) tienen una función opcional "shouldComponentUpdate" es que React no asume que todos los accesorios y Las referencias estatales son completamente inmutables. Después de que los componentes se hayan procesado, ciertas propiedades de las referencias de los accesorios pueden cambiar y, por lo tanto, la misma instancia de "accesorios" puede tener diferentes contenidos más adelante. Esto es en parte por qué había tanta emoción por el uso de estructuras totalmente inmutables y por qué se decía que usar Om con React podría ofrecer grandes ganancias de rendimiento; debido a que las estructuras inmutables utilizadas allí garantizaban que una instancia dada de cualquier objeto nunca podría ser mutada, por lo que deberíaComponentUpdate podría realizar verificaciones de igualdad de referencia realmente baratas en accesorios y estado (http://swannodette.github.io/2013/12/17/the-future-of-javascript-mvcs/ ).

He estado tratando de encontrar más información sobre esto, pero no he llegado a ningún lado. No puedo imaginar qué mejoras de rendimiento se podrían hacer en torno a los componentes sin estado sin suponer que los datos de los accesorios consistirán en tipos inmutables ... tal vez algún análisis preliminar de los tipos de accesorios no inmutables para tratar de adivinar si "props" y "nextProps" representan el mismos datos?

Me preguntaba si alguien tenía información privilegiada o alguna información esclarecedora sobre esto. Si React comenzó a exigir que los tipos de accesorios sean "totalmente inmutables" (permitir comparaciones de igualdad de referencia para confirmar que los datos no han cambiado), entonces creo que sería un gran paso adelante, pero también podría ser un gran cambio.

Dan Roberts
fuente

Respuestas:

4

Hay un problema de github en el proyecto react sobre exactamente esto.

De acuerdo con este comentario del problema de Github :

Para componentes complejos, la definición de shouldComponentUpdate (por ejemplo, renderizado puro) generalmente excederá los beneficios de rendimiento de los componentes sin estado. Las oraciones en los documentos están insinuando algunas optimizaciones futuras que hemos planeado, por lo que no asignaremos una instancia interna para componentes funcionales sin estado (solo llamaremos a la función). También es posible que no sigamos sosteniendo los accesorios, etc. Pequeñas optimizaciones. No hablamos de los detalles en los documentos porque las optimizaciones aún no están implementadas (los componentes sin estado abren las puertas a estas optimizaciones).

y de otra respuesta del mismo colaborador:

Hay discusiones sobre tener un indicador pureRender que podría establecer en la función, o permitirle participar en el ciclo de vida shouldUpdate, pero que actualmente no está implementado. Por el momento, las funciones sin estado no pueden ser de render puro.

finalmente de este comentario obtenemos una respuesta a su pregunta:

no hacemos render puro de forma predeterminada, pero podemos proporcionarle una forma de participar en el futuro.

Así que tendremos que ver cómo nos permitirán optar por 'pureRender' :)

Siamore
fuente