Dev Highlights

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

This project is maintained by teniryte

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

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

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

import { createFileRoute } from '@tanstack/react-router'

// routes/dashboard/reports.tsx (critical config)
export const Route = createFileRoute('/dashboard/reports')({
  loader: ({ context }) => context.api.reports.list(),
})
import { createLazyFileRoute } from '@tanstack/react-router'

// routes/dashboard/reports.lazy.tsx (non-critical config)
export const Route = createLazyFileRoute('/dashboard/reports')({
  component: ReportsPage,
  pendingComponent: () => <Spinner />,
  errorComponent: (props) => <ErrorBox {...props} />,
})

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

export const Route = createLazyFileRoute(‘/dashboard/settings’)({ component: SettingsPage, pendingComponent: () => , })

- Для Vite-проектов включайте `autoCodeSplitting: true` в `@tanstack/router-plugin/vite`, чтобы разделение критического/некритического кода происходило автоматически.
- Не забывайте давать именованные экспорты страницам/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. Переиспользуйте ленивые маршруты между проектами: createLazyFileRoute/createLazyRoute можно обернуть в фабрику.
  4. Делайте eager-import для очень маленьких утилит, иначе потеряете выгоду от tree-shaking (Rollup создаст слишком много чанков <1 кБ).
  5. Старайтесь делить не только страницы, но и большие layout’ы (settings/layout.lazy.tsx) — тогда вложенные children будут грузиться мгновенно.
  6. Для A/B тестов оборачивайте ленивый компонент в routeContext, чтобы подменять импортируемый модуль в runtime.

Чек-лист