Back to articles
May 21, 2026

Getting Started with React 19

Getting Started with React 19 React 19 brings a wave of improvements that make building user interfaces cleaner and more intuitive. With enhanced server components, new hooks, and improved…

Placeholder cover imagePhoto: Lorem Picsum / Unsplash

Getting Started with React 19

React 19 brings a wave of improvements that make building user interfaces cleaner and more intuitive. With enhanced server components, new hooks, and improved performance, it's worth getting up to speed with the latest features.

Server Components by Default

React 19 makes React Server Components (RSC) the default rendering mode. Components are now rendered on the server by default, reducing the JavaScript bundle sent to the client.

// This component runs on the server by default
async function UserProfile({ userId }) {
  const user = await fetchUser(userId); // Direct DB call, no API layer needed

  return (
    <div>
      <h1>{user.name}</h1>
      <p>{user.bio}</p>
    </div>
  );
}

To create a client component that runs in the browser, you add a simple directive at the top of the file:

'use client';

import { useState } from 'react';

export function Counter() {
  const [count, setCount] = useState(0);
  return <button onClick={() => setCount(c => c + 1)}>{count}</button>;
}

The use() Hook

React 19 introduces a new use() hook that simplifies consuming values outside of render. It works with promises, context, and any thenable value.

import { use } from 'react';

function ThemeDisplay({ themePromise }) {
  const theme = use(themePromise);
  return <div style={{ background: theme }}>Welcome</div>;
}

// Or with context
function ThemeContextDisplay() {
  const theme = use(ThemeContext);
  return <div>Current theme: {theme}</div>;
}

Actions and useFormStatus

Form handling gets a major upgrade with native support for actions and form state.

'use client';

import { useFormStatus, useFormState } from 'react-dom';

function SubmitButton() {
  const { pending, data } = useFormStatus();

  return (
    <button disabled={pending} type="submit">
      {pending ? 'Submitting...' : 'Submit'}
    </button>
  );
}

export default function ContactForm() {
  const [state, formAction] = useFormState(submitForm, null);

  return (
    <form action={formAction}>
      <input name="email" type="email" required />
      <SubmitButton />
      {state?.error && <p>{state.error}</p>}
    </form>
  );
}

Compiler Optimizations

React 19 includes an experimental compiler that automatically optimizes your components. It eliminates unnecessary re-renders by tracking dependencies at compile time, removing the need for useMemo and useCallback in most cases.

// Before: manually memoized
const memoizedValue = useMemo(() => computeExpensive(a, b), [a, b]);
const handleClick = useCallback(() => doSomething(a), [a]);

// After: compiler handles it automatically
const value = computeExpensive(a, b); // No useMemo needed
function handleClick() { doSomething(a); } // No useCallback needed

Conclusion

React 19 represents a significant step forward in developer experience and performance. Server components reduce bundle sizes, the use() hook simplifies working with async values, and the compiler removes boilerplate. Start by migrating a non-critical component to see these benefits in action. The transition is incremental, so you can adopt features at your own pace while keeping your existing code working.

The Signal

AI-generated brief

React 19 shifts frontend architecture toward server-rendered defaults and automated optimization, delivering faster load times and drastically simpler state management.

Stance · BullishConfidence · Emerging

The article frames the release as a direct solution to common frontend bottlenecks while guaranteeing backward-compatible, low-friction migration paths.

Key takeaways

  • React Server Components are now the default rendering mode, reducing client-side JavaScript bundles.
  • A unified use() hook replaces fragmented patterns for accessing promises, contexts, and thenables.
  • Native form actions and useFormStatus hooks eliminate boilerplate for managing submission states.
  • An experimental compiler automatically tracks dependencies, removing the need for manual useMemo and useCallback calls.
  • Adoption supports incremental migration, letting teams update components progressively without breaking existing applications.

What to watch next

  • Official stabilization timeline for the automatic dependency compiler
  • Community benchmarks comparing default RSC versus legacy hydration patterns
  • Third-party library compatibility updates for the new use() hook

Who should care

Frontend developersFull-stack engineersTech leadsFramework architects

Key players

ReactReactDOMReact Server ComponentsAutomatic Dependency Compiler

Auto-generated from the article by our model — a reading aid, not a replacement for the piece.

The dispatch

One sharp read on the day’s biggest tech story.

Reported analysis for people who build software — free, most days, no spam.

Support our workIndependent, reader-funded tech journalism. If a piece helped you, chip in.Chip in →