Desplazamiento Virtual Rápido y Flexible con Programación Funcional

Rate this content
Bookmark

El desplazamiento virtual es una forma ingeniosa de reducir la sobrecarga de renderizado, y es especialmente útil a medida que aumenta la complejidad de los sitios web. Aunque hay muchas bibliotecas plug-and-play que soportan el desplazamiento virtual en varios frameworks, crear el tuyo propio es sorprendentemente fácil. Además, esto permite optimizar al máximo cada viewport para su contenido, desbloqueando ahorros adicionales de rendimiento.

En esta charla, aprenderás cómo crear un viewport de desplazamiento virtual flexible desde cero, y hacerlo eficiente utilizando conceptos de programación funcional. Seguiremos una implementación de un viewport de desplazamiento virtual usando componentes web de principio a fin, incluyendo alturas de elementos variables, skeletons, renderizado asíncrono de componentes hijos. Luego lo optimizaremos usando memoization, envolviendo constructos imperativos más eficientes en una capa funcional, y usando reciclaje de elementos para reducir significativamente el churn de renderizado al usar componentes hijos sin estado.

Finalmente, tocaremos el estado del arte en el renderizado del DOM virtual, y cómo este enfoque se compara con el uso de la nueva propiedad CSS `content-visibility`.

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

Adam Niederer
Adam Niederer
16 min
21 Nov, 2024

Comments

Sign in or register to post your comment.
Video Summary and Transcription
La charla de hoy se centra en implementar el desplazamiento virtual para mejorar el rendimiento y la flexibilidad de las listas. El proceso implica calcular la altura del viewport, la posición de desplazamiento y la altura de cada elemento de la lista. Al renderizar solo los elementos dentro del viewport, se mejora la carga inicial de la página y el rendimiento del desplazamiento. Se discuten varias técnicas de optimización, incluyendo memoization, búsqueda binaria y renderizado diferido. Estas técnicas mejoran significativamente el rendimiento del desplazamiento y proporcionan una mejor experiencia de usuario. Técnicas adicionales como el uso de skeletons, agrupación de elementos y pureza funcional pueden optimizar aún más el renderizado. Técnicas avanzadas, como mover elementos dentro del pool y usar la visibilidad de contenido, ofrecen mejoras sustanciales en el rendimiento. Sin embargo, la visibilidad de contenido es más adecuada para páginas grandes con pocas secciones grandes. En general, la charla ofrece valiosos conocimientos sobre el desplazamiento virtual y sus limitaciones.

1. Introducción al desplazamiento virtual

Short description:

Hoy vamos a implementar una lista con desplazamiento virtual básico desde cero, luego hablaremos sobre las mejoras que podemos hacer para aumentar la flexibilidad y usabilidad de la lista, y luego haremos que la lista sea lo más rápida posible. El desplazamiento virtual ayuda a mejorar tanto la carga inicial de la página como el rendimiento del desplazamiento. Para calcular qué tan altos son los elementos, qué elementos renderizar y dónde renderizarlos, necesitamos la altura del viewport, la posición de desplazamiento y la altura de un elemento individual en la lista. Vamos a codificarlo calculando la altura total de los elementos y determinando qué elementos renderizar en función del viewport y la posición de desplazamiento.

♪♪ Hola, soy Adam, y bienvenidos a mi charla sobre desplazamiento virtual. Hoy vamos a implementar una lista con desplazamiento virtual básico desde cero, luego hablaremos sobre las mejoras que podemos hacer para aumentar la flexibilidad y usabilidad de la lista, y luego haremos que la lista sea lo más rápida posible. Esta charla te ayudará a entender cómo funciona el desplazamiento virtual y podría ayudarte a obtener unos cuantos fotogramas por segundo más, incluso si estás usando una biblioteca. Así que empecemos.

Para cada viewport desplazado, virtual o no, hay dos partes clave. Un elemento de viewport exterior que tiene una altura, y un elemento interior o lista de elementos que tiene una altura mayor. Si fuera más corto, no habría necesidad de desplazarse, por supuesto. Las listas desplazadas tradicionales renderizan todos sus elementos en el DOM, incluso aquellos que no son visibles, lo que puede causar retraso tanto al renderizar esa lista inicialmente como al desplazarse. El desplazamiento virtual, por otro lado, solo renderiza los elementos que se están viendo en ese momento. Esto nos ayuda a mejorar tanto la carga inicial de la página como el rendimiento del desplazamiento. Usualmente, cuando el tamaño de tu lista alcanza los tres dígitos, es momento de empezar a pensar en el desplazamiento virtual, dependiendo de cuánto tiempo tome renderizar tus elementos individuales. Así que echemos un vistazo a cómo desplazar virtualmente una lista.

Primero, hagamos un producto mínimo viable súper básico. Para esto, voy a asumir que todos los elementos de la lista tendrán la misma altura, pero volveremos a esto un poco más tarde. Para desplazar algo virtualmente, en realidad solo necesitamos calcular tres cosas. Uno, ¿qué tan alto es lo que estamos renderizando? Dos, ¿qué elementos en la lista deberían ser renderizados? Y tres, ¿qué tan abajo dentro del elemento interior deberíamos renderizarlo para que se alinee con el viewport? Para calcular estas tres cosas, vamos a necesitar tres piezas de datos del DOM. Primero, la altura del viewport. Autoexplicativo. Luego, necesitamos la posición de desplazamiento, que es la distancia desde la parte superior del viewport hasta la parte superior del elemento interior. Podemos obtener esto de la propiedad scroll-top del viewport. Finalmente, necesitaremos la altura de un elemento individual en la lista, inclusivo de bordes y márgenes. Todos tienen el mismo tamaño en este ejemplo, así que eso es bastante fácil. Ahora vamos a codificarlo.

Así que lo primero que necesitamos calcular es la altura total de lo que estamos renderizando, que establecemos como la altura del elemento interior. El navegador no puede hacerlo por ti como en el desplazamiento tradicional porque no estamos renderizando todos los elementos a la vez. Así que para nuestra lista básica, podemos establecerlo como la altura de un elemento multiplicada por el número de elementos. Luego, necesitamos determinar qué elementos estamos renderizando. Para esto, necesitamos la altura del viewport y la posición de desplazamiento dentro del viewport. A partir de eso, el índice del primer elemento que queremos renderizar es el piso de la posición de desplazamiento dividida por la altura de cada elemento.

2. Implementing Virtual Scrolling

Short description:

Solo renderizamos los elementos desde nuestros índices de inicio hasta fin y movemos los elementos de la lista a la parte del elemento interior que se muestra en el viewport. Para soportar alturas variables de los elementos, calculamos la suma acumulativa de las alturas de los elementos de la lista y encontramos los índices de inicio y fin basados en la posición de desplazamiento y la altura del viewport.

Así que ahora nuestro código se verá un poco así. Solo renderizamos los elementos desde nuestros índices de inicio hasta fin, y para reaccionar al desplazamiento, simplemente podemos usar algún estado reactivo. La altura del viewport se puede hacer con un ref, que no estoy mostrando aquí.

Por supuesto, no queremos renderizar todos estos elementos al principio del elemento interior todo el tiempo. Ahora necesitamos mover los elementos de la lista hacia abajo a la parte del elemento interior que se está mostrando en el viewport. Afortunadamente, eso es fácil. Tradúcelo por el índice de inicio multiplicado por la altura de los elementos de la lista. Hecho. Eso es todo lo que necesitas para tener una lista con desplazamiento virtual funcional. El código cabe en una diapositiva.

Hay algunos puntos que podemos mejorar para hacer la lista más flexible para trabajar, sin embargo, y mejorar la experiencia del usuario al desplazarse por la lista. Así que echemos un vistazo a eso ahora. La mayor limitación es que todos los elementos tienen que ser de la misma altura. Así que vamos a solucionar eso. Para soportar alturas variables de los elementos, lo principal que necesitamos cambiar es nuestro método de encontrar los primeros y últimos elementos para renderizar. En lugar de hacer una división básica, primero necesitamos calcular la suma acumulativa de las alturas de nuestros elementos de la lista. Luego, para calcular nuestro índice de inicio, tomamos nuestra posición de desplazamiento y encontramos el índice del número más grande que es menor que nuestra posición de desplazamiento en nuestras alturas acumuladas. El índice de ese número es nuestro índice de inicio. Para el índice de fin, queremos hacer algo similar. Queremos tomar nuestra posición de desplazamiento más la altura de nuestro viewport, luego encontrar el número más pequeño que es mayor que esa suma en nuestras alturas acumuladas.

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.
Acelerando tu aplicación React con menos JavaScript
React Summit 2023React Summit 2023
32 min
Acelerando tu aplicación React con menos JavaScript
Top Content
Mishko, the creator of Angular and AngularJS, discusses the challenges of website performance and JavaScript hydration. He explains the differences between client-side and server-side rendering and introduces Quik as a solution for efficient component hydration. Mishko demonstrates examples of state management and intercommunication using Quik. He highlights the performance benefits of using Quik with React and emphasizes the importance of reducing JavaScript size for better performance. Finally, he mentions the use of QUIC in both MPA and SPA applications for improved startup performance.
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.
Sistemas de Diseño: Caminando la Línea Entre Flexibilidad y Consistencia
React Advanced 2021React Advanced 2021
47 min
Sistemas de Diseño: Caminando la Línea Entre Flexibilidad y Consistencia
Top Content
The Talk discusses the balance between flexibility and consistency in design systems. It explores the API design of the ActionList component and the customization options it offers. The use of component-based APIs and composability is emphasized for flexibility and customization. The Talk also touches on the ActionMenu component and the concept of building for people. The Q&A session covers topics such as component inclusion in design systems, API complexity, and the decision between creating a custom design system or using a component library.
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.
El Futuro de las Herramientas de Rendimiento
JSNation 2022JSNation 2022
21 min
El Futuro de las Herramientas de Rendimiento
Top Content
Today's Talk discusses the future of performance tooling, focusing on user-centric, actionable, and contextual approaches. The introduction highlights Adi Osmani's expertise in performance tools and his passion for DevTools features. The Talk explores the integration of user flows into DevTools and Lighthouse, enabling performance measurement and optimization. It also showcases the import/export feature for user flows and the collaboration potential with Lighthouse. The Talk further delves into the use of flows with other tools like web page test and Cypress, offering cross-browser testing capabilities. The actionable aspect emphasizes the importance of metrics like Interaction to Next Paint and Total Blocking Time, as well as the improvements in Lighthouse and performance debugging tools. Lastly, the Talk emphasizes the iterative nature of performance improvement and the user-centric, actionable, and contextual future of performance tooling.

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 WorkshopFree
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 🤐)
Domina los Patrones de JavaScript
JSNation 2024JSNation 2024
145 min
Domina los Patrones de JavaScript
Top Content
Featured Workshop
Adrian Hajdin
Adrian Hajdin
Durante esta masterclass, los participantes revisarán los patrones esenciales de JavaScript que todo desarrollador debería conocer. A través de ejercicios prácticos, ejemplos del mundo real y discusiones interactivas, los asistentes profundizarán su comprensión de las mejores prácticas para organizar el código, resolver desafíos comunes y diseñar arquitecturas escalables. Al final de la masterclass, los participantes ganarán una nueva confianza en su capacidad para escribir código JavaScript de alta calidad que resista el paso del tiempo.
Puntos Cubiertos:
1. Introducción a los Patrones de JavaScript2. Patrones Fundamentales3. Patrones de Creación de Objetos4. Patrones de Comportamiento5. Patrones Arquitectónicos6. Ejercicios Prácticos y Estudios de Caso
Cómo Ayudará a los Desarrolladores:
- Obtener una comprensión profunda de los patrones de JavaScript y sus aplicaciones en escenarios del mundo real- Aprender las mejores prácticas para organizar el código, resolver desafíos comunes y diseñar arquitecturas escalables- Mejorar las habilidades de resolución de problemas y la legibilidad del código- Mejorar la colaboración y la comunicación dentro de los equipos de desarrollo- Acelerar el crecimiento de la carrera y las oportunidades de avance en la industria del software
React Patterns Made Simple
React Day Berlin 2024React Day Berlin 2024
62 min
React Patterns Made Simple
Featured Workshop
Adrian Hajdin
Adrian Hajdin
Aprende patrones de React ampliamente utilizados, incluyendo HOCs, Compound Components, Provider Patterns, Functions as Child, y Portals, para escribir código más limpio y eficiente y crear aplicaciones escalables y mantenibles.Visión general En esta masterclass, los espectadores aprenderán sobre patrones clave de React que pueden hacer su código más eficiente, legible y mantenible. Presentaremos cada patrón, explicaremos cómo funciona y demostraremos ejemplos prácticos. Al final de la sesión, los participantes tendrán una comprensión sólida de cómo usar estos patrones en sus proyectos.Objetivos de aprendizajeHOCs Compound Components Provider Patterns Functions as Child Portals Modularidad Mantenibilidad Aplicación en el mundo real.
Construyendo aplicaciones web que iluminan Internet con QwikCity
JSNation 2023JSNation 2023
170 min
Construyendo aplicaciones web que iluminan Internet con QwikCity
Featured WorkshopFree
Miško Hevery
Miško Hevery
Construir aplicaciones web instantáneas a gran escala ha sido elusivo. Los sitios del mundo real necesitan seguimiento, análisis y interfaces y interacciones de usuario complejas. Siempre comenzamos con las mejores intenciones pero terminamos con un sitio menos que ideal.
QwikCity es un nuevo meta-framework que te permite construir aplicaciones a gran escala con un rendimiento de inicio constante. Veremos cómo construir una aplicación QwikCity y qué la hace única. El masterclass te mostrará cómo configurar un proyecto QwikCity. Cómo funciona el enrutamiento con el diseño. La aplicación de demostración obtendrá datos y los presentará al usuario en un formulario editable. Y finalmente, cómo se puede utilizar la autenticación. Todas las partes básicas para cualquier aplicación a gran escala.
En el camino, también veremos qué hace que Qwik sea único y cómo la capacidad de reanudación permite un rendimiento de inicio constante sin importar la complejidad de la aplicación.
Next.js 13: Estrategias de Obtención de Datos
React Day Berlin 2022React Day Berlin 2022
53 min
Next.js 13: Estrategias de Obtención de Datos
Top Content
WorkshopFree
Alice De Mauro
Alice De Mauro
- Introducción- Prerrequisitos para la masterclass- Estrategias de obtención: fundamentos- Estrategias de obtención – práctica: API de obtención, caché (estática VS dinámica), revalidar, suspense (obtención de datos en paralelo)- Prueba tu construcción y sírvela en Vercel- Futuro: Componentes de servidor VS Componentes de cliente- Huevo de pascua de la masterclass (no relacionado con el tema, destacando la accesibilidad)- Conclusión
Depuración del Rendimiento de React
React Advanced 2023React Advanced 2023
148 min
Depuración del Rendimiento de React
Workshop
Ivan Akulov
Ivan Akulov
Los primeros intentos de Ivan en la depuración de rendimiento fueron caóticos. Veía una interacción lenta, probaba una optimización aleatoria, veía que no ayudaba, y seguía probando 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. Hacía una grabación en Chrome DevTools o React Profiler, la examinaba, intentaba hacer clic en cosas al azar, y luego la cerraba 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 cómo 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, cubriremos el rendimiento de interacción, no la velocidad de carga, por lo que no escucharás una palabra sobre Lighthouse 🤐)