Skip to main content

Hydration Strategies

Hydration is the process of attaching React event handlers to server-rendered HTML, making it interactive. React Router provides several strategies to optimize this process.

Basic Hydration

By default, React Router hydrates immediately with server data:
This uses the hydration data embedded in the HTML:

Client Loaders

Run additional logic on the client during hydration:

Hydrate Flag

Control whether client loaders run on hydration:

Default Behavior

  • hydrate = true: When there’s no server loader
  • hydrate = false: When calling serverLoader()
  • hydrate = true: When not calling serverLoader()

HydrateFallback

Show a loading state during client loader execution:

HydrateFallback Behavior

  1. Only runs on initial hydration: Not on client-side navigations
  2. Requires clientLoader: With hydrate = true
  3. Bubbles up: Renders parent’s HydrateFallback if none provided
  4. No Outlet: Cannot render children (they may not have data yet)

Partial Hydration

Hydrate different parts of your app at different times:

Streaming Hydration

Combine with deferred data for progressive hydration:
The page hydrates with critical data, then streams in deferred data.

Optimistic Hydration

Assume server data is available and hydrate eagerly:

Selective Hydration

Only hydrate interactive components:

Island Architecture

Hydrate isolated interactive regions:

Custom Hydration

Full control over the hydration process:

Hydration Errors

Debug mismatches between server and client:

Performance Monitoring

Track hydration performance:

Best Practices

  1. Use server data by default: Set hydrate = false when possible
  2. Show loading states: Use HydrateFallback for better UX
  3. Minimize client loaders: Keep hydration fast
  4. Test without JavaScript: Ensure server-rendered content works
  5. Monitor hydration time: Track performance metrics

Common Patterns

User Preferences

Authentication State

Feature Flags