Routage & Rendu
Les routes vivent dans src/app/ sous la forme d'un arbre fondé sur les fichiers. L'imbrication des
répertoires correspond à l'imbrication des URL, et des noms de fichiers spéciaux définissent ce que
rend chaque segment.
Fichiers de route
| Fichier | Rôle |
|---|---|
page.tsx |
La page. L'export par défaut est le composant Page ; props { params, searchParams, data?, actionData? }. |
layout.tsx |
Enveloppe son sous-arbre : ({ children, route }) => Renderable. S'imbrique par répertoire. Le layout racine possède <html>. |
route.ts |
Route API. Exportez GET / POST / PUT / DELETE / … chacune de type (request: Request) => Response. |
loading.tsx |
Fallback Suspense pour le segment. |
error.tsx |
Frontière d'erreur : ({ error, reset, route }). |
not-found.tsx |
Rendue pour un 404 dans le segment. |
template.tsx |
Comme un layout, mais une instance neuve à chaque navigation. |
Un fichier de route peut aussi exporter des fonctions de données (loader / action) — voir
Loaders & Actions.
Le composant Page
L'export par défaut de page.tsx reçoit :
/** @jsxImportSource @bext-stack/framework */
export default function Page({ params, searchParams, data, actionData }) {
return <h1>Hello {params.slug}</h1>;
}
La Page ne voit jamais la request brute — seuls loader et action la voient. Lisez-y les
cookies et en-têtes, puis transmettez ce dont vous avez besoin via data / actionData.
Routes dynamiques, catch-all, groupes et parallèles
| Motif | Signification | URL d'exemple |
|---|---|---|
[slug] |
Segment dynamique → params.slug |
/posts/hello |
[...slug] |
Catch-all → params.slug (tableau) |
/docs/a/b/c |
(group) |
Regroupement uniquement — aucun effet sur l'URL | — |
@name/page.tsx |
Emplacement de route parallèle nommée | rendue dans un emplacement |
Métadonnées
Ajoutez des balises head avec un export metadata, ou generateMetadata() quand elles dépendent de
la requête ou des données chargées :
export const metadata = {
title: "Posts",
description: "All posts",
};
// or, dynamic:
export function generateMetadata({ params, data }) {
return { title: data.post.title };
}
Modes de rendu
Le mode de rendu se définit dans bext.config.toml :
[rendering]
mode = "isr" # "isr" | "ssr"
revalidate = 60 # seconds
ssr— rendu à chaque requête.isr— régénération statique incrémentale : met en cache le rendu, revalide aprèsrevalidatesecondes et sert stale-while-revalidate entre-temps.
Les valeurs ISR par défaut globales sont ttl 60 s et swr 1 h.
En ISR, une route qui exporte un loader ou une action contourne automatiquement le cache
ISR et se rend fraîchement à chaque requête (le SWR borne toujours l'obsolescence). Les données
dynamiques, propres à chaque requête, sont donc toujours à jour sans configuration supplémentaire.
Désactiver la mise en cache
export const dynamic = "force-dynamic";
force-dynamic exclut entièrement la route de la mise en cache.
Streaming
Le SSR en streaming est automatique ou opt-in. Une route est diffusée en streaming dès que l'une de ces conditions est vraie :
- elle importe Suspense,
- elle a un
loading.tsx, - un composant est un générateur asynchrone, ou
- elle exporte
export const renderingMode = "streaming".
Helpers de réponse
Le framework exporte des helpers pour construire des réponses et revalider les routes en cache :
import {
json, html, text, xml, redirect, notFound, cached,
revalidatePath, revalidateTag,
} from "@bext-stack/framework";
| Helper | Usage |
|---|---|
json, html, text, xml |
Construire une Response typée avec le bon content type. |
redirect |
Retourner une Response de redirection. |
notFound |
Retourner une Response 404. |
cached |
Envelopper une réponse avec une sémantique de cache. |
revalidatePath(path) |
Invalider une route en cache par chemin. |
revalidateTag(tag) |
Invalider des routes en cache par tag. |
Retourner ou lancer une Response depuis un loader ou une action court-circuite le rendu de
la page — voir Loaders & Actions.
Et ensuite
| Page | Ce qu'elle couvre |
|---|---|
| Loaders & Actions | Chargement de données, mutations, accès à la requête/session |
| Présentation du SDK | Structure d'un site, le SDK en loopback, l'intégration de packages |
| Référence CLI | bext dev, bext build, bext routes |
| Référence de configuration | bext.config.toml |