Suspense has been in React since 16.6, but data fetching with Suspense was experimental until React 18/19. Now it's a first-class async UI primitive, and the new use() hook gives you a direct way to integrate it without a library.

What Suspense Actually Does

Suspense doesn't know anything about fetching. When a component throws a Promise during render, React catches it, renders the nearest <Suspense> boundary's fallback, and retries when the Promise resolves.

// Conceptually, what libraries do:

function fetchUser(id: string) {