What's New in React 19

New features and improvements in React 19

By Hank Kim

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 and useCallback-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:

    1. Server executes the component, fetches data, and produces a serialized payload (often streamed).
    2. 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.

Server component and API structure 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.