Por qué cachear resultados de búsqueda en Next.js es mala idea
Es tentador envolver tu función de búsqueda en unstable_cache para 'ganar performance'. En la práctica, casi siempre hace más daño que bien. Aquí por qué.
17 artículos
Es tentador envolver tu función de búsqueda en unstable_cache para 'ganar performance'. En la práctica, casi siempre hace más daño que bien. Aquí por qué.
Un solo tag compartido entre funciones distintas puede invalidar el catálogo completo y cada página de producto con una sola llamada. Así se diseña esa relación.
Por separado son 3 conceptos simples. Combinados correctamente, dan páginas de producto casi instantáneas que igual reflejan cambios de stock al momento.
Le cambias un dato en la base de datos, refrescas la página y sigue mostrando lo viejo. No es un bug: son 3 capas de cache distintas trabajando en tu contra.
No es un cambio cosmético de nombre. proxy.ts corre en un runtime distinto, y el rename está directamente relacionado con una vulnerabilidad real.
Si aprendiste Prisma hace un año, este cambio de arquitectura te va a sorprender: el cliente ya no se conecta solo, necesita un adapter explícito.
Crear una orden y descontar stock parecen dos pasos separados, hasta que uno falla y el otro no. Así se evita ese estado inconsistente con Prisma.
Cachear datos personales en la capa equivocada puede filtrar el carrito de un usuario a otro. Así se distingue qué sí y qué no debe pasar por unstable_cache.
Cuatro funciones de invalidación de cache, cada una con un caso de uso distinto. Aquí la matriz de decisión que no vas a encontrar en un solo lugar de la documentación.
Proteger una ruta administrativa solo en el proxy es un solo punto de falla. Así se arma una segunda barrera independiente que no depende de la primera.
Funciones cannot be passed directly to Client Components. Este error confunde hasta a devs con experiencia. Aquí la regla mental que lo resuelve de raíz.
Llamar a una API de terceros directo desde el cliente expone tu API key en el navegador. Un Route Handler propio soluciona esto y te da control de cache.
Ambos ejecutan código en el servidor. La diferencia real no está en la sintaxis, está en quién más va a consumir esa lógica además de tu propia UI.
Un formulario con validación por campo, estado de carga y manejo de errores, sin useState ni onSubmit manual. Y sigue funcionando si el JS aún no cargó.
Un solo componente dinámico en tu layout puede volver dinámica toda tu página estática, si no lo aíslas bien. Así se evita ese efecto dominó con Suspense.
Tenía cache configurado y aun así mi base de datos se ejecutó dos veces en el mismo request. El motivo no es un bug, es una confusión muy común entre dos APIs.
Los dos hacen que tu UI se sienta más rápida durante una mutación, pero resuelven problemas distintos. Confundirlos produce UIs que parecen lentas sin serlo.