Загрузка...
Загрузка...
Next.js это фреймворк на основе React, который берет на себя то, что React из коробки не умеет: серверный рендеринг, маршрутизацию, оптимизацию и многое другое.
React сам по себе это библиотека для построения UI. Он не диктует, как организовать роутинг, где рендерить страницы или как делать API-запросы. Next.js решает все эти вопросы за тебя и дает готовую структуру для продакшен-приложений.
Если ты создаешь React-приложение с нуля через create-react-app или Vite, то получаешь SPA (Single Page Application). Весь HTML генерируется на клиенте с помощью JavaScript. Это создает несколько проблем:
Next.js решает все это из коробки.
Next.js позволяет выбирать стратегию рендеринга для каждой страницы отдельно:
// SSR: данные запрашиваются при каждом запросе
export default async function Page() {
const data = await fetch('https://api.example.com/posts', {
cache: 'no-store'
})
const posts = await data.json()
return <PostList posts={posts} />
}
// SSG: данные запрашиваются один раз при сборке (по умолчанию)
export default async function Page() {
const data = await fetch('https://api.example.com/posts')
const posts = await data.json()
return <PostList posts={posts} />
}
// ISR: обновляется каждые 60 секунд
export default async function Page() {
const data = await fetch('https://api.example.com/posts', {
next: { revalidate: 60 }
})
const posts = await data.json()
return <PostList posts={posts} />
}
В Next.js не нужно настраивать React Router. Структура файлов в папке app автоматически становится маршрутами:
app/
page.tsx -> /
about/
page.tsx -> /about
blog/
page.tsx -> /blog
[slug]/
page.tsx -> /blog/my-post (динамический роут)
Квадратные скобки [slug] создают динамический сегмент. Next.js сам разберется, как сопоставить URL с компонентом.
В App Router (начиная с Next.js 13) компоненты по умолчанию являются серверными. Это значит, что они выполняются на сервере и отправляют готовый HTML клиенту.
// Этот компонент выполняется на сервере
// Можно напрямую обращаться к БД, файловой системе и т.д.
export default async function UsersPage() {
const users = await db.user.findMany()
return (
<ul>
{users.map(user => (
<li key={user.id}>{user.name}</li>
))}
</ul>
)
}
Если нужна интерактивность (useState, onClick, useEffect), добавляешь 'use client' в начало файла:
'use client'
import { useState } from 'react'
export default function Counter() {
const [count, setCount] = useState(0)
return (
<button onClick={() => setCount(count + 1)}>
Нажатий: {count}
</button>
)
}
Next.js позволяет создавать бэкенд-эндпоинты прямо в проекте. Для этого в App Router используются Route Handlers:
// app/api/users/route.ts
import { NextResponse } from 'next/server'
export async function GET() {
const users = await db.user.findMany()
return NextResponse.json(users)
}
export async function POST(request: Request) {
const body = await request.json()
const user = await db.user.create({ data: body })
return NextResponse.json(user, { status: 201 })
}
Это удобно для простых API, обработки форм, вебхуков. Для сложного бэкенда лучше использовать отдельный сервер.
Next.js включает оптимизации, которые в обычном React пришлось бы настраивать самостоятельно:
Image автоматически оптимизирует изображения: ресайзит, конвертирует в WebP, добавляет lazy loading.Link предзагружает страницы при наведении курсора, делая навигацию мгновенной.Script контролирует загрузку сторонних скриптов, чтобы не блокировать рендеринг.import Image from 'next/image'
import Link from 'next/link'
export default function Header() {
return (
<header>
<Image src="/logo.png" width={120} height={40} alt="Logo" />
<nav>
<Link href="/about">О нас</Link>
<Link href="/blog">Блог</Link>
</nav>
</header>
)
}
| React | Next.js | |
|---|---|---|
| Тип | Библиотека | Фреймворк |
| Рендеринг | Только CSR | SSR, SSG, ISR, CSR |
| Роутинг | Нужен React Router | Встроенный (файловый) |
| SEO | Проблемы без SSR | Отличный из коробки |
| API | Нет | Route Handlers |
| Оптимизация | Вручную | Встроенная |
React не заменяется на Next.js. Next.js работает поверх React. Ты по-прежнему пишешь компоненты, используешь хуки и все остальное из React. Next.js просто добавляет инфраструктуру вокруг этого.
Подходит для:
Может быть избыточным для:
Next.js это не замена React, а надстройка, которая превращает его из UI-библиотеки в полноценный фреймворк для продакшена. Он берет на себя серверный рендеринг, роутинг, оптимизацию и API, позволяя разработчику сосредоточиться на продукте, а не на конфигурации.
На собеседовании важно показать, что ты понимаешь не просто "Next.js это фреймворк на React", а конкретно какие проблемы он решает и когда его выбор оправдан.