Dev Highlights

Доки по разработке

This project is maintained by teniryte

Причины использовать ленивые маршруты

Когда ленивость вредна

Быстрый обзор API v1

import { createLazyRoute } from '@tanstack/react-router'
import { Route as dashboardRoute } from './dashboard'

export const Route = createLazyRoute({
  getParentRoute: () => dashboardRoute,
  path: 'reports',
  pendingComponent: () => <Spinner />,        // показывается пока грузится модуль
  errorComponent: (props) => <ErrorBox {...props} />,
  beforeLoad: async ({ context }) => {
    await context.auth.requireRole('analyst')
  },
  loader: async (opts) => {
    const { loader } = await import('./reports.loader')
    return loader(opts)
  },
  component: async () => {
    const { ReportsPage } = await import('./reports.component')
    return <ReportsPage />
  },
})

Разделение файлов по соглашениям

export const Route = createFileRoute(‘/dashboard/settings’).createRoute({ component: () => import(‘./SettingsPage’).then((m) => ), pendingComponent: () => , })

- `createFileRoute` автоматически добавляет `Route.lazy()` helper, его можно вызвать для динамического импорта прямо из `routeTree.gen.ts`.
- Не забывайте давать именованные экспорты страницам/loader'ам — tree-shaking эффективнее и не будет промахов с default-export.

## Prefetch и управление чанками
```tsx
<Link
  to="/dashboard/reports"
  preload="intent"
  preloadDelay={120}       // предотвращает спам запросов при быстрых hover'ах
  preloadGcMaxAge={60_000} // держим модуль в кеше минуту
/>

Разделение loaders и побочные импорты

Совместимость с Suspense

const DashboardShell = () => (
  <Suspense fallback={<Spinner />}>
    <Outlet />
  </Suspense>
)

SSR, SSG и hydrate

Оптимизация сборки

Лайфхаки

  1. Навесьте preload="intent" на все Link, которые видны дольше 1 с — пользователи не заметят задержку.
  2. В layout храните const { isFetching } = useRouterState({ select: (s) => s.isFetching }), чтобы показать глобальный progress bar во время ленивой загрузки.
  3. Переиспользуйте ленивые маршруты между проектами: createLazyRoute можно обернуть в фабрику, которая принимает зависимости (api, auth).
  4. Делайте eager-import для очень маленьких утилит, иначе потеряете выгоду от tree-shaking (Rollup создаст слишком много чанков <1 кБ).
  5. Старайтесь делить не только страницы, но и большие layout’ы (settings/layout.lazy.tsx) — тогда вложенные children будут грузиться мгновенно.
  6. Для A/B тестов оборачивайте ленивый компонент в routeContext, чтобы подменять импортируемый модуль в runtime.

Чек-лист