Out Of Order Streaming (El Secreto que Impulsa el React Moderno)

This ad is not shown to multipass and full ticket holders
React Summit US
React Summit US 2025
November 18 - 21, 2025
New York, US & Online
The biggest React conference in the US
Learn More
In partnership with Focus Reactive
Upcoming event
React Summit US 2025
React Summit US 2025
November 18 - 21, 2025. New York, US & Online
Learn more
Bookmark
Rate this content

¿Alguna vez te has preguntado cómo React puede "actualizar" una página mientras aún se está cargando? Nos hemos perdido tanto en la discusión de cosas como Next.js, Suspense, Signals, Server Components y Server Actions, que la mayoría de los desarrolladores de React han pasado por alto una de las piezas más recientes de magia de React: Out Of Order Streaming.

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

Theo Browne
Theo Browne
29 min
19 Nov, 2024

Comments

Sign in or register to post your comment.
Video Summary and Transcription
Soy el segundo mejor YouTuber de TypeScript. Estoy dando una charla sobre streaming en React y los beneficios que aporta a las aplicaciones. El streaming permite tiempos de carga percibidos más rápidos al enviar HTML parcial al navegador, renderizándolo y esperando a que se complete el resto. La carga del lado del servidor puede causar retrasos, pero esto se puede mejorar almacenando en caché el HTML en un CDN. El streaming de HTML en un orden diferente ha sido un desafío, pero hay soluciones en JavaScript. Optimizar el streaming de HTML con Suspense y I.O. dinámico puede mejorar aún más los tiempos de carga. Usar suspense en el renderizado del lado del cliente y abordar los desafíos con el modelo de React de Next.js son patrones interesantes. Ahora se puede hacer caché a un nivel más granular, mejorando el SEO y reduciendo la carga en el servidor host. Renderizar en el servidor no es una gran penalización en comparación con múltiples solicitudes de API. Gracias a todos.

1. Introduction to Streaming in React

Short description:

Soy el segundo mejor YouTuber de TypeScript. He estado haciendo videos de desarrollo de software durante unos dos años. Hoy estoy dando mi charla sobre streaming en React y los beneficios de agregar streaming a tus aplicaciones. Te mostraré una aplicación normal de React y explicaré los problemas con ella. El problema principal es el tiempo de espera antes de obtener los datos. Pero hay una solución.

♪♪♪ Tuve que hacer una corrección rápida. No leyó el copyright. Soy el segundo mejor YouTuber de TypeScript. Solo quería aclarar. No voy a robar el valor de Matt Pelcock. Es muy bueno en lo que hace.

Pero para aquellos que no me conocen, soy Theo. He estado haciendo videos de desarrollo de software durante unos dos años. ¿Y quién ha visto uno de mis videos antes? ¡Sí! ¡Woo! Un buen número de ustedes. Buen material. No sé por qué.

Entonces, hoy estoy dando mi charla sobre streaming y no solo en React, sino en general por qué es genial y los beneficios de agregar streaming a tus aplicaciones. Y estoy haciendo eso, ante todo, mostrándote una aplicación normal de React escrita de la manera en que muchos de nosotros la hemos escrito antes. Solo actualizo la página, vemos la carga y tenemos nuestro estado de sesión iniciada. Todos hemos escrito código como este antes, con suerte. Tal vez no, en realidad. Veamos.

¿Quién ha escrito código como este antes? Veamos manos. No puedo ver las manos porque literalmente solo tengo una caja negra aquí, pero confío en que hay un buen número de ellas. Si has escrito código como este, muévete a React Query.

De todos modos, este código funciona bien. La página se carga, tiene una etiqueta de JavaScript en ella, el navegador carga la etiqueta de JavaScript, el JavaScript se analiza, renderiza el componente, se da cuenta, oh, necesito ir a buscar estos datos. Y luego va y hace la solicitud de API, obtiene los datos, los establece en un estado y luego vuelve a renderizar con el nuevo estado actualizado. Sin embargo, hay un par de problemas aquí. Obviamente, hay condiciones de carrera y demás. Vamos a ignorarlas. El problema principal es que tengo que esperar hasta que la página haya cargado el HTML, obtener el JavaScript, analizar el JavaScript, ejecutar el JavaScript, renderizar el componente, y luego finalmente podemos comenzar la obtención cuando podríamos haber estado haciendo todo ese trabajo durante ese tiempo antes. ¿Cómo, sin embargo? Porque necesitamos tener este contenido en la página. No podemos simplemente enviar algo de HTML y enviar el resto más tarde. ¿O sí podemos? Hay una pequeña demostración maravillosa que Guillermo tuiteó hace un tiempo.

2. Exploring Partial HTML Rendering with Streams

Short description:

Tenemos un stream que envía HTML parcial al navegador, que puede renderizarlo y esperar a que se complete el resto. Esto permite tiempos de carga percibidos más rápidos. Vamos a explorar esto con más detalle.

Iba a copiar y pegar el código, pero todos hemos usado la captura de pantalla de texto antes. No funciona, y no tenía ganas de codificarlo.

Los detalles importantes aquí son que tenemos un stream, escribimos estos datos de stream como escribibles con este waitUntil, pero inmediatamente enviamos una respuesta que tiene el tipo de contenido HTML. Luego, en esta función de datos de stream, creamos un escritor, escribimos inmediatamente un poco de HTML, esperamos 1.5 segundos, luego obtenemos esta URL de confeti y te mostramos el resto después.

Ahora, cómo se ve esto, si cargo esta página, dice, hola, y luego aparece el mundo. Donde las cosas se ponen interesantes es si entramos en la pestaña de red y hacemos lo mismo, podrías haber notado aquí, va a ser difícil de ver, así que en realidad copié el código, para que podamos echar un vistazo en un segundo. El HTML llega... Necesito desactivar el caché allí, recargar esto. El HTML llega parcialmente completo. Se detiene aquí, y luego el resto del HTML llega después. Bastante genial. La forma en que esto funciona es que el navegador es lo suficientemente inteligente para renderizar HTML incompleto, siempre que tenga una etiqueta de cierre para el elemento más reciente. Puedes simplemente enviar HTML incompleto, el navegador puede renderizarlo, y puedes terminar el HTML más tarde.

3. Challenges with Server-Side Loading

Short description:

La versión moderna del componente del servidor de este código espera tres segundos antes de devolver un usuario falso. Este retraso puede hacer que el sitio web parezca más lento en comparación con uno que carga JavaScript de inmediato. Almacenar en caché el HTML en un CDN puede mejorar la velocidad de navegación percibida. La respuesta inmediata al hacer clic en un botón es crucial.

Eso es genial si tienes todo tu contenido en orden. Llegaremos a la parte desordenada en un minuto.

Así que, aquí tengo la versión moderna del componente del servidor de este código. Obtengo el usuario directamente de la base de datos. Este código es muy sofisticado, como podemos ver aquí. Espero tres segundos y luego devuelvo un usuario falso. Cuando cargo esto, si cierro y vuelvo a abrir esa página, estoy aquí esperando. ¿Ves el pequeño indicador de carga en la parte superior? Tienes que esperar los tres segundos completos antes de ver algo. Lo que encontré como desarrollador y como usuario es que la mayoría de las personas percibirán este sitio web como mucho más lento que un sitio web que carga todo el JavaScript de inmediato porque puedes ver algo inmediatamente. Si vas a una página web que tiene el HTML almacenado en caché en un CDN para que puedas obtener esa parte instantáneamente, hace que la navegación se sienta más rápida, incluso si solo ves un indicador de carga inmediatamente después. Por eso soportamos las peculiaridades y comportamientos de las aplicaciones de una sola página durante tanto tiempo, porque obtendríamos esa respuesta inmediata, esperaríamos a que el JS se cargara, lo tendríamos en nuestro caché, y luego todo lo demás es lo suficientemente rápido. Pero lo más importante es que harías clic en un botón y verías la respuesta de inmediato, lo cual si cierro y vuelvo a abrir esto, no estoy viendo una respuesta de inmediato. Esto está tomando un tiempo considerable.

4. Solving the Server-Side Loading Issue

Short description:

Para resolver este problema, podemos mover el código rápidamente, hacerlo asincrónico y envolverlo con suspense para mostrar un estado de carga inmediatamente. El navegador puede tardar en renderizar el HTML, resultando en una etiqueta incompleta.

Entonces, ¿cómo resolvemos esto? ¿Quién conoce la solución moderna a este problema en la audiencia? Veamos manos levantadas. Aún no veo manos. ¿Qué tal si la gente grita, cuál es la solución a este problema? ¿Cuál es el componente que necesito agregar para solucionar esto? Correcto. Necesito mover esta parte rápidamente, lo cual podemos hacer fácilmente.

Function, user, data. Toma eso. Solo haz esto asincrónico. Luego devuelve. Veamos si un cursor puede llevarme aquí. Genial, puede. Y cambiamos esto. Error usuario no está definido. Oh, porque era el estado antiguo. Porque es gracioso. Incluso obtienes los mismos problemas cuando estás depurando. Porque tomó tres segundos salir de la página de estado de error para llegar a la página que funciona nuevamente. Así que pensé que mi código estaba mal, cuando en realidad, el navegador estaba retrasado.

Y ahora todo lo que tenemos que hacer es envolver esto con un suspense. Fallback está cargando. Olvidé importarlo. Y ahora obtenemos ese estado de carga inmediatamente. Y si cierro y vuelvo a abrir, vemos eso. Pero también vemos el indicador de carga, porque el navegador aún no ha terminado de enviar el HTML. Si nuevamente abro la pestaña de red y actualizo esto, saltamos aquí. Verás que esta es una etiqueta HTML incompleta. Puedo probar eso agregando un 0. Limpia esto. Recarga. Y ahora verás que tenemos este HTML incompleto. No ha terminado de enviarse.

5. Streaming HTML in a Different Order

Short description:

Transmitir HTML en un orden diferente al que aparece en el HTML y DOM ha sido un desafío para los entusiastas del streaming. Sin embargo, hay algo de JavaScript mágico que lo hace funcionar. Vamos a explorar cómo se rompe abriendo una versión con componentes adicionales no ocultos. También podemos cambiar el orden de estos componentes.

Pero en un momento, va a enviar el resto del HTML. Probablemente debería haberlo hecho no 30 segundos. Hagámoslo 5. Me da suficiente tiempo para maniobrar rápidamente a través de DevTools. Esto es molesto de demostrar, he aprendido rápidamente, porque tienes que entrar en DevTools antes de que llegue el resto y luego te reinicia en la parte superior así que no ves dónde estabas desplazado. Eso es raro.

¿Por qué está este div oculto? Bueno, si tu HTML no está en orden de más rápido a más lento, resulta que el streaming no es particularmente útil. Porque si, digamos, en lugar de que el estado de inicio de sesión esté debajo del contenido estático, esto estuviera arriba. No podemos simplemente enviar esa parte más tarde porque está en el orden. HTML es un formato lineal. Podríamos hacer algunos trucos de CSS para cambiar las cosas. He visto irónicamente código así antes que es aterrador. Pero, ¿y si no tuviéramos que hacerlo? ¿Y si el orden en que las cosas se transmiten al navegador no tuviera que coincidir perfectamente con el orden en que aparecían en el HTML, y luego eventualmente en el DOM, de la forma en que el usuario lo vería? Este ha sido un desafío que hemos estado tratando de encontrar una buena solución confiable para nosotros, los entusiastas del streaming, durante un tiempo. Y he hecho algunas cosas tontas antes en Cloudflare. Espero que ninguno de ustedes haya tenido que hacer eso. No fue divertido.

Pero hay algo de JavaScript mágico aquí que hace que todo esto funcione. Y podría mostrarles cómo funciona, pero creo que es más divertido mostrarles cómo se rompe. Así que vamos a abrir esta versión de la página que tiene un par de piezas adicionales. No ocultas. Así que ahora tenemos estos tres componentes lentos. Componente lento uno, luego dos, luego tres. Nuevamente, código muy complejo. Les paso una prop que es el tiempo de espera para cuánto tiempo se supone que deben ser. También, debería haber mencionado esto antes. Todo este código es código del servidor. Ninguno de los JavaScript que ves aquí se envía al cliente. Si tuviera que usar client en la parte superior, simplemente se rompería por completo porque son componentes recientes. Pero aquí tenemos el uno, luego el dos, luego el tres. Y también puedo cambiar el orden de estos.

6. Exploring HTML Streaming and the Magic Script

Short description:

Podría hacer tres, dos, uno. Vamos a romperlo. En la versión oculta, vemos los componentes lentos. Exploramos las DevTools y la importancia de una etiqueta script. Esta función mágica intercambia elementos y realiza cambios de código. La página se recarga para mostrar lo que está sucediendo.

Podría hacer tres, dos, uno. Y aparecerán en la parte inferior, medio, superior. Así que claramente esto no está llegando de manera lineal. Vamos a romperlo. Podría haber escrito este código en vivo, pero se ve así, así que no lo voy a hacer. Vamos a saltar rápidamente a la versión oculta. Y ahora vemos uno, luego dos, luego signo de dólar componente lento tres.

Echemos un vistazo a las DevTools. Así que si entramos aquí, actualizo de nuevo. Limpio y actualizo una vez más. Verás que el HTML está llegando aquí. Y tenemos todos mis divs, estados de carga. Pero también tenemos esta pieza importante aquí, esta etiqueta script. He pasado demasiado tiempo pensando en esta etiqueta script en particular y enseñando a personas que trabajan en otras cosas como Elixir la importancia de esta etiqueta script. ¿Puedo decirle a esto que esto es JavaScript, incluso si no quiere creerlo? Genial. Esta es una función mágica que se envía la primera vez que Next.js transmite HTML adicional al navegador. Toma un elemento por ID. Define esta función RC, que toma un elemento por su ID. Elimina el hijo. Así que esto se está eliminando a sí mismo porque va al padre y luego lo elimina. Encontramos este elemento B. Y hacemos un montón de código maravilloso para intercambiar estos y cambiar este elemento por este otro elemento. Y luego tenemos aquí mismo $rc B: 0, S: 0.

Si vuelvo a esto, cambiaré esto a ser 5, 6. Seguro. Así que es un poco más lento. Ocultar a estos chicos. Y cambiar esto a ser 0. Recargaremos aquí. Y verás un poco lo que está sucediendo aquí.

7. Optimizing HTML Streaming with Suspense

Short description:

Esperamos los seis segundos y obtenemos el div falso reemplazado. React coloca plantillas para los límites de suspense en el HTML. Cuando se resuelve un límite de suspense, se envía el div oculto con un ID coincidente. La etiqueta de script RC se envía para intercambiar los elementos. Esta optimización puede beneficiar a otros frameworks como Phoenix LiveView. Una vez que se envía el primer fragmento de HTML, el resto se puede enviar sin la etiqueta de script. Este comportamiento se puede habilitar en Next.js instalando Next Canary y activando funciones experimentales.

Esperamos los seis segundos. Y obtenemos el div falso siendo reemplazado. Porque lo que habría existido en el HTML antes, lo cual es relativamente fácil de mostrar, está en este HTML, donde está ese estado de carga, tenemos la plantilla ID B0. Y así es como el HTML sabe dónde este elemento necesita ser intercambiado. Así que cuando pones un suspense usando componentes del servidor, React colocará una de estas plantillas para cada uno de esos puntos e identificarlos en el orden en que fueron creados. Y luego, cuando React termina de resolver ese límite de suspense y sabe que estos datos están listos, envía ese HTML con un ID S: algún número para intercambiarlo.

Así que el orden en que estas cosas llegan es que obtenemos el HTML que no tiene nada envolviéndolo en suspense. Una vez que uno de estos límites de suspense se resuelve y está listo, enviamos este div oculto que tiene el ID para coincidir con este otro elemento, contiene el HTML real dentro de él. Y luego, si no hemos enviado esta etiqueta de script RC aún, la enviamos inmediatamente después con esta función. Y luego se invoca a sí misma para intercambiar esos elementos. Esto nos permite enviar el HTML en cualquier orden e intercambiarlo en cualquier punto. Y esto no solo beneficia a React, no solo beneficia a JavaScript. He estado ayudando al equipo de Phoenix LiveView en el mundo de Elixir a implementar esto allí para que puedan enviar su plantilla, pueden enviar su diseño inmediatamente, y luego enviar el resto de los datos después de cualquier llamada a la base de datos o autenticación u otras cosas estén hechas, lo que hará que tu sitio se sienta mucho más rápido, especialmente si puedes almacenar en caché esa primera parte en un CDN y luego resolver el resto a medida que avanzas. Y si volvemos aquí rápidamente, y los vuelvo a encender todos, limpio eso, donde las cosas se optimizan realmente y, en mi opinión, se vuelven realmente interesantes, es una vez que has enviado este primer fragmento con este primer HTML, el resto se puede enviar sin esa etiqueta de script, y simplemente se llama así. Así que para S2, porque eso llegó después, envía el HTML, luego envía la etiqueta de script con estos datos, y luego envía, ya que estamos en Next.js, los metadatos necesarios para que Next haga un seguimiento de lo que está en el DOM donde, maneje la hidratación, todas esas cosas. Y tenemos el tercero que llega, y hace exactamente lo mismo. Creo que esto es súper genial, y los patrones que habilita son fenomenales. Voy a arriesgarme e ir un paso más allá, sin embargo, porque tengo más tiempo del que pensé que tendría en este punto. Así que vamos a hacer algo realmente tonto. Vamos a instalar Next Canary. No es que ya no esté en un canary, pero no estamos en el último. Y vamos a activar experimental, y mira eso. Lo que acabamos de hacer es hacer que esto sea ahora un comportamiento predeterminado, lo que permite ese maravilloso comportamiento de caché que estaba describiendo antes.

8. Introduction to Dynamic I.O.

Short description:

Si construimos este proyecto con dynamic I.O., obtenemos diferentes activos de salida. El primer byte debe ser resuelto por el mismo servidor que envía el resto. Enviar datos por adelantado permite una carga más rápida de etiquetas de script, fuentes y CSS. Sin embargo, si todavía estás bloqueado en un servidor, este necesita activarse y procesar la solicitud antes de enviar el resto.

Así que si volvemos, tenemos la página de inicio. Esto debería funcionar, con suerte, si todo va bien. Genial. Lo que acabo de activar es una característica nueva y realmente genial llamada dynamic I.O. Anteriormente, habrías tenido que decirle a React, o Next.js, o cualquier conjunto de herramientas que estés usando, dónde existen estos límites usando una etiqueta de suspense. Pero ahora, puedo eliminar el async aquí, porque realmente ya no lo necesito. Y tenemos el suspense. Puedo dejar eso.

Ahora, si fuéramos a construir este proyecto, obtenemos activos de salida muy diferentes, porque el mayor problema con el streaming es que el primer byte tiene que ser resuelto por el mismo servidor que envía el resto. Así que si voy a una página web, y está siendo servida con componentes del servidor, no puedo obtener algo de un CDN inmediatamente. Necesito tener una conexión con ese servidor para que pueda enviar todo lo demás. Esto es bueno, porque tienes esa única fuente de verdad que proporciona todo el contenido para la página. Te permite enviar algunos datos por adelantado. Incluso si tu sitio es completamente dinámico, al menos puedes comenzar a cargar las etiquetas de script, las fuentes, el CSS, y todas esas cosas antes. Pero todavía estás bloqueado en un servidor. Si estás usando Lambda, algo así, tiene que activarse, procesar la solicitud, averiguar qué respuesta comenzar a enviar, comenzar a generar el resto, y lo envía todo. Pero si ejecuto bun run build después de activar dynamic I-O, obtenemos un pequeño error agradable.

9. Exploring Partial Pre-rendering

Short description:

Esta página está parcialmente pre-renderizada, lo que permite una carga más rápida de fuentes, CSS y otros activos. La bandera principal utilizada para identificar lo que se puede renderizar de esta manera es 'async'. Al agregar una etiqueta de suspense, todo lo necesario para renderizar la parte estática está listo para usar. React ha trabajado alrededor de las limitaciones del protocolo para mejorar la experiencia de streaming para los usuarios.

Oh, porque todavía tengo un montón de esas etiquetas force dynamic, que ya no son necesarias, lo cual es un cambio realmente genial. Con suerte, eso es suficiente. ¿O tengo una en hidden también? Sí, la tengo. Y, por supuesto, las cosas ya no se están usando. A la quinta va la vencida. Ahí estamos.

Lo que hemos hecho aquí que es súper genial, verás ese círculo mitad y mitad. Esta página está parcialmente pre-renderizada. Así que tienes pre-renderizado, que está generando HTML basado en qué props esperas que tenga una página. Tienes renderizado dinámico, que es toda la página renderizada dinámicamente al vuelo. Pero ahora tenemos pre-renderizado parcial, donde tomamos todo hasta la primera etiqueta de suspense, lo renderizamos estáticamente y lo almacenamos en un CDN. Y ahora, cuando el usuario va a la página, esa parte puede cargarse inmediatamente. Pueden empezar a ver algo. Podría ser un estado de carga. Podría ser una página en blanco. Pero al menos ya están cargando las fuentes, el CSS, y todas esas otras cosas, mientras tu servidor se activa y comienza a generar el resto.

Pero, ¿cómo funciona eso? Debe haber algunos trucos locos de compilador, ¿verdad? Tengo un video que saldrá pronto del que estoy realmente orgulloso sobre la magia que impulsa esta característica y cómo habilita todas estas cosas. Pero el TLDR es la bandera principal que están usando para identificar lo que se puede o no renderizar de esta manera. Es async. Ya estamos pintando el código. Ya estamos diciendo a las herramientas que estamos usando qué es o no es async, lo que significa, teóricamente, que hay algún trabajo que debe hacerse allí. Así que ahora sabemos dónde comienza este trabajo, porque se llamó a una función async. E incluso les dimos una pista extra. Agregamos una etiqueta de suspense. Ahora todo lo que se necesita para renderizar esa parte estática está listo para usar. Podemos renderizarlo, guardarlo en un CDN. Y luego, en adelante, todo puede ser renderizado en el servidor. Simplemente consume ese HTML inicial y luego transmite el resto con el pequeño intercambio mágico que vimos con esa función RC.

Espero que esto ayude a aclarar tanto por qué el streaming es tan importante, como cómo realmente funciona, y cómo React ha trabajado alrededor de las limitaciones del protocolo. Porque resulta que hacer streaming de HTML en orden realmente no te da una gran experiencia para tus usuarios.

10. Enhancing Web Browsing with Suspense

Short description:

Aprovechar el patrón de suspense mejora la experiencia de navegación web. Previene el cambio de diseño y permite un manejo más fácil de componentes lentos al envolverlos con suspense. Esta característica es particularmente beneficiosa para casos como el streaming de fondos SVG y SVGs en línea, proporcionando una experiencia fluida y optimizada. Depurar HTML incompleto en la pestaña Source de Chrome es innecesario y no se recomienda, pero si encuentras errores relacionados con el streaming de HTML en React, no dudes en ponerte en contacto.

Tendremos un poco de JavaScript moviendo algunos elementos aquí y allá. De repente, este patrón se convierte en una mejor manera de navegar por la web.

Gracias a todos. Esto parece una característica increíble para la métrica central de cambio de diseño. ¿Crees que eso es cierto? Absolutamente. Para ser claros, anteriormente, cuando las cosas se transmitían de arriba a abajo, causaba cambio de diseño seguro. Pero ahora, es relativamente fácil tomar algo que es lento, envolverlo con un suspense, darle una etiqueta de fallback que tenga el mismo tamaño que el elemento de salida esperado, y simplemente funciona. Ya no tienes que pensar en ello, lo cual es realmente, realmente genial. Y eso no solo sucede para ejemplos raros.

En nuestro producto de carga, que es simplemente mejores cargas de archivos para desarrolladores full stack, tenemos pequeños fondos para todas las aplicaciones que has creado. Y esos fondos son SVGs, muchos de los cuales son grandes. Tengo, creo, 800 de ellos en un archivo. Es como un megabyte y medio de TypeScript. Así que cuando cargas la página que tiene esos datos, tenemos el contenedor en el exterior, el pequeño spinner de carga para el estado en la página allí. Y podemos transmitir todas las aplicaciones que tienes en tu cuenta con el SVG en línea en eso también. Así que no tenemos que enviarte esto con una etiqueta de imagen que tiene que ir a buscar un SVG y luego cargarlo. Tal vez sea del tamaño incorrecto y todo eso. En su lugar, simplemente enviamos eso como parte del HTML transmitido. Sin aparición repentina, sin comportamientos extraños. Todo simplemente funciona. Y he estado impresionado con los nuevos patrones de suspense y cómo se siente antinatural.

Genial. Como novato en SSR y Next, ¿cómo depuro este HTML incompleto en la pestaña Source de Chrome? No lo haces. Casi todos los desarrolladores de Next.js que conozco que están usando estas características no saben cómo realmente funciona bajo el capó. Solo lo aprendí hace poco, porque estaba ayudando a mis amigos del mundo de Elixir a hacer ingeniería inversa para copiarlo en lo que estaban haciendo. Nunca deberías necesitar mirar la pestaña Network de esa manera. Hay una razón por la que fue tan difícil para mí hacerlo. No importa. Si encuentras un error relacionado con el orden en que el HTML se está transmitiendo a través de React, por favor envíame un DM. Estoy realmente curioso.

11. Challenges with CDN and Rendering

Short description:

Enviar contenido al borde a través de un CDN mientras se renderiza cerca de la base de datos es un desafío. Resolver partes estáticas y dinámicas cerca y lejos del usuario requiere una gestión cuidadosa del tráfico. Los enfoques DIY son posibles pero no recomendados debido a la dificultad y complejidad. Vercel y Netlify están liderando el camino al proporcionar soluciones más fáciles para implementar estos patrones de renderizado.

Pero parece un modelo bastante infalible.

Siguiente. ¿Cuál es la historia para el CDN que no es Vercel? Gran pregunta. Resulta que es realmente difícil enviar contenido a alguien en el borde a través de algo como un CDN mientras también se renderiza lo mismo, como el resto del contenido, cerca de tu base de datos. Así que si mi usuario está aquí, mis datos están aquí, idealmente mi servidor está justo cerca de los datos, porque habrá múltiples idas y venidas. Pero el CDN debería estar mucho más cerca de donde está el usuario. Así que ahora necesitamos tener una manera de resolver las partes estáticas cerca del usuario y resolver las partes dinámicas lejos del usuario y también entremezclar el tráfico, porque el servidor no va a saber enviar solo las partes transmitidas. Va a querer enviar todo. Puedes hacer esto tú mismo en una plataforma como Cloudflare o Fastly poniendo una función de JavaScript allí que enviará el fragmento inicial desde el CDN tan pronto como hagas una solicitud, activar tu lambda o lo que sea para comenzar a generar el resto. Consume todo hasta ese primer div oculto, y luego envía el resto de esa manera. He trabajado en hacer esto yo mismo una vez antes. No es divertido. Estoy emocionado por un futuro donde sea más fácil implementar estas cosas. Pero resulta que hacer buenos y poderosos patrones de renderizado en el lado de la infraestructura es difícil. Y hay una razón por la que Vercel es la cosa que todos terminamos usando. Sé que Netlify también está trabajando en muchas de estas cosas. Es divertido jugar con esto, pero hacerlo tú mismo no es divertido en este momento.

12. Using Suspense in Client-Side Rendering

Short description:

Usar suspense para objetos de promesa en el renderizado del lado del cliente es un patrón interesante. Permite pasar promesas del servidor al cliente y transmitir el resultado al cliente. Esto puede ayudar a mejorar el tiempo de carga inicial de una página al reducir la dependencia de la carga de JavaScript. Sin embargo, entender la jerarquía de componentes y la obtención de datos en Next.js sigue siendo un desafío.

Muy bien, el siguiente. ¿Qué piensas sobre usar suspense para manejar objetos de promesa en el renderizado del lado del cliente? Seré honesto. Más allá de cosas como React 3.0 Fiber, no he usado mucho suspense en el lado del cliente. Probablemente tuve tres o cuatro envoltorios de suspense en mis aplicaciones antes de los componentes del servidor, y todos ellos eran para carga diferida de componentes gigantes con un montón de JavaScript en ellos. Es un patrón genial. Nunca he logrado que el hook use en React se comporte correctamente. No es algo que haya explorado tanto como me hubiera gustado aún, pero parece bien.

Algo más que realmente creo que es muy genial, debería haberme centrado en la demostración. Piensa en eso para el futuro. No solo tienes la capacidad de pasar JSX desde el servidor. No es solo como, oh, renderizo algo de HTML en un suspense y baja después. También puedes tomar una promesa que está en el servidor, como la promesa de usuario que tenía, y pasar la promesa en sí al cliente a través de un componente cliente, solo como una prop. Si tengo mi getUserPromise en el servidor, paso eso a un componente cliente. Puedo envolver esa promesa en use, y ahora tengo la capacidad de obtener el resultado de la promesa transmitido al cliente en lugar de solo transmitir el JSX, lo cual es una forma realmente genial de hacer las cosas en el cliente mientras aún se obtiene los datos del servidor y se pasan.

¿Esto ayudará al LCP o solo a la velocidad percibida del sitio? Esto definitivamente ayudará al LCP. No es una ayuda masiva, pero el momento en que más ayuda es la primera vez que has cargado la página, porque ya no estás bloqueado en la carga de JavaScript y luego obteniendo el resto del contenido. Puedes pensar en ello como, antes teníamos la carga de la página. Activaría la carga de HTML. Activaría la carga de JavaScript, el CSS, y todo eso. Haría todo su análisis, y luego comenzaría a obtener. Hemos tomado esta parte y simplemente la hemos movido aquí, porque la obtención puede comenzar antes de que el navegador termine de analizar todas esas cosas. Así que la cantidad de tiempo que lleva llegar a ese estado final es mejor, pero esto solía venir al costo de tu primer Contentful Paint, porque tendrías que esperar a que el servidor se activara y comenzara a enviar una respuesta. Ahora podríamos enviar una respuesta inmediatamente y comenzar a generar el resto de la página todo simplemente desplazado. Pasamos de algo así a esto para nuestras líneas de tiempo, lo que permite que todo sea más rápido. Genial. Veamos. Vamos a encontrar uno bueno aquí. Muy bien, revisemos esto. ¿Hay una manera fácil de ver la jerarquía de componentes y entender cómo y cuándo Next.js obtiene datos y renderiza componentes? No. Este ha sido un problema del que me he quejado durante un tiempo.

13. Challenges with Next.js React Model

Short description:

La resistencia al nuevo modelo de Next.js React se debe en parte al retraso en las herramientas de desarrollo. Sin embargo, las capacidades mejoradas simplifican el código y permiten implementaciones más complejas. A pesar de los desafíos para entender la obtención de datos y la jerarquía, se están realizando esfuerzos para mejorar las herramientas de desarrollo. Comparativamente, las herramientas de desarrollo en los mundos de NUXT y Vue son envidiables.

Honestamente, creo que gran parte de la resistencia con el nuevo modelo de Next.js React proviene de que las herramientas de desarrollo no se han puesto al día tan rápido como las capacidades lo han hecho. Y cuando obtienes capacidades como esta, tu código se vuelve mucho más simple, pero tan pronto como creas herramientas que simplifican las cosas, la gente ahora puede hacer cosas cada vez más complejas, porque los primitivos básicos son mejores.

Como resultado, era fácil llegar a un punto donde realmente no sabías qué se estaba obteniendo, qué no, qué datos existían dónde, la jerarquía de todo eso en tu aplicación, y ya no podíamos simplemente depurar con herramientas de desarrollo en el navegador como estamos acostumbrados porque tus herramientas de desarrollo en el navegador no te dicen lo que el servidor está haciendo. Se está trabajando para solucionar mucho de esto. Sé que el equipo de Next. finalmente está realmente comprometido a resolver el problema de las herramientas de desarrollo, pero no está donde me gustaría que estuviera ahora mismo. Y cuando miro cosas como el mundo de NUXT y Vue, siento un poco de envidia por la calidad de sus herramientas de desarrollo.

14. Interaction with Cached Pages and SEO

Short description:

La interacción con páginas fuertemente en caché depende de dónde pongas la caché. Poner la caché frente a la respuesta HTML es inflexible y limita el estado de la página para todos los usuarios. Con el nuevo patrón, la respuesta inicial es más rápida, genérica y permite la transmisión del resto. Ahora se puede hacer caché a un nivel más granular. El SEO generalmente ha mejorado con respuestas más rápidas y mejor tiempo para LCP. Si la renderización en el servidor es la tarea más lenta, los componentes transmitidos pueden ser renderizados en el servidor en cada solicitud, reduciendo la carga en el servidor host.

Sí. OK. ¿Cómo interactúa esto con páginas fuertemente en caché? Hay muchos lugares diferentes donde puedes poner caché. Y siempre es difícil cuando la gente me pregunta sobre ello, porque no sé si estás hablando de un servicio de back-end que está obteniendo datos de una base de datos a la que estás poniendo una caché frente a las respuestas, ¿estás tratando de hacer caché de las funciones que estás llamando que obtienen datos en tu back-end para la aplicación del lado del servidor de React, o estás tratando de hacer caché del HTML que está en el frente que los usuarios están obteniendo en ese extremo?

Depende de dónde estés poniendo la caché. Encuentro que el patrón de poner la caché frente a la respuesta HTML es muy inflexible. Y requiere que toda la página sea lo suficientemente estática para que cada usuario pueda obtener el mismo HTML. Eso, por muchas razones, apesta. Significa que solo puedes tener un estado de página que cada usuario obtiene. Con este nuevo patrón, técnicamente, no estamos en caché en el sentido tradicional de CDN, pero podemos obtener esa primera respuesta mucho más rápido. Esa respuesta será genérica, pero será solo un cargador, sea cual sea el estado de la página, y el resto puede comenzar a ser transmitido, y qué partes de eso haces caché depende de ti.

Encuentro que nosotros, como desarrolladores web, hemos sido forzados a pensar en la caché como los encabezados que ponemos en nuestro HTML. Ahora podemos pensar en la caché a un nivel mucho más granular. O no. Tenemos la capacidad de elegir. De la misma manera que React nos permite elegir MVC o no, la caché ahora está dividida de manera similar. No deberíamos tener que pensar en la caché como la cosa que sucede después de que el HTML se carga. Bien, el siguiente. ¿Esto afecta al SEO? Quiero decir, estos rastreadores, quiero decir, ¿estos rastreadores son lo suficientemente pacientes para esperar el estado final? Casi todos lo son, sí. Y si no lo son, tienen suficientes datos para hacer cosas. He encontrado que el SEO en nuestras aplicaciones, a medida que comenzamos a hacer esto, ha, en su mayoría, mejorado más allá de algunos errores extraños con algunas cosas tempranas en las que estábamos trabajando. El beneficio es que puedes enviar una respuesta significativamente más rápido y el tiempo para, como, LCP es mejor también. Si estás usando esto para transmitir algo que tarda 20 segundos, no estoy seguro de cuánto le va a gustar eso a Google. Pero si tienes una página que tarda 20 segundos en cargar el contenido, el SEO es el menor de tus problemas. Cierto. Muy cierto. Último aquí. ¿Hay una manera de obtener este beneficio pero reducir la carga en el servidor host? Parece que los componentes transmitidos necesitan ser renderizados en el servidor en cada solicitud. Sí, y eso es increíble. Si lo que más tiempo lleva en tu servidor ahora mismo es la renderización en el servidor, estás trabajando en un proyecto paralelo o has optimizado al máximo tu flujo de datos. De cualquier manera, increíble.

15. Rendering on the Server and Server Runtime

Short description:

La renderización en el servidor no es una gran penalización en comparación con las múltiples solicitudes de API que un cliente tiene que hacer. Hacer múltiples solicitudes en un patrón de cascada siempre costará más en términos de tiempo de ejecución del servidor. Gracias a todos.

Pero hablando realísticamente, tener que renderizar en el servidor no es una gran penalización cuando piensas en todas las cosas que un servidor tiene que hacer. Antes, teníamos un patrón como este, donde podías obtener todos estos datos de vuelta en una sola solicitud. Tendrías que hacer que el cliente realizara múltiples solicitudes de API. Nunca he visto un mundo en el que un cliente esté solicitando datos que tienen un muro de autenticación donde no solo los está obteniendo más de 15 veces, lo que significa que cada una de esas solicitudes de obtención tiene que ser autenticada de nuevo. Y si esas 15 llamadas de autenticación son de alguna manera mágicamente más baratas que una sola renderización, me encantaría ver el código. Simplemente no es la realidad.

La realidad en la que vivo como desarrollador trabajando en aplicaciones de todos los tamaños es que cuando no puedes enviar todo a través de una sola respuesta, ahora necesitas hacer múltiples solicitudes en esa cascada de solicitudes que siempre costará más en términos de tiempo de ejecución del servidor que si simplemente enviaste lo correcto al usuario desde el principio.

Increíble. Todos, un aplauso para Theo Brown. Gracias a todos.

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

Una Guía del Comportamiento de Renderizado de React
React Advanced 2022React Advanced 2022
25 min
Una Guía del Comportamiento de Renderizado de React
Top Content
This transcription provides a brief guide to React rendering behavior. It explains the process of rendering, comparing new and old elements, and the importance of pure rendering without side effects. It also covers topics such as batching and double rendering, optimizing rendering and using context and Redux in React. Overall, it offers valuable insights for developers looking to understand and optimize React rendering.
Construyendo Mejores Sitios Web con Remix
React Summit Remote Edition 2021React Summit Remote Edition 2021
33 min
Construyendo Mejores Sitios Web con Remix
Top Content
Remix is a web framework built on React Router that focuses on web fundamentals, accessibility, performance, and flexibility. It delivers real HTML and SEO benefits, and allows for automatic updating of meta tags and styles. It provides features like login functionality, session management, and error handling. Remix is a server-rendered framework that can enhance sites with JavaScript but doesn't require it for basic functionality. It aims to create quality HTML-driven documents and is flexible for use with different web technologies and stacks.
Compilador React Forget - Entendiendo React Idiomático
React Advanced 2023React Advanced 2023
33 min
Compilador React Forget - Entendiendo React Idiomático
Top Content
Joe Savona
Mofei Zhang
2 authors
The Talk discusses React Forget, a compiler built at Meta that aims to optimize client-side React development. It explores the use of memoization to improve performance and the vision of Forget to automatically determine dependencies at build time. Forget is named with an F-word pun and has the potential to optimize server builds and enable dead code elimination. The team plans to make Forget open-source and is focused on ensuring its quality before release.
Uso efectivo de useEffect
React Advanced 2022React Advanced 2022
30 min
Uso efectivo de useEffect
Top Content
Today's Talk explores the use of the useEffect hook in React development, covering topics such as fetching data, handling race conditions and cleanup, and optimizing performance. It also discusses the correct use of useEffect in React 18, the distinction between Activity Effects and Action Effects, and the potential misuse of useEffect. The Talk highlights the benefits of using useQuery or SWR for data fetching, the problems with using useEffect for initializing global singletons, and the use of state machines for handling effects. The speaker also recommends exploring the beta React docs and using tools like the stately.ai editor for visualizing state machines.
Enrutamiento en React 18 y más allá
React Summit 2022React Summit 2022
20 min
Enrutamiento en React 18 y más allá
Top Content
Routing in React 18 brings a native app-like user experience and allows applications to transition between different environments. React Router and Next.js have different approaches to routing, with React Router using component-based routing and Next.js using file system-based routing. React server components provide the primitives to address the disadvantages of multipage applications while maintaining the same user experience. Improving navigation and routing in React involves including loading UI, pre-rendering parts of the screen, and using server components for more performant experiences. Next.js and Remix are moving towards a converging solution by combining component-based routing with file system routing.
Concurrencia en React, Explicada
React Summit 2023React Summit 2023
23 min
Concurrencia en React, Explicada
Top Content
React 18's concurrent rendering, specifically the useTransition hook, optimizes app performance by allowing non-urgent updates to be processed without freezing the UI. However, there are drawbacks such as longer processing time for non-urgent updates and increased CPU usage. The useTransition hook works similarly to throttling or bouncing, making it useful for addressing performance issues caused by multiple small components. Libraries like React Query may require the use of alternative APIs to handle urgent and non-urgent updates effectively.

Workshops on related topic

Masterclass de Depuración de Rendimiento de React
React Summit 2023React Summit 2023
170 min
Masterclass de Depuración de Rendimiento de React
Top Content
Featured Workshop
Ivan Akulov
Ivan Akulov
Los primeros intentos de Ivan en la depuración de rendimiento fueron caóticos. Vería una interacción lenta, intentaría una optimización aleatoria, vería que no ayudaba, y seguiría intentando otras optimizaciones hasta que encontraba la correcta (o se rendía).
En aquel entonces, Ivan no sabía cómo usar bien las herramientas de rendimiento. Haría una grabación en Chrome DevTools o React Profiler, la examinaría, intentaría hacer clic en cosas aleatorias, y luego la cerraría frustrado unos minutos después. Ahora, Ivan sabe exactamente dónde y qué buscar. Y en esta masterclass, Ivan te enseñará eso también.
Así es como va a funcionar. Tomaremos una aplicación lenta → la depuraremos (usando herramientas como Chrome DevTools, React Profiler, y why-did-you-render) → identificaremos el cuello de botella → y luego repetiremos, varias veces más. No hablaremos de las soluciones (en el 90% de los casos, es simplemente el viejo y regular useMemo() o memo()). Pero hablaremos de todo lo que viene antes - y aprenderemos a analizar cualquier problema de rendimiento de React, paso a paso.
(Nota: Esta masterclass es más adecuada para ingenieros que ya están familiarizados con cómo funcionan useMemo() y memo() - pero quieren mejorar en el uso de las herramientas de rendimiento alrededor de React. Además, estaremos cubriendo el rendimiento de la interacción, no la velocidad de carga, por lo que no escucharás una palabra sobre Lighthouse 🤐)
Next.js para Desarrolladores de React.js
React Day Berlin 2023React Day Berlin 2023
157 min
Next.js para Desarrolladores de React.js
Top Content
Featured WorkshopFree
Adrian Hajdin
Adrian Hajdin
En esta avanzada masterclass de Next.js, profundizaremos en conceptos clave y técnicas que permiten a los desarrolladores de React.js aprovechar al máximo Next.js. Exploraremos temas avanzados y prácticas prácticas, equipándote con las habilidades necesarias para construir aplicaciones web de alto rendimiento y tomar decisiones arquitectónicas informadas.
Al final de esta masterclass, serás capaz de:1. Comprender los beneficios de los Componentes del Servidor React y su papel en la construcción de aplicaciones React interactivas, renderizadas por el servidor.2. Diferenciar entre el tiempo de ejecución de Edge y Node.js en Next.js y saber cuándo usar cada uno en función de los requisitos de tu proyecto.3. Explorar técnicas avanzadas de Renderizado del Lado del Servidor (SSR), incluyendo streaming, fetching paralelo vs. secuencial, y sincronización de datos.4. Implementar estrategias de caché para mejorar el rendimiento y reducir la carga del servidor en las aplicaciones Next.js.5. Utilizar Acciones React para manejar la mutación compleja del servidor.6. Optimizar tus aplicaciones Next.js para SEO, compartir en redes sociales, y rendimiento general para mejorar la descubrabilidad y la participación del usuario.
Aventuras de Renderizado Concurrente en React 18
React Advanced 2021React Advanced 2021
132 min
Aventuras de Renderizado Concurrente en React 18
Top Content
Featured Workshop
Maurice de Beijer
Maurice de Beijer
Con el lanzamiento de React 18 finalmente obtenemos el tan esperado renderizado concurrente. Pero, ¿cómo va a afectar eso a tu aplicación? ¿Cuáles son los beneficios del renderizado concurrente en React? ¿Qué necesitas hacer para cambiar al renderizado concurrente cuando actualices a React 18? ¿Y qué pasa si no quieres o no puedes usar el renderizado concurrente todavía?

¡Hay algunos cambios de comportamiento de los que debes estar al tanto! En esta masterclass cubriremos todos esos temas y más.

Acompáñame con tu portátil en esta masterclass interactiva. Verás lo fácil que es cambiar al renderizado concurrente en tu aplicación React. Aprenderás todo sobre el renderizado concurrente, SuspenseList, la API startTransition y más.
Consejos sobre React Hooks que solo los profesionales conocen
React Summit Remote Edition 2021React Summit Remote Edition 2021
177 min
Consejos sobre React Hooks que solo los profesionales conocen
Top Content
Featured Workshop
Maurice de Beijer
Maurice de Beijer
La adición de la API de hooks a React fue un cambio bastante importante. Antes de los hooks, la mayoría de los componentos tenían que ser basados en clases. Ahora, con los hooks, estos son a menudo componentes funcionales mucho más simples. Los hooks pueden ser realmente simples de usar. Casi engañosamente simples. Porque todavía hay muchas formas en las que puedes equivocarte con los hooks. Y a menudo resulta que hay muchas formas en las que puedes mejorar tus componentes con una mejor comprensión de cómo se puede usar cada hook de React.Aprenderás todo sobre los pros y los contras de los diversos hooks. Aprenderás cuándo usar useState() versus useReducer(). Veremos cómo usar useContext() de manera eficiente. Verás cuándo usar useLayoutEffect() y cuándo useEffect() es mejor.
Presentando FlashList: Construyamos juntos una lista performante en React Native
React Advanced 2022React Advanced 2022
81 min
Presentando FlashList: Construyamos juntos una lista performante en React Native
Top Content
Featured Workshop
David Cortés Fulla
Marek Fořt
Talha Naqvi
3 authors
En esta masterclass aprenderás por qué creamos FlashList en Shopify y cómo puedes usarlo en tu código hoy. Te mostraremos cómo tomar una lista que no es performante en FlatList y hacerla performante usando FlashList con mínimo esfuerzo. Usaremos herramientas como Flipper, nuestro propio código de benchmarking, y te enseñaremos cómo la API de FlashList puede cubrir casos de uso más complejos y aún así mantener un rendimiento de primera categoría.Sabrás:- Breve presentación sobre qué es FlashList, por qué lo construimos, etc.- Migrando de FlatList a FlashList- Enseñando cómo escribir una lista performante- Utilizando las herramientas proporcionadas por la biblioteca FlashList (principalmente el hook useBenchmark)- Usando los plugins de Flipper (gráfico de llamas, nuestro perfilador de listas, perfilador de UI & JS FPS, etc.)- Optimizando el rendimiento de FlashList utilizando props más avanzados como `getType`- 5-6 tareas de muestra donde descubriremos y solucionaremos problemas juntos- Preguntas y respuestas con el equipo de Shopify
React, TypeScript y TDD
React Advanced 2021React Advanced 2021
174 min
React, TypeScript y TDD
Top Content
Featured Workshop
Paul Everitt
Paul Everitt
ReactJS es extremadamente popular y, por lo tanto, ampliamente soportado. TypeScript está ganando popularidad y, por lo tanto, cada vez más soportado.

¿Los dos juntos? No tanto. Dado que ambos cambian rápidamente, es difícil encontrar materiales de aprendizaje precisos.

¿React+TypeScript, con los IDEs de JetBrains? Esa combinación de tres partes es el tema de esta serie. Mostraremos un poco sobre mucho. Es decir, los pasos clave para ser productivo, en el IDE, para proyectos de React utilizando TypeScript. En el camino, mostraremos el desarrollo guiado por pruebas y enfatizaremos consejos y trucos en el IDE.