Capítulo 40 de 57
TanStack Router can preload a route's chunk, beforeLoad, and loader before the user navigates to it, using intent (hover/touch), viewport visibility, or render-time strategies, with separate freshness (preloadStaleTime) and retention (preloadGcTime) settings from normal navigation.
<Link>, preloading the destination route; the most common strategy for likely-next navigations.<Link>'s destination once it's visible in the viewport, useful for below-the-fold links.<Link>'s destination as soon as it's rendered in the DOM, for routes that are almost always needed.defaultPreload router option: set to 'intent' (most common), 'viewport', or 'render' to enable that strategy app-wide; overridable per-<Link> via the preload prop.defaultPreloadDelay / preloadDelay: milliseconds before an intent/viewport preload starts (default 50ms); pending preloads cancel if hover/focus ends or the link leaves viewport; touch intent preloads immediately.preloadStaleTime / defaultPreloadStaleTime: freshness window for preloaded loader data, default 30 seconds; separate from staleTime used for navigation.preloadGcTime / defaultPreloadGcTime: retention window for unused preloaded data before eligible pruning, default 5 minutes; independent of freshness.beforeLoad chain and is never directly promoted into router state; navigation always runs its own beforeLoad again but can reuse a preload's settled loader data or in-flight loader work.router.preloadRoute(options): manually trigger a preload; returns the speculative match lane (or undefined if cancelled), letting you inspect for status === 'error' or 'notFound'.router.loadRouteChunk(route): preload only a route's JS chunk (not its loader/beforeLoad), returning a promise that resolves when loaded.const router = createRouter({
routeTree,
defaultPreload: 'intent',
defaultPreloadDelay: 100,
})
// src/routes/posts.$postId.tsx
export const Route = createFileRoute('/posts/$postId')({
loader: async ({ params }) => fetchPost(params.postId),
preloadStaleTime: 10_000, // reload preloaded data older than 10s
})
defaultPreload: 'intent' is the simplest high-value win for perceived navigation speed in most apps.defaultPreloadStaleTime: 0 so the external library's own freshness logic takes over.preload: false on a route still runs beforeLoad speculatively but skips the loader, navigation will still run both.preloadGcTime) and freshness (preloadStaleTime) are independent settings, don't conflate them.loadRouteChunk preloads only the split JS chunk, complementary to data preloading.