TanStack Router Best Practices
Comprehensive guidelines for implementing TanStack Router patterns in React applications. These rules optimize type safety, data loading, navigation, and code organization.
When to Apply Setting up application routing Creating new routes and layouts Implementing search parameter handling Configuring data loaders Setting up code splitting Integrating with TanStack Query Refactoring navigation patterns Rule Categories by Priority Priority Category Rules Impact CRITICAL Type Safety 4 rules Prevents runtime errors and enables refactoring CRITICAL Route Organization 5 rules Ensures maintainable route structure HIGH Router Config 1 rule Global router defaults HIGH Data Loading 6 rules Optimizes data fetching and caching HIGH Search Params 5 rules Enables type-safe URL state HIGH Error Handling 1 rule Handles 404 and errors gracefully MEDIUM Navigation 5 rules Improves UX and accessibility MEDIUM Code Splitting 3 rules Reduces bundle size MEDIUM Preloading 3 rules Improves perceived performance LOW Route Context 3 rules Enables dependency injection Quick Reference Type Safety (Prefix: ts-) ts-register-router — Register router type for global inference ts-use-from-param — Use from parameter for type narrowing ts-route-context-typing — Type route context with createRootRouteWithContext ts-query-options-loader — Use queryOptions in loaders for type inference Router Config (Prefix: router-) router-default-options — Configure router defaults (scrollRestoration, defaultErrorComponent, etc.) Route Organization (Prefix: org-) org-file-based-routing — Prefer file-based routing for conventions org-route-tree-structure — Follow hierarchical route tree patterns org-pathless-layouts — Use pathless routes for shared layouts org-index-routes — Understand index vs layout routes org-virtual-routes — Understand virtual file routes Data Loading (Prefix: load-) load-use-loaders — Use route loaders for data fetching load-loader-deps — Define loaderDeps for cache control load-ensure-query-data — Use ensureQueryData with TanStack Query load-deferred-data — Split critical and non-critical data load-error-handling — Handle loader errors appropriately load-parallel — Leverage parallel route loading Search Params (Prefix: search-) search-validation — Always validate search params search-type-inheritance — Leverage parent search param types search-middleware — Use search param middleware search-defaults — Provide sensible defaults search-custom-serializer — Configure custom search param serializers Error Handling (Prefix: err-) err-not-found — Handle not-found routes properly Navigation (Prefix: nav-) nav-link-component — Prefer Link component for navigation nav-active-states — Configure active link states nav-use-navigate — Use useNavigate for programmatic navigation nav-relative-paths — Understand relative path navigation nav-route-masks — Use route masks for modal URLs Code Splitting (Prefix: split-) split-lazy-routes — Use .lazy.tsx for code splitting split-critical-path — Keep critical config in main route file split-auto-splitting — Enable autoCodeSplitting when possible Preloading (Prefix: preload-) preload-intent — Enable intent-based preloading preload-stale-time — Configure preload stale time preload-manual — Use manual preloading strategically Route Context (Prefix: ctx-) ctx-root-context — Define context at root route ctx-before-load — Extend context in beforeLoad ctx-dependency-injection — Use context for dependency injection How to Use
Each rule file in the rules/ directory contains:
Explanation — Why this pattern matters Bad Example — Anti-pattern to avoid Good Example — Recommended implementation Context — When to apply or skip this rule Full Reference
See individual rule files in rules/ directory for detailed guidance and code examples.