# 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.