back

What's actually changed in React lately

React 19 landed with more substance than most major versions. The two things I care most about: the React Compiler finally shipping, and the use() hook. The compiler eliminates the manual memoization tax — no more useCallback everywhere just to stabilize references. use() lets you read a Promise or context inside any component, not just at the top level, which unlocks cleaner async patterns without waterfall suspense trees.

When we migrated some data-fetching flows from the classic useEffect + useState pattern to Suspense-based fetching with use(), the difference showed up in traces. A settings page that was making three sequential requests — each waiting on the previous — dropped from around 900ms to roughly 350ms once the fetches ran in parallel and Suspense boundaries handled the loading states. It's not magic; the new primitives just make it easier to express the right behavior without fighting the framework.

useTransition has been around since React 18 but it's become more central to how I think about UI responsiveness. Marking state updates as non-urgent so the UI stays interactive during heavy renders is exactly the kind of primitive that makes the framework feel thoughtful. Combine it with useDeferredValue and you have solid tools for perceived performance without reaching for external libraries.

Server Components are the shift that's still settling. The mental model of a component tree split between server and client is powerful but genuinely different from what most of us have built for years. It's not a drop-in upgrade — it's a rethink of where data fetching lives. I'm cautiously optimistic, especially as Next.js makes the boundaries cleaner to work with.