# router-default-options: Configure Router Default Options ## Priority: HIGH ## Explanation TanStack Router's `createRouter` accepts several default options that apply globally. Configure these for consistent behavior across your application including error handling, scroll restoration, and performance optimizations. ## Bad Example ```tsx // Minimal router - missing useful defaults const router = createRouter({ routeTree, context: { queryClient }, }) // Each route must handle its own errors // No scroll restoration on navigation // No preloading configured ``` ## Good Example: Full Configuration ```tsx import { QueryClient } from '@tanstack/react-query' import { createRouter } from '@tanstack/react-router' import { setupRouterSsrQueryIntegration } from '@tanstack/react-router-ssr-query' import { routeTree } from './routeTree.gen' import { DefaultCatchBoundary } from '@/components/DefaultCatchBoundary' import { DefaultNotFound } from '@/components/DefaultNotFound' export function getRouter() { const queryClient = new QueryClient({ defaultOptions: { queries: { refetchOnWindowFocus: false, staleTime: 1000 * 60 * 2, }, }, }) const router = createRouter({ routeTree, context: { queryClient, user: null }, // Preloading defaultPreload: 'intent', // Preload on hover/focus defaultPreloadStaleTime: 0, // Let Query manage freshness // Error handling defaultErrorComponent: DefaultCatchBoundary, defaultNotFoundComponent: DefaultNotFound, // UX scrollRestoration: true, // Restore scroll on back/forward // Performance defaultStructuralSharing: true, // Optimize re-renders }) setupRouterSsrQueryIntegration({ router, queryClient, }) return router } ``` ## Good Example: DefaultCatchBoundary Component ```tsx // components/DefaultCatchBoundary.tsx import { ErrorComponent, useRouter } from '@tanstack/react-router' export function DefaultCatchBoundary({ error }: { error: Error }) { const router = useRouter() return (

Something went wrong

) } ``` ## Good Example: DefaultNotFound Component ```tsx // components/DefaultNotFound.tsx import { Link } from '@tanstack/react-router' export function DefaultNotFound() { return (

404 - Page Not Found

The page you're looking for doesn't exist.

Go home
) } ``` ## Router Options Reference | Option | Type | Default | Description | |--------|------|---------|-------------| | `defaultPreload` | `false \| 'intent' \| 'render' \| 'viewport'` | `false` | When to preload routes | | `defaultPreloadStaleTime` | `number` | `30000` | How long preloaded data stays fresh (ms) | | `defaultErrorComponent` | `Component` | Built-in | Global error boundary | | `defaultNotFoundComponent` | `Component` | Built-in | Global 404 page | | `scrollRestoration` | `boolean` | `false` | Restore scroll on navigation | | `defaultStructuralSharing` | `boolean` | `true` | Optimize loader data re-renders | ## Good Example: Route-Level Overrides ```tsx // Routes can override defaults export const Route = createFileRoute('/admin')({ // Custom error handling for admin section errorComponent: AdminErrorBoundary, notFoundComponent: AdminNotFound, // Disable preload for sensitive routes preload: false, }) ``` ## Good Example: With Pending Component ```tsx const router = createRouter({ routeTree, context: { queryClient }, defaultPreload: 'intent', defaultPreloadStaleTime: 0, defaultErrorComponent: DefaultCatchBoundary, defaultNotFoundComponent: DefaultNotFound, scrollRestoration: true, // Show during route transitions defaultPendingComponent: () => (
), defaultPendingMinMs: 200, // Min time to show pending UI defaultPendingMs: 1000, // Delay before showing pending UI }) ``` ## Context - Set `defaultPreloadStaleTime: 0` when using TanStack Query - `scrollRestoration: true` improves back/forward navigation UX - `defaultStructuralSharing` prevents unnecessary re-renders - Route-level options override router defaults - Error/NotFound components receive route context - Pending components help with perceived performance