> Будет ли middleware блокировать показ страницы пока useSWR не отработает (React)

Уровень: senior · Роль: frontend · Категория: Технические вопросы

Компании: Библио-Глобус

Стек: React

> Пример ответа

Короткий ответ

Нет, middleware не блокирует показ страницы при использовании useSWR. Middleware в Next.js выполняется на сервере до рендеринга страницы, но useSWR - клиентский хук, который запускается только в браузере после гидратации. Страница отрендерится с initial-состоянием (обычно undefined или fallbackData), а useSWR выполнит запрос асинхронно. Для блокировки нужно использовать server-side data fetching (getServerSideProps или generateStaticParams).

Подробное объяснение

Middleware в Next.js - это функция, которая выполняется на edge runtime до того, как запрос достигнет страницы. Она может перенаправлять, переписывать URL или добавлять заголовки, но не влияет на выполнение клиентского кода.

useSWR - это хук для кэширования и повторной валидации данных на клиенте. Он запускается только после того, как React компонент отрендерится в браузере. Middleware завершает свою работу до того, как HTML страницы отправляется клиенту, поэтому useSWR не может быть "заблокирован" middleware.

Если нужно, чтобы данные были доступны до первого рендера, используйте:

  • SSR через getServerSideProps
  • SSG с revalidate
  • fallbackData в useSWR для предзаполнения кэша

На практике

В реальных проектах middleware часто используется для:

  • проверки авторизации (редирект на /login)
  • A/B тестирования
  • гео-блокировки

А useSWR - для:

  • подгрузки динамических данных после загрузки страницы
  • автоматической ревалидации при фокусе окна
  • оптимистичных обновлений

Если нужно защитить страницу от неавторизованного доступа, middleware сделает редирект до того, как страница начнёт рендериться. Но если данные для страницы должны быть доступны сразу - используйте серверный фетчинг.

Пример кода

JAVASCRIPT
// middleware.ts - не блокирует useSWR
export function middleware(request) {
if (!request.cookies.has('token')) {
return NextResponse.redirect('/login')
}
}
// Страница с useSWR - выполнится только в браузере
export default function Dashboard() {
const { data } = useSWR('/api/user', fetcher)
// data будет undefined при первом рендере
return <div>{data?.name || 'Загрузка...'}</div>
}

Как отвечать на собеседовании

Начни с прямого ответа: "Нет, не блокирует". Объясни разницу между серверным (middleware) и клиентским (useSWR) выполнением. Упомяни, что middleware работает на edge, а useSWR - в браузере после гидратации. Добавь, что для блокировки показа до получения данных нужно использовать серверные методы или fallbackData.

Что проверяет интервьюер

  • Понимание жизненного цикла Next.js (middleware → SSR/SSG → клиент)
  • Знание разницы между серверным и клиентским кодом
  • Умение объяснить, как работают хуки SWR в контексте Next.js
  • Понимание trade-off между SSR и клиентским фетчингом

Типичные ошибки

  • Путать middleware с API routes - middleware не обрабатывает запросы к данным
  • Думать, что useSWR может выполняться на сервере (он клиентский)
  • Предлагать использовать middleware для предзагрузки данных - это не его задача
  • Забывать про fallbackData как альтернативу для начального состояния

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью