Así que no me malinterpreten. Creo que el tamaño del paquete es algo importante a considerar antes de agregar una dependencia. Pero el debate sobre lo que es ligero y lo que no lo es no es realmente el más importante cuando se trata de una pieza tan central, como tu administrador de estado envejecido, especialmente porque hay una métrica que fácilmente se pasa por alto, y es el tamaño del paquete que ahorras por el código que no tienes que escribir. Creo que una biblioteca como RackQuery realmente se paga sola, porque cuanto más la usas, más te ahorra código que no tienes que escribir tú mismo.
Así que al verificar el tamaño del paquete de una biblioteca, es importante no pensar en el tamaño que agrega inmediatamente, sino también en lo que puede ahorrarte a largo plazo. Y en esa escala, creo que RackQuery es una clara ganancia, porque la mayoría de las soluciones personalizadas probablemente serían más grandes, o podrían fallar en algunos casos extremos, porque, sí, el almacenamiento en caché y la validación del caché son realmente difíciles.
Bien, el siguiente mito que quiero analizar es el hecho de que con RackQuery ni siquiera puedes obtener datos al hacer clic en un botón. Y escucho eso mucho, y el argumento es que es difícil para RackQuery hacer obtención de datos imperativa. Y es cierto porque RackQuery es declarativo por defecto. Lo que hacemos es escribir el hook use query, y le pasamos una clave de consulta y una función de consulta, y se ejecuta automáticamente para nosotros. Ahora este código intentaría leer la consulta del caché, y si no existen, irá y los obtendrá por nosotros. Hasta ahora, eso se ve bien, pero ahora intentemos agregar algo de filtrado a nuestra lista de tareas.
Cuando agregamos un formulario de filtro, ejecutamos un callback de aplicación, y cuando se llama, queremos volver a obtener eso con esos nuevos filtros. Así que si exploramos lo que devuelve use query por nuestra cuenta, podríamos encontrar la función refetch, y podríamos querer simplemente pasar una función refetch a ella. Creo que esto parece razonable, pero excepto que refetch no toma ningún argumento, así que esto simplemente no funciona. Y entiendo la frustración por esto, pero simplemente no es como RackQuery fue diseñado para funcionar. Porque mira, si tenemos una clave codificada como tasks, y volvemos a obtener eso con diferentes argumentos, no solo sobrescribiríamos los datos que habíamos almacenado en caché para esos otros filtros, también correríamos en condiciones de carrera con ese efecto.
Así que RackQuery ha resuelto ambos problemas con el enfoque declarativo al poner todas nuestras dependencias, y eso es todo lo que usamos dentro de la función de consulta, en la clave de consulta. Y eso significa que tenemos que almacenar nuestro filtro aplicado en algún lugar, y en este ejemplo simplemente los he puesto en el estado de React. Ahora cuando esos filtros aplicados cambian, la clave cambia y RackQuery verá una nueva clave de consulta y luego obtendrá Y este enfoque nos llevará del pensamiento imperativo, como si hago clic en ese botón, quiero hacer alguna obtención, hacia la forma declarativa de quiero datos que coincidan con este estado, y cómo cambia es realmente irrelevante. Y también es relevante dónde almacenamos esos filtros aplicados.
He usado useState antes, pero en realidad es un cambio bastante directo hacer una navegación con diferentes parámetros de búsqueda si usamos algo como 10StackRouter. Esto es, por supuesto, seguro en cuanto a tipos, dependiendo del esquema de parámetros de búsqueda que hayamos definido en nuestra ruta. Y ahora obtenemos un montón de cosas gratis, como por ejemplo URLs compartibles o navegación con el botón de retroceso del navegador, lo cual creo que es realmente genial. Otra cosa genial es que si cambiamos los filtros de nuevo a algo que ya hemos buscado, como dije antes, obtenemos un resultado instantáneo. Y eso es porque RackQuery almacena todo por separado por la clave. En ese sentido es un caché de documentos simple donde las respuestas completas se almacenarán para cualquier clave dada. Así que sí, en este ejemplo esto también significa que si una tarea está tanto en estado abierto como en prioridad alta, estará en ambos cachés. Porque no hay almacenamiento en caché normalizado en RackQuery. En un caché normalizado, cada pieza de datos se almacena solo una vez, y otras partes solo la referencian para evitar esa duplicación de datos.
Comments