Cache ISR

bext met en cache le HTML rendu selon l'entrée [[route_rules]]. Rechargez rapidement et vous voyez le même horodatage ; attendez après ttl_ms et la prochaine requête re-rend la page. Le compteur de rendu ci-dessous est incrémenté côté serveur à chaque MISS de cache — il vit dans le store L1/L2 de la couche cache et survit au roulement des isolats V8. La réponse porte x-bext-cache: hit | stale | miss et x-bext-render-count: N.

Astuce
Avec <code>swr_ms</code> actif, le visiteur reçoit toujours une réponse instantanée (HTML périmé) même pendant le re-rendu en arrière-plan. Sans <code>swr_ms</code>, le premier visiteur après expiration attend le rendu complet. Préférez donc <code>swr_ms ≥ ttl_ms / 2</code> pour les pages à contenu non critique.

Résultat

rendu à 2026-09-06T03:49:20.751Z

rendu n° 2

Rechargez rapidement — l'horodatage reste identique. Après 60 s, le prochain rechargement déclenche un nouveau rendu et le compteur s'incrémente.

src/app/examples/isr/page.tsxTSX
// bext.config.toml
[[route_rules]]
pattern = "/**"
render = "isr"
ttl_ms = 60000   // cache for 60 s
swr_ms = 30000   // serve stale for another 30 s while revalidating

// src/app/examples/isr/page.tsx — every render stamps the current time.
// Under ISR the HTML is cached for ttl_ms; refresh inside the window
// returns the same HTML (same timestamp). 2 is
// substituted server-side with a per-route counter that bumps on every
// cache MISS — it tells you how many fresh renders this route has done
// over its lifetime, regardless of V8 isolate churn.

export default function Page() {
  const stamp = new Date().toISOString();
  return (
    <p>
      rendered at {stamp} — render #
      <Raw html="2" />
    </p>
  );
}