# revalidateTag: invalidare i dati giusti

Un tag collega una fetch alla sua invalidazione: revalidateTag cancella le voci con quel tag, non una pagina. Dove chiamarlo e cosa rompe.

> Pagina: https://ui.eneawork.it/blog/nextjs-revalidate-tag
> Markdown: https://ui.eneawork.it/blog/nextjs-revalidate-tag.md

*2026-11-01*

Un tag è un'etichetta che colleghi a una fetch, e revalidateTag invalida tutte le voci che portano quell'etichetta. Non è un refresh della pagina: è una cancellazione mirata che vale per l'intera applicazione.

## Il giro completo

// lib/products.ts export async function getProducts() { const res = await fetch("https://api.example.com/products", { next: { tags: ["products"], revalidate: 3600 }, }); return res.json(); }

L'etichetta vive nell'opzione next della fetch, non nella risposta. Ogni pagina che chiama getProducts condivide la stessa voce di cache e lo stesso tag: una sola invalidazione le copre tutte.

## Dove chiamarlo

// app/api/revalidate/route.ts import { revalidateTag } from "next/cache"; import { NextResponse } from "next/server"; const TAGS = new Set(["products", "orders"]); export async function POST(request: Request) { const secret = request.headers.get("x-revalidate-secret"); if (secret !== process.env.REVALIDATE_SECRET) { return NextResponse.json({ ok: false }, { status: 401 }); } const tag = new URL(request.url).searchParams.get("tag") ?? ""; if (!TAGS.has(tag)) { return NextResponse.json({ ok: false, reason: "unknown tag" }, { status: 400 }); } revalidateTag(tag); return NextResponse.json({ ok: true, tag }); }

Il segreto e la allowlist non sono cerimonia: chi chiama quell'endpoint può svuotare la cache. Con pochi tag, la lista chiusa costa due righe e toglie la superficie di attacco.

## La chiamata

curl -X POST "http://localhost:3000/api/revalidate?tag=products" \ -H "x-revalidate-secret: $REVALIDATE_SECRET"

## Tag, path o tempo

## Gli errori tipici

Il catalogo EneUI indicizza 111.985 componenti, 1.556 blocchi e 12.808 icone da 1.472 librerie: numeri misurati il 1 novembre 2026 su /api/stats. Nel dataset dei blocchi 316 dichiarano lucide-react e 74 react, contati il 31 ottobre 2026 su data/blocks.json.

I casi in cui un dato vecchio si nota subito sono tabelle dati, statistiche e un blocco tabella.

I livelli di cache sono in i quattro livelli di cache; il comportamento HTTP in stale-while-revalidate e header di cache. Confronto: Next.js vs Vite.

Limite noto: il Data Cache vive nel processo che ha eseguito la fetch. Con due istanze, l'invalidazione su una non tocca l'altra: serve un cache handler condiviso o un TTL breve.

## FAQ

### revalidateTag e revalidatePath sono equivalenti?

No. Il tag invalida tutte le fetch che lo portano, il path invalida la cache di una rotta. Usa il tag quando lo stesso dato alimenta più pagine.

### Posso chiamarlo da un client component?

No. La funzione gira sul server: chiamala da una Server Action o da un Route Handler, poi aggiorna il client con router.refresh.

### Perché il tag sembra non fare nulla?

Perché la fetch non è in cache. Da Next.js 15 la cache è opt-in: aggiungi next.revalidate o cache force-cache alla fetch.

### Quanti tag servono?

Uno per entità che cambia insieme. Se due dati si aggiornano sempre nello stesso momento, un tag solo evita invalidazioni doppie.

### Il tag è per lingua?

Non lo è per default. Se il contenuto cambia per locale, includi il locale nel nome, per esempio products-it.
