> Использовал ли ты Next.js? (JavaScript, Next.js)

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

Компании: elirox

Стек: JavaScript, Next.js

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

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

Да, я активно использовал Next.js в production на протяжении последних трёх лет. Работал с версиями 12, 13 и 14, включая App Router, Server Components, middleware, ISR и streaming. Основной фокус был на гибридных приложениях с комбинацией SSR, SSG и client-side рендеринга для оптимизации SEO и производительности.

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

Next.js - это React-фреймворк, который решает ключевые проблемы SPA: SEO, initial load performance и routing. В production я применял его для:

  • Server-Side Rendering (SSR) - для динамических страниц с частым обновлением данных (например, дашборды).
  • Static Site Generation (SSG) - для контентных страниц (блоги, документация) с ревалидацией через ISR.
  • Incremental Static Regeneration (ISR) - для баланса между свежестью данных и скоростью загрузки.
  • App Router - для nested layouts, streaming и Server Components, что снизило количество client-side JavaScript.

Ключевые trade-offs: SSR увеличивает нагрузку на сервер, SSG требует продуманной стратегии ревалидации, а Server Components ограничивают использование хуков и event listeners.

На практике

В одном проекте мы мигрировали с CRA на Next.js для e-commerce платформы. Использовали:

  • App Router с layout groups для разделения админки и публичной части.
  • Middleware для A/B тестирования и редиректов на основе геолокации.
  • Streaming через loading.js и Suspense для улучшения perceived performance.
  • Оптимизацию изображений через next/image с автоматическим WebP и lazy loading.

Проблемы, с которыми столкнулись: сложность отладки Server Components (отсутствие DevTools), неочевидное поведение use client границ, и необходимость тюнинга конфигурации webpack для legacy зависимостей.

Пример кода

JSX
// app/products/[slug]/page.jsx - пример ISR с ревалидацией
import { notFound } from 'next/navigation'
export async function generateStaticParams() {
const products = await fetch('https://api.example.com/products').then(r => r.json())
return products.map(product => ({ slug: product.slug }))
}
export default async function ProductPage({ params }) {
const product = await fetch(`https://api.example.com/products/${params.slug}`, {
next: { revalidate: 3600 } // ISR - ревалидация раз в час
}).then(r => {
if (!r.ok) notFound()
return r.json()
})
return (
<div>
<h1>{product.name}</h1>
<p>{product.description}</p>
</div>
)
}

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

Начни с конкретных проектов и версий Next.js, которые использовал. Подчеркни понимание trade-offs между рендеринг-стратегиями. Упомяни реальные проблемы и их решения - это показывает глубину опыта. Избегай общих фраз вроде "Next.js - это круто". Лучше: "В проекте X мы выбрали ISR вместо SSR, потому что данные обновлялись раз в час, а трафик был неравномерным". Если спросят про App Router - покажи знание Server Components, streaming и параллельных маршрутов.

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

  • Понимание разницы между SSR, SSG, ISR и когда что применять.
  • Опыт работы с App Router и его отличия от Pages Router.
  • Знание проблем и ограничений Next.js (например, Server Components vs client-side интерактивность).
  • Умение оптимизировать производительность (image optimization, code splitting, bundle analysis).
  • Навыки работы с middleware, API routes и edge runtime.

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

  • Путать SSR и SSG, не понимать механизм ревалидации ISR.
  • Использовать use client на каждом шагу, убивая преимущества Server Components.
  • Игнорировать конфигурацию next.config.js (например, не настраивать remotePatterns для изображений).
  • Не учитывать, что getServerSideProps в Pages Router блокирует рендеринг до завершения запроса.
  • Забывать про hydration mismatch при работе с localStorage или random значениями в серверном коде.

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

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