Files
mercadodevida/work/artifacts/F-132/architect.md
2026-08-21 17:45:12 +02:00

2.9 KiB

F-132 — Frontend home DYNAMIC_SERVER_USAGE

Diagnóstico

Build del frontend (Turbopack) emitía dos DYNAMIC_SERVER_USAGE para /:

Route / couldn't be rendered statically because it used revalidate: 0 fetch
http://192.168.18.93:3000/products/search?limit=8

Route / couldn't be rendered statically because it used no-store fetch
http://192.168.18.93:3000/categories/tree

Causa: frontend/src/lib/api.ts declaraba cache: 'no-store' en todas las funciones de fetching (fetchCategories, fetchProducts, etc.). Esto fuerza render dinámico en cualquier página que las llame, anulando el export const revalidate = 3600 de app/page.tsx.

Adicionalmente, 4 warnings de Turbopack sobre filesystem access dinámico en frontend/src/app/uploads/[...path]/route.ts (path.join(root, filename) con root variable desde UPLOAD_ROOTS).

Diseño

frontend/src/lib/api.ts

  • Quitar cache: 'no-store' de las funciones que se llaman desde server components (fetchCategories, fetchProducts, fetchBrandBySlug, fetchPage, fetchBrands, fetchCategoryBySlug, fetchProductBySlug, fetchProductVariants, fetchVariantPrice, fetchStockAvailability).
  • Mantener cache: 'no-store' solo en fetchSearchSuggestions (llamada por componentes cliente / barra de búsqueda que necesitan datos frescos).

Páginas server-rendered

Añadir export const revalidate = 3600 a:

  • frontend/src/app/products/page.tsx
  • frontend/src/app/products/[slug]/page.tsx
  • frontend/src/app/categories/page.tsx
  • frontend/src/app/categories/[slug]/page.tsx
  • frontend/src/app/brands/page.tsx
  • frontend/src/app/brands/[slug]/page.tsx

Búsqueda

  • frontend/src/app/search/page.tsx: export const dynamic = 'force-dynamic' (searchParams dinámicos, no se cachea).

Uploads route

  • Añadir comentarios /*turbopackIgnore: true*/ dentro de las llamadas path.join(...) que usan variables runtime (root, original.root, cacheDir) en frontend/src/app/uploads/[...path]/route.ts. La página ya es force-dynamic así que los warnings son puramente de análisis estático.

Riesgos

  • Bajo. Cambio de comportamiento: las páginas con datos pasarán a ISR (cache 1h). Si el operador crea un producto, no aparece en la web hasta 1h después.
  • Mitigación: para invalidación inmediata el backend ya soporta revalidatePath desde admin (futuro). Por ahora se acepta 1h de stale.
  • Búsqueda sigue siendo force-dynamic (datos frescos siempre).

Plan

  1. Editar frontend/src/lib/api.ts (quitar cache: 'no-store' de las 10 funciones server-side).
  2. Añadir revalidate = 3600 a las 6 páginas listadas.
  3. Añadir force-dynamic a /search.
  4. Añadir comentarios turbopackIgnore a uploads/route.ts.
  5. cd frontend && npx tsc --noEmit.
  6. cd frontend && NEXT_PUBLIC_API_URL=… npm run build.
  7. Verificar: Route / ahora es ○ Static con Revalidate 1h.
  8. Verificar: 0 errores DYNAMIC_SERVER_USAGE, 0 warnings de filesystem.
  9. Cerrar gates.