Al desplazarse hacia abajo, en lugar de desplazar todos los props o contenidos del elemento hacia arriba uno y agregar uno nuevo en la parte inferior, tomamos el elemento superior y lo movemos a la parte inferior, luego cambiamos el contenido de ese elemento al del nuevo ítem, dejando todos los otros elementos igual. Esa es la descripción imperativa de ello. Declarativamente, podemos hacer un poco de matemáticas para representar esa transformación funcionalmente en JSX. En el código, estoy usando un flex box para hacer esto porque es más fácil de ajustar en una diapositiva, pero transformar los ítems individuales de la lista probablemente sea marginalmente mejor.
Básicamente, dividimos el pool de elementos en dos buckets, cada uno con el mismo tamaño que nuestro pool de elementos. El primer bucket contiene ítems antes del siguiente múltiplo de nuestro tamaño de pool, y el segundo bucket contiene aquellos después. Así que si nuestro tamaño de pool es 24, el primer bucket mostrará ítems del 0 al 23, y el segundo mostraría ítems del 24 al 47. El segundo bucket siempre se muestra después del primer bucket, independientemente de dónde esté en el DOM. Luego asignamos cada ítem de la lista al primer bucket para comenzar. Luego, cuando necesitamos mover el elemento a la parte inferior debido al desplazamiento, hacemos que muestre un ítem en el segundo bucket que corresponde al índice de ese elemento en el pool.
Así que cuando inicialmente nos desplazamos hacia abajo, el primer elemento en nuestro pool transiciona de mostrar un ítem en el primer bucket a uno en el segundo bucket, y por lo tanto mostrará el ítem 24 en lugar del ítem 0. Una vez que el ítem 24 sale del viewport, mostrará el ítem 48. Luego, una vez que todos los elementos están mostrando ítems en el segundo bucket, el segundo bucket se convierte en el primer bucket, y se forma un nuevo segundo bucket para los siguientes tantos ítems que el pool pueda contener. Ahora podemos ver nuestro pool de elementos siendo tratado como un buffer circular de algún tipo y solo re-renderizando un elemento a la vez al desplazarse. Esto lleva nuestro rendimiento de desplazamiento de vuelta a 01. Agregar esta optimización produce otra mejora del 30% en el rendimiento en nuestro ejemplo del mundo real y asegura que el rendimiento se mantenga consistente con viewports grandes, como en aquellos en monitores verticales.
Finalmente, quiero hablar sobre algunas de las limitaciones más amplias que vienen con el desplazamiento virtual y algunos nuevos estándares web que buscan solucionar algunos de estos problemas. El problema fundamental con el desplazamiento virtual que no se puede solucionar solo programando mejor es que no estamos renderizando todos los elementos, por lo que esos elementos no renderizados no aparecen en la búsqueda de control F o en el árbol de accesibilidad del navegador. Esto puede causar problemas para las personas que necesitan usar lectores de pantalla, por ejemplo, y significa que siempre necesitas implementar una barra de búsqueda para listas que quieras que sean buscables.
Hay una nueva propiedad CSS llamada content visibility que surgió de algunas charlas sobre cómo mejorar el desplazamiento virtual con estándares web. Cuando este prop se establece en auto, si el elemento no está en el viewport, seleccionado, enfocado o en la capa superior, el navegador omite renderizarlo por completo. Sin embargo, el elemento todavía está en el DOM y, a diferencia de display none, todavía está en el árbol de accesibilidad y puede ser seleccionado o enfocado. El navegador puede omitir renderizar el contenido, pero el contenido todavía está allí para control F y para lectores de pantalla. El problema, sin embargo, es que todavía tienes que construir un árbol DOM con todos estos elementos en tu carga inicial, lo cual en el mundo real, desafortunadamente, sigue siendo prohibitivamente lento. No he tenido mucho tiempo para experimentar con esto, pero dado lo que he visto, no veo que el desplazamiento virtual sea destronado por esto en el corto plazo.
Dicho esto, por lo que entiendo, content visibility no fue realmente diseñado para suplantar completamente el desplazamiento virtual, y es mucho más adecuado para páginas grandes con algunas secciones grandes que se renderizarán fuera del viewport en lugar de listas con muchos ítems pequeños. Para ese caso de uso, es la herramienta perfecta para el trabajo y recomiendo encarecidamente usarla. Así que, en conclusión, las listas son realmente comunes en el desarrollo web, y espero que esta charla te haya inspirado a sacar el máximo provecho de ellas. Hay mucho rendimiento que se deja sobre la mesa con el desplazamiento tradicional, y a menudo puedes llevar el desplazamiento virtual básico más allá también. El código de muestra para las técnicas discutidas en la charla estará disponible aquí. Así que, gracias por soportar mucho código en las diapositivas y mucho arte de programador, y por supuesto por ver mi charla. Y si hay tiempo para preguntas, estaré encantado de responder algunas.
Comments