revalidateTag (invalidation du cache fetch)
fetch(url, { next: { tags: ["demo"] } }) côté serveur met en cache la réponse amont et l'indexe par tag. En cliquant sur le bouton, un POST est envoyé à une action serveur qui appelle revalidateTag("demo") — chaque entrée taguée "demo" est supprimée de FetchCache ; le prochain rendu de page re-récupère depuis l'amont.
Astuce
<code>revalidateTag</code> retourne le nombre d'entrées supprimées. Si vous obtenez <strong>0</strong> alors que le cache semblait actif, vérifiez que le tag dans le <code>fetch</code> et dans l'appel <code>revalidateTag</code> sont identiques au caractère près — la correspondance est sensible à la casse. L'invalidation ne traverse pas les workers : en cas de redémarrage du serveur, le cache est déjà vide.
Résultat
Externe (direct): 2026-06-17T13:15:31.686Z
receivedAt mis en cache: 2026-06-17T13:15:31.718Z
Comment lire ceci
- Rechargez plusieurs fois : l'horodatage externe s'actualise en direct, le
receivedAtmis en cache reste figé (dans la limite du TTL de 60 s). - Cliquez sur le bouton : l'action s'exécute côté serveur,
revalidateTag("demo")supprime l'entrée mise en cache et indique combien d'entrées ont été supprimées. - Le rechargement du loader après l'action refait une requête fraîche — le prochain
receivedAtaffiché est l'horodatage post-invalidation.
import { revalidateTag } from "@bext-stack/framework/cache";
export const dynamic = "force-dynamic";
export async function action({ request }: { request: Request }) {
const removed = revalidateTag("demo"); // returns count dropped
return { ok: true, removed };
}
export default async function Page({ actionData }: any) {
// Cached upstream fetch — receivedAt stays frozen until the tag
// is invalidated.
const r = await fetch("https://demo.bext.dev/api/echo?key=revalidate-tag", {
next: { revalidate: 60, tags: ["demo"] },
});
const data = await r.json();
return (
<div>
<p>Outer (live): {new Date().toISOString()}</p>
<p>Cached receivedAt: <strong>{data.receivedAt}</strong></p>
<form method="post">
<button type="submit">revalidateTag("demo")</button>
</form>
{actionData?.ok ? <p>Invalidated {actionData.removed} entries</p> : null}
</div>
);
}