Back to Guides

Improve React Hydration Performance

Optimize React app loading and interactivity for better Core Web Vitals and user experience.

React Performance Challenges

React applications face unique performance challenges, especially with client-side rendering, large JavaScript bundles, and hydration. Here are the main areas to optimize:

Bundle Size

Large JavaScript bundles slow down initial load times.

Hydration

React needs to "hydrate" server-rendered HTML, which blocks interactivity.

Re-renders

Unnecessary re-renders waste CPU and slow down interactions.

Dependencies

Heavy npm packages bloat your bundle.

1. Implement Code Splitting

Split your code into smaller chunks that load on demand:

Route-Based Code Splitting

Split code at the route level using React.lazy:

javascript
import { lazy, Suspense } from 'react';
const Dashboard = lazy(() => import('./pages/Dashboard'));
const Profile = lazy(() => import('./pages/Profile'));
function App() {
return (
<Suspense fallback={<Loading />}>
<Routes>
<Route path="/dashboard" element={<Dashboard />} />
<Route path="/profile" element={<Profile />} />
</Routes>
</Suspense>
);
}

Component-Based Code Splitting

Lazy load heavy components that aren't immediately visible:

javascript
import React, { useState, lazy, Suspense } from 'react';
import Spinner from './Spinner';
const HeavyChart = lazy(() => import('./HeavyChart'));
function Analytics() {
const [showChart, setShowChart] = useState(false);
return (
<div>
<button onClick={() => setShowChart(true)}>
Show Chart
</button>
{showChart && (
<Suspense fallback={<Spinner />}>
<HeavyChart />
</Suspense>
)}
</div>
);
}

2. Optimize React Hydration

React 18 introduced improvements for hydration performance:

Use Selective Hydration

React 18's Suspense allows parts of your app to hydrate independently:

javascript
import { hydrateRoot } from 'react-dom/client';
hydrateRoot(
document.getElementById('root'),
<App />
);
// Wrap heavy components in Suspense
<Suspense fallback={<Skeleton />}>
<HeavyComponent />
</Suspense>

Reduce Hydration Time

  • Minimize the amount of HTML that needs hydration
  • Use static HTML for non-interactive content
  • Defer hydration of below-the-fold components
  • Consider using React Server Components (RSC)

3. Reduce Bundle Size

Smaller bundles load and parse faster:

Analyze Your Bundle

bash
# Install bundle analyzer
npm install --save-dev webpack-bundle-analyzer
# Or for Vite
npm install --save-dev rollup-plugin-visualizer
# Run build with analysis
npm run build -- --analyze

Replace Heavy Dependencies

moment.js → date-fns or Day.js

Save ~200KB by switching to a modern alternative

lodash → lodash-es

Enable tree-shaking, import only what you need

Material-UI → Mantine/shadcn/ui

Smaller, more modern UI component alternatives

axios → fetch API

Built-in browser API, no extra bundle size

Tree-Shaking Best Practices

javascript
// Bad - imports entire library
import _ from 'lodash';
// Good - imports only what you need
import debounce from 'lodash/debounce';
// Or use lodash-es for better tree-shaking
import { debounce } from 'lodash-es';

4. Optimize Re-renders

Prevent unnecessary component re-renders:

Use React.memo

javascript
import { memo } from 'react';
const ExpensiveComponent = memo(({ data }) => {
// Component only re-renders when data changes
return <div>{data}</div>;
});

Use useMemo and useCallback

javascript
import { useMemo, useCallback } from 'react';
function MyComponent({ items }) {
// Memoize expensive computations
const sortedItems = useMemo(() => {
return items.sort((a, b) => a.value - b.value);
}, [items]);
// Memoize callbacks to prevent child re-renders
const handleClick = useCallback((id) => {
console.log('Clicked:', id);
}, []);
return <List items={sortedItems} onClick={handleClick} />;
}

Optimize Context Usage

  • Split context into smaller, focused contexts
  • Use context selectors to subscribe to specific values
  • Consider state management libraries like Zustand or Jotai for better performance

5. Optimize Images and Assets

Images are often the largest assets in React apps:

Use Next.js Image Component

If you're using Next.js, their Image component handles optimization automatically:

javascript
import Image from 'next/image';
<Image
src="/hero.jpg"
alt="Hero image"
width={800}
height={600}
priority // Load above fold images immediately
/>

Lazy Load Images in React

html
<img
src="placeholder.jpg"
data-src="actual-image.jpg"
loading="lazy"
alt="Description"
/>

Use Modern Formats

  • Serve WebP images with JPG/PNG fallbacks
  • Use SVG for icons and simple graphics
  • Consider AVIF for even better compression

6. Server-Side Rendering (SSR) Best Practices

If using SSR with Next.js or Remix:

Use getServerSideProps Wisely

  • Only fetch data that's needed for initial render
  • Use getStaticProps for pages that can be pre-rendered
  • Implement ISR (Incremental Static Regeneration) for semi-dynamic content
  • Cache API responses at the server level

Streaming SSR (React 18)

Stream HTML as it's generated instead of waiting for everything:

html
<Suspense fallback={<Spinner />}>
<SlowComponent />
</Suspense>

7. Production Build Optimizations

Ensure your production build is optimized:

Vite/Webpack Configuration

  • Enable minification and compression
  • Use production mode: NODE_ENV=production
  • Enable gzip or Brotli compression
  • Remove console.log statements in production
  • Use environment variables for API keys

CDN and Caching

  • Serve static assets from a CDN
  • Set appropriate cache headers
  • Use content hashing in filenames for cache busting
  • Preload critical resources

8. Performance Monitoring

Monitor real-world performance:

  • Use React DevTools Profiler to identify slow renders
  • Implement Web Vitals monitoring with web-vitals library
  • Use Lighthouse CI in your build pipeline
  • Monitor bundle size with bundlesize or size-limit
  • Track performance metrics in production with tools like Sentry or LogRocket

Analyze Your React App

Get React-specific optimization recommendations powered by AI.

Test Your React Site