Skip to content
PПромтбук
RUEN
01Аудит

Аудит переходов между страницами

Next.js Router-переходы: loading-state, scroll-position, layout preservation, prefetch, stale UI. Чтобы не было «прыжков» и «двух картинок одновременно».

Между «работает» и «работает ровно» — переходы. Если пользователь видит вспышку белого, прыжок скролла, дубль heading'а или «загрузка» которая длится 3 секунды для статической страницы — это перепонимание архитектуры роутинга.

Site: {{site_url}} Стек: {{stack}}

1. Что аудитим (8 классов)

КлассСимптомПричина
Layout shiftHero прыгает на ~100px при переходеразные layout.tsx / разный padding
Scroll jumpСкролл сбрасывается в начало без причиныscroll restoration broken
Flash of old contentВидишь предыдущую страницу 200ms после кликаsync nav без loading.tsx
Flash of emptyБелый screen на 1-2 секclient-only fetch без skeleton
Stale dataСписок не обновляется после mutationcache не инвалидирован
Two-headers / two-screensНа секунду видишь два header'аlayout transitions неверны
Prefetch wasteКаждая ссылка тянет full bundleprefetch="false" не выставлен
History hellBack button не возвращает на ту же позициюscroll restore broken

2. Проход (15-20 переходов)

Открой prod в обычном Chrome. DevTools → Performance recording + Network (Slow 3G throttle для драматичности).

Сценарии:

  1. Home → details page → back — должен вернуть на тот же скролл
  2. Home → details → details (другой) → home — promises не накладываются
  3. Search → результат → details → back to search — search state preserved?
  4. Login → dashboard → settings → logout — clean state transitions
  5. 404 page → back — куда вернёт?
  6. Open detail в новой вкладке → close → переход в той же session — state совпадает?

Для каждого:

  • Visible flash (yes/no, ms)
  • Scroll position right (yes/no)
  • Layout shift (Performance panel CLS metric)
  • Network: cancelled requests count (>2 = bad)

3. Next.js App Router specifics

loading.tsx

  • Должен существовать для каждого async сегмента
  • Skeleton matched layout (height matched, no shift)
  • НЕ ставь loading.tsx в корень — будет показываться при каждой навигации

error.tsx

  • Должен быть для каждой группы с async data
  • Понятная ошибка, не stacktrace
  • Reset-кнопка работает (тест: throw в loader, нажать reset)

Suspense boundaries

  • Нужны для streaming SSR
  • Не слишком близко к root (всё ждёт) и не слишком глубоко

prefetch

  • <Link prefetch> default true в prod
  • Если 1000 ссылок на странице — prefetch={false} для большинства
  • Иначе тянешь 1000 chunks при scroll

parallel / intercepting routes

  • @modal закрытие через router.back() работает?
  • Refresh при открытом @modal — что показывает?

4. SPA specifics (не Next.js)

  • history.scrollRestoration: 'manual' или 'auto'?
  • React Router <ScrollRestoration /> v6+ работает?
  • HMR / dev mode маскирует production-баги transitions

5. Performance budgets

MetricGoodBad
Transition response (click → first paint)<100ms>300ms
LCP после nav<2s>4s
CLS during transition<0.1>0.25
Cancelled requests0-13+

6. Что починить (приоритет)

  1. Любой flash >200ms — loading.tsx или skeleton
  2. CLS >0.1 — фиксированные размеры placeholder
  3. Scroll preventionrouter.push(url, { scroll: false }) где надо сохранить позицию
  4. Stale cache после mutation — router.refresh() или explicit revalidation
  5. prefetch overkillprefetch={false} для низкоприоритетных

Anti-patterns

  • ❌ Каждое <Link> с prefetch={true} на странице с 200 ссылок — bandwidth burn
  • window.location.href = url вместо router-push — full reload
  • ❌ Loading-state как пустая страница (white screen) — для пользователя «сломалось»
  • ❌ Skeleton не matched layout → CLS spike
  • ❌ Не тестировать back button
  • ❌ Browser cache не использован — каждый back повторно fetch'ит
  • ❌ History hell: после клика и back возвращается на /home вместо предыдущего фильтра

Output

  1. Список проблем с категорией + severity
  2. Performance metrics до/после фикса
  3. Список изменений в loading.tsx / error.tsx / prefetch settings
  4. Critical fixes в этой PR (3-5)
  5. Backlog — что отложить
К подразделу «Аудит»
Похожие промты