Búsqueda solo con CSS*: ¡Mejora el rendimiento de filtrado en React con CSS!

Rate this content
Bookmark

Trabajando en emoji-picker-react me encontré con un desafío: filtrar la lista de 1800 emojis provocaba un retraso significativo debido a las nuevas renderizaciones.

¡Aprendamos cómo solucioné esto solo usando CSS!

This talk has been presented at React Day Berlin 2023, check out the latest edition of this React Conference.

FAQ

Evitar Alus es un ingeniero frontend que trabaja en Meda en Tel Aviv y es autor de varios paquetes de código abierto, incluyendo el paquete emoji-pkreact para aplicaciones React.

Emoji-pkreact es un paquete desarrollado por Evitar Alus que permite integrar fácilmente emojis en aplicaciones web React.

Uno de los problemas iniciales con emoji-pkreact fue que la búsqueda de emojis era extremadamente lenta, lo que afectaba el rendimiento general del paquete.

Evitar mejoró el rendimiento utilizando un selector de atributos en CSS para filtrar emojis basados en sus nombres, evitando la necesidad de actualizar todos los emojis y reduciendo la manipulación del DOM.

Se utilizó un selector de atributos CSS que permite seleccionar elementos basados en el valor de un atributo, aplicando estilos de ocultación a los emojis que no coinciden con la consulta de búsqueda.

El desafío adicional fue manejar las categorías vacías que quedaban visibles después de filtrar los emojis. Esto se resolvió usando un nuevo pseudo selector CSS 'Has', que oculta las categorías que no tienen emojis coincidentes.

La estrategia de filtrado oculta automáticamente las categorías que no contienen ningún emoji que coincida con la consulta de búsqueda, mejorando así la claridad y la eficiencia de la interfaz.

La optimización resultó en una mejora significativa del rendimiento, casi eliminando los retrasos al buscar y filtrar emojis, incluso en dispositivos con menor capacidad de procesamiento.

Evyatar Alush
Evyatar Alush
11 min
12 Dec, 2023

Comments

Sign in or register to post your comment.
Video Summary and Transcription
Evitar Alus, un ingeniero de frontend, comparte un truco para mejorar el rendimiento de búsqueda en las aplicaciones de React optimizando el algoritmo de búsqueda y reduciendo las actualizaciones del DOM. Los selectores de atributos CSS pueden usarse para filtrar y aplicar estilos basados en los valores de los emojis. Se puede crear un componente llamado Búsqueda CSS para mejorar el rendimiento de la búsqueda ocultando los emojis que no coinciden con la consulta de búsqueda. A pesar de algunas desventajas de rendimiento, esta solución funciona significativamente más rápido. Visita el sitio web de Evitar Alus o su cuenta de Twitter para ver más de su trabajo.

1. Mejorando el rendimiento de búsqueda en aplicaciones React

Short description:

Soy Evitar Alus, un ingeniero frontend en Meda en Tel Aviv y el autor del paquete de código abierto emoji-pkreact. Quiero compartir un truco para mejorar el rendimiento de búsqueda en las aplicaciones React. Inicialmente, enfrenté problemas de rendimiento debido al gran número de emojis y la compleja gestión del estado. La barra de búsqueda y los emojis estaban distantes en el árbol React, causando retrasos. Hice mejoras en el algoritmo de búsqueda y reduje las actualizaciones del DOM, lo que resultó en un rendimiento más rápido. Permíteme mostrarte la diferencia y explicar cómo lo logré.

Hola a todos. ¿Cómo están? Mi nombre es Evitar Alus. Soy un ingeniero frontend en Meda en Tel Aviv y soy el autor de varios paquetes de código abierto, uno de los cuales es este pequeño paquete genial llamado emoji-pkreact que te permite poner un emoji-pkreact directamente en tu aplicación React en la web con facilidad.

Y hoy quiero compartir con ustedes un pequeño truco que se me ocurrió para mejorar la búsqueda y el performance en las aplicaciones React y los paquetes React. Y cuando comencé a construir emoji-pkreact allá por 2017, pensé que sería bastante sencillo construir un componente emoji-pkreact con todas las características de un emoji-pkreact esperado que también fuera eficiente y fácil de usar. Y casi inmediatamente comencé a recibir problemas sobre el performance, por ejemplo, que la búsqueda es extremadamente lenta y, obviamente, mi respuesta fue que no se reproduce. Obviamente, eso estaba mal.

La búsqueda era realmente lenta. Y la razón es bastante comprensible. Verás, tenemos aproximadamente 1800 emojis diferentes que se muestran en el Emoji Picker. Y cuando interactúas con cada uno de ellos, tienes algunas actualizaciones de estado. Entonces, por ejemplo, cuando pasas el cursor o cuando escribes algo en la búsqueda, haces cambios en el DOM y en los elementos. Y cuando tratas con tantos elementos, y cuando tienen tantos estados diferentes en los que pueden estar, puede ser bastante intenso trabajar con ellos. Y especialmente aquí, vemos que la barra de búsqueda está aquí arriba y los emojis están allí. Lo que significa que están muy distantes en el árbol React. Lo que significa que tenemos que tener un estado de Emoji Picker React casi global para gestionar las capacidades de filtrado. Y luego, cuando escribimos algún carácter dentro del Emoji Picker, actualizamos el estado, ejecutamos algún algoritmo de búsqueda que intento hacer eficiente, y luego React va y hace la diferenciación del DOM y luego solo aplica los cambios al DOM, y cada uno de estos pasos lleva tiempo. Y cuando tratamos con 1800 emojis, eso lleva mucho tiempo.

Ahora, si miras ahora, parece bastante inmediato. Funciona bastante rápido, pero quiero mostrarte solo por un segundo cómo se sentía antes de que Emoji Picker React tuviera estas capacidades y la búsqueda mejorada. Así que escribiré algo y notarás un ligero retraso, incluso en mi MacBook Pro. ¿Lo sentiste? Hubo algún retraso entre mi carácter siendo escrito y los cambios apareciendo en la pantalla, y eso es un MacBook Pro de alta gama. Intentemos hacer algunas desaceleraciones, así que 6x de desaceleración para simular una máquina más antigua, o más lenta, y veamos cómo se siente realmente para un usuario en la naturaleza. ¿Y viste eso, verdad? Eso no es ideal. Tenemos que arreglar esto. Solo para mostrarte lo que realmente está pasando cuando escribimos cada carácter, cuando escribimos cada carácter, realmente salimos y volvemos a renderizar todo. Y la razón es, nuevamente, que tenemos ese estado de árbol de nivel superior y que realmente tenemos que modificar todos los elementos en el DOM. ¿Pero realmente tenemos que hacerlo? Y esto es lo que quería averiguar. ¿Realmente tengo que manipular el DOM y cambiar todos los emojis solo para hacerlos desaparecer? ¿O tal vez puedo de alguna manera saltármelo? Así que fui a mirar los elementos emoji reales que creé y lo que tengo aquí, cada emoji es un componente de botón o un elemento de botón y tienen una imagen dentro de ellos. A veces tienen un span con un carácter emoji.

2. Uso de selectores de atributos CSS para filtrar

Short description:

Depende de la configuración del usuario. Cada emoji tiene una etiqueta de área y un nombre completo para la accesibilidad y la búsqueda. Podemos usar selectores de atributos CSS para aplicar estilos basados en estos valores. Actualicemos nuestro componente de búsqueda para usar el estado local en lugar del estado global. Al establecer un valor, podemos aplicar filtros al selector de emojis.

Depende de la configuración del usuario. Pero cada uno de ellos tiene una etiqueta de área para accessibility, y también el nombre completo del emoji, porque un emoji puede tener varios nombres para la búsqueda. Y dado el hecho de que ya tengo toda esta información en el DOM, ¿quizás puedo hacer uso de ella para el filtrado también? Aparentemente puedo y aparentemente es bastante fácil.

En CSS tenemos algo que se llama un selector de atributos que nos permite seleccionar un atributo arbitrario y basado en su valor aplicar estilos a los elementos. Así que esto significa que puedo establecer un selector basado en el nombre completo, la propiedad data o basado en la etiqueta de área. Y solo quiero mostrarles cómo se hace y lo fácil que es implementarlo.

Así que aquí está nuestro componente de búsqueda. Actualmente funciona actualizando el estado global pero en lugar de hacer eso, no lo hagamos más. Y en su lugar, tengamos algunos estados locales. Así que importemos useState. Así que import useState de React y luego establezcamos este estado. Así que const value setValue equals useState. Debería ser indefinido y también inicialicémoslo a indefinido o string. Sí, genial. Y ahora todo lo que tenemos que hacer aquí es establecer un valor y si volvemos a mirar el selector de emojis veremos que escribir no hace nada más que ocultar las categorías. Y la razón es porque aún no aplicamos nada de él.

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

Construir un Sistema de Diseño con React y Tailwind CSS
React Summit 2022React Summit 2022
27 min
Construir un Sistema de Diseño con React y Tailwind CSS
Top Content
This Talk discusses design systems and how to build one using React and Tailwind CSS. Tailwind CSS provides utility classes for building complex layouts without writing CSS rules. Custom colors can be added to the Tailwind CSS config file, and font styles and text sizes can be customized. The entire Tailwind CSS configuration can be customized to meet specific requirements. Base styles can be added to the config file itself using a plugin. Reusable components can be created with Tailwind CSS, allowing for easy customization of size and color.
Cómo lograr la composición de diseño en React
React Summit 2022React Summit 2022
8 min
Cómo lograr la composición de diseño en React
This talk discusses achieving layout composition in React using Bedrock Layout Primitives. By componentizing CSS layout, complex layouts can be achieved and reused across different components. The talk also covers the challenges of achieving complex layouts, such as card lineups, and provides solutions for maintaining alignment and responsiveness. The BedrockLayout primitive library simplifies web layouts and offers flexibility in composing layouts.
Estilo Seguro para Paquetes de Componentes React: Vanilla Extract CSS
React Advanced 2023React Advanced 2023
19 min
Estilo Seguro para Paquetes de Componentes React: Vanilla Extract CSS
Today's Talk introduces Vanilla Extract CSS, a type-safe styling method for React applications. It combines the benefits of scoped styling, zero runtime overhead, and a great developer experience. Vanilla Extract generates a static CSS file at build time, resulting in better performance. It is framework agnostic and offers a powerful toolkit, including Sprinkles for utility classes and CSS utils for calculations. With type safety and the ability to define themes and variants, Vanilla Extract makes it easy to create efficient, scalable, and maintainable design system component packages.
Pasando de Css-In-Js en tiempo de ejecución a gran escala
React Summit 2023React Summit 2023
29 min
Pasando de Css-In-Js en tiempo de ejecución a gran escala
This Talk explores the evolution of styling architecture, dynamic theming with style components, and optimizing style updates. It discusses the challenges of CSS migration and the choice between JavaScript and CSS native tooling. The Talk also touches on CSS tools and libraries, including Tailwind CSS and CSS in JS major libraries like MUI. The importance of picking a stack based on team members' strengths and the use of namespacing CSS for conflict-free dependency trees are highlighted.
Construyendo Componentes de IU Perfectos con Variables CSS
React Summit 2023React Summit 2023
9 min
Construyendo Componentes de IU Perfectos con Variables CSS
CSS variables and their possibilities for UI developers, MUI's history and understanding of developer needs, Joy UI's focus on developer experience and use of CSS variables for consistency and future-proofing, the elimination of manual calculations and JavaScript with CSS variables in JoyUI, and the availability of playgrounds and a stable release for exploration.

Workshops on related topic