Voici le fallback loading.tsx. Le runtime PRISM l'a diffusé immédiatement pendant que le chargeur du sibling page.tsx était suspendu sur un sleep de 1,5 s.
Vous ne devriez voir ceci que pendant ~1,5 seconde, puis la vraie page le remplace via le protocole de streaming.
Un fichier sibling loading.tsx enveloppe automatiquement l'arbre de la page dans une frontière Suspense. Les pages asynchrones diffusent d'abord le fallback, puis émettent le vrai contenu via le protocole template+swap du framework — la même mécanique que les démos <Suspense> explicites.
Astuce
Le fallback de <code>loading.tsx</code> est envoyé en premier chunk, avant même que la page ne commence à résoudre — ce qui signifie que le TTFB reste court même pour des loaders lents. Contrairement à un spinner côté client, le fallback est rendu côté serveur et visible sans JavaScript.
Résolu
Page résolue à 2026-09-06T03:49:07.510Z. Rechargez — vous devriez voir le fallback Chargement… s'afficher ~1,5 s en mode streaming avant que ce contenu ne s'affiche.
(Consultez la source pour voir à la fois le fallback et le vrai contenu dans le body, avec un script inline __bextSuspense.swap(N) qui les relie. Le fallback est envoyé immédiatement ; le vrai contenu arrive ~1,5 s plus tard sous forme de chunk séparé.)
src/app/examples/loading-demo/loading.tsxTSX
// src/app/examples/loading-demo/loading.tsx
export default function Loading() {
return <h1>Loading…</h1>;
}
// src/app/examples/loading-demo/page.tsx
// opt out of the site default ISR so it streams every request
export const dynamic = "force-dynamic";
export default async function Page() {
await new Promise((r) => setTimeout(r, 1500));
return (
<div>
<h1>loading.tsx</h1>
<p>Resolved at {new Date().toISOString()}</p>
</div>
);
}