What's New in React 19
New features and improvements in React 19
What’s New in React 19
1. React Compiler
-
Automatic Memoization
- React 19 ships with an official React Compiler.
- It automatically optimizes components by inserting
useMemo
anduseCallback
-like optimizations under the hood. - Developers no longer need to sprinkle manual
useMemo
/useCallback
everywhere for performance tuning. - Reduces boilerplate and avoids common mistakes with dependency arrays.
2. React Server Components (RSC)
- What it is: Components that run only on the server, never shipped to the client bundle.
- Why: Reduces bundle size, avoids duplicating server logic on the client, and allows direct server-side data access (e.g., DB queries).
-
How it works:
- Server executes the component, fetches data, and produces a serialized payload (often streamed).
- Client receives the result and hydrates it together with client components.
-
Benefits:
- Smaller JS bundles shipped to the client.
- Faster initial load with server-rendered data.
- Streaming lets content appear progressively.
-
Relation to SSR:
- SSR: A rendering strategy (page-level) where HTML is rendered on the server.
- RSC: An architecture (component-level) for splitting what runs on the server vs client.
- They are complementary, not alternatives. You can use both together.
Figure: Architecture diagram showing how server components integrate with API calls.
3. New APIs and Hooks
use
- Lets components directly consume Promises or Context without
useEffect
boilerplate. - Works seamlessly with Suspense.
-
Example:
function Profile() { const user = use(fetchUser()); // Suspense handles loading state return <h1>{user.name}</h1>; }
Actions & Forms
- React 19 introduces the idea of actions: async functions that update state (often tied to forms).
-
Hooks for handling actions:
useActionState
→ Manages the result of an action. Example: login errors.useFormStatus
→ Tracks pending state of form submissions. Example: disable button during submit.-
useOptimistic
→ Optimistic UI updates; apply expected result immediately, roll back if the server fails.const [likes, add] = useOptimistic( initialLikes, (cur, delta) => cur + delta );
→ Clicking “like” instantly increments UI, then syncs with the server.
Example Workflow
-
Old way:
const [user, setUser] = useState(null); useEffect(() => { fetchUser().then(setUser); }, []);
-
New way:
function Profile() { const user = use(fetchUser()); return <h1>{user.name}</h1>; }
-
Much simpler, avoids repetitive state/loader boilerplate.
4. Ref Improvements
-
In React <19, function components couldn’t receive refs directly, so
forwardRef
was needed:const Fancy = forwardRef((props, ref) => <input ref={ref} />);
- In React 19, refs can be passed as normal props, making
forwardRef
unnecessary. - Simplifies ref handling significantly.
5. Optimizations and Developer Experience
- Batching updates: State updates are grouped to minimize unnecessary renders.
- Async transitions: Certain updates can be scheduled with different priorities (urgent vs deferred).
- Better integration with server-driven architectures: Logic moves closer to the server, leveraging server power.
- Simplified API design: Developers can express async logic declaratively, without complex
useEffect
chains.
6. Developer Implications
-
Front-end developers need more back-end literacy:
- With RSC and server actions, React developers should be familiar with server concepts (databases, ORMs, serverless, Express, etc.).
-
Bundles get smaller, but developer responsibilities broaden: Understanding server infrastructure becomes part of React app development.
7. Summary
- React Compiler → automatic memoization, less boilerplate.
- RSC (React Server Components) → offload rendering and data fetching to the server, reduce client bundle size, enable streaming.
- New hooks/APIs (
use
,useActionState
,useFormStatus
,useOptimistic
) → simpler async handling, optimistic UI. - Ref handling simplified → no more
forwardRef
. - Shift in architecture → server and client collaboration, developers need to understand both sides.