Skip to main content

Чим app відрізняється від pages у Next.js?

Коротко: app - сучасний, потужний і "правильний" шлях, pages - старий, зрозумілий і все ще робочий.

Тепер розкладемо чітко і без води, щоб було зрозуміло коли і навіщо.


Загальне

У Next.js є два роутери:

pagesapp
Статусlegacyосновний (recommended)
ПідхідReact + SPAReact Server Components
Рік появи~20162023+
Майбутнєпідтримка єсюди йде розвиток

Як працює

pages/ ├─ index.tsx → / ├─ blog.tsx → /blog └─ users/[id].tsx → /users/1

Характеристики

  • все - Client Components
  • дані через getServerSideProps, getStaticProps
  • немає вкладених layout
  • немає стрімінгу
  • немає server actions
  • _app.tsx, _document.tsx - милиці глобальності
ts
export async function getServerSideProps() { return { props: { data } } }

App Router (app/) - сучасний стандарт

https://nextjs.org/_next/image?q=75&url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fdocs%2Flight%2Fproject-organization-colocation.png&w=3840
https://nextjs.org/_next/image?q=75&url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fdocs%2Flight%2Fproject-organization-colocation.png&w=3840
https://cdn.sanity.io/images/rdn92ihu/production/17109a56b52f83af20adda513b7f52e01ce803ce-1281x1039.png?auto=format&fit=max&h=1039&w=1281
https://cdn.sanity.io/images/rdn92ihu/production/17109a56b52f83af20adda513b7f52e01ce803ce-1281x1039.png?auto=format&fit=max&h=1039&w=1281

Як працює

app/ ├─ layout.tsx ├─ page.tsx → / ├─ blog/ │ └─ page.tsx → /blog └─ users/[id]/ └─ page.tsx → /users/1

Ключові відмінності

  • Server Components типово
  • вкладені layout.tsx
  • streaming + loading states
  • server actions (без API)
  • parallel routes / slots
  • route groups (auth)
  • складніше ментально

Головна архітектурна відмінність

pages

Сторінка = компонент

app

Сторінка = дерево сегментів (layout → loading → error → page)


Робота з даними

pages

ts
getServerSideProps getStaticProps getInitialProps

app

ts
const data = await fetch(...) const data = await prisma.task.findMany()

Прямо в компоненті, без прокладок.


Layout'и

pages

  • глобальний _app.tsx
  • немає вкладеності

app

txt
app/ ├─ layout.tsx # global └─ dashboard/ └─ layout.tsx # тільки для /dashboard/*

Продуктивність

pagesapp
JS у браузерібагатоменше
SSRтактак (розумніше)
Streamingнітак
Partial renderнітак

Server Actions (killer-feature app)

ts
"use server"; export async function submit(formData: FormData) { await prisma.task.create(...) }
  • без API
  • без fetch
  • типобезпечно
  • швидше

У pages цього немає.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.