Expo Router v56: Decoupling from React Navigation
Key Points
- Forked React Navigation internals
- Streaming server-side rendering (SSR)
- Android toolbar and expanded Native Tabs
Summary
Expo Router v56 makes three major changes: it forks the React Navigation internals that Expo Router previously depended on, adds streaming server-side rendering (SSR) and new loader utilities for web, and brings Android feature parity through a toolbar API and expanded Native Tabs. The fork is a breaking import change but tooling and a temporary compatibility layer are provided to smooth migration.
Key Points
- Breaking change: do not import from @react-navigation/* anymore. Replace imports with expo-router/react-navigation.
- Run the provided codemod to migrate automatically.
- A compatibility layer will rewrite @react-navigation/core imports from libraries for at least one release cycle.
- See the migration guide for manual steps and edge cases.
- Streaming SSR and loader helpers for web:
- Enable streaming by setting unstable_useServerRendering = true in Expo Router config.
- Use generateMetadata for route HTML metadata.
- New helpers: createStaticLoader and createServerLoader for type-safe data loading.
- Android parity and Native Tabs improvements:
- Android toolbar added with left, right, and bottom placements.
- Native Tabs gains new options, including disabled to prevent selection while keeping the tab visible.
Practical upgrade steps for engineers
- If upgrading an app: run the codemod, follow the migration guide, and test dependencies relying on @react-navigation/core.
- If starting a new project: SDK 56 includes the fork and features by default.
- Library authors: Expo and React Navigation teams are working on a shared API — reach out if your lib should support both.
Links and troubleshooting
- Use the provided codemod and migration guide for bulk changes.
- Report issues on GitHub or ask for help on Discord if you encounter migration problems.