Вивчай
Домашнє завдання #26 · Next.js: деплой, SEO, фінальний проєкт
100 балів+20 бонусintermediate

Домашнє завдання #26: DevSpace — персональне портфоліо

Фінал усього курсу. Ти будуєш і деплоїш у продакшн справжній персональний сайт — той, посилання на який не соромно поставити в резюме. І головне: ти не починаєш з нуля. Все, що ти зробив за курс, з'їжджається сюди.

Що ти вже маєш

  • Статті з ДЗ #24 — довідник/щоденник переїжджає сюди цілком: контент, lib/posts.ts, сторінки. Не пиши блог з нуля — перенеси і адаптуй
  • Твій каталог (ДЗ #23 і ДЗ #25) — головний кейс секції проєктів
  • Pokedex (ДЗ #21), DevProfile (ДЗ #22), Todo на TS (ДЗ #20) — ще три готових кейси

Підготовка

npx create-next-app@latest my-portfolio --typescript --tailwind --app
cd my-portfolio
npm install gray-matter

Завдання

1. Сторінки

СторінкаURLОпис
Головна/Hero, коротко про себе, ключові навички
Про мене/aboutДетальніше: шлях у програмування, освіта
Проєкти/projectsГалерея проєктів з описами та посиланнями
Блог/blogСписок статей (з ДЗ #24)
Стаття/blog/[slug]Сторінка статті (SSG)
Контакти/contactФорма зворотного зв'язку

2. Головна сторінка

  • Hero: ім'я, ким ти є («Frontend-розробник-початківець» — чесно і нормально), 1-2 речення про себе
  • Навички бейджиками: HTML, CSS, TypeScript, React, Next.js...
  • 2-3 виділених проєкти з посиланням на /projects
  • CTA-кнопка «Зв'язатися» → /contact

3. Сторінка проєктів

Мінімум 3 проєкти — твої ДЗ з курсу. Твій каталог (ДЗ #23/#25) — перший і найпомітніший. Кожна картка:

  • Назва, 2-3 речення: що робить і що ти в ньому навчився
  • Технології бейджиками
  • Скріншот (у тебе вони вже є в screenshots/ кожного репо!)
  • Посилання «Код» (GitHub) та «Демо» (якщо є)

4. Блог

Перенеси з ДЗ #24: content/posts/, lib/posts.ts, список і сторінку статті з generateStaticParams та generateMetadata. Мінімум 3 статті (найкращі з ДЗ #24 плюс, за бажанням, нова — «Як я проходив цей курс»).

5. Форма контактів

Client Component: ім'я, email, повідомлення.

  • Валідація на клієнті (обов'язкові поля, формат email)
  • Submit → fetch POST на /api/contact
  • API route: валідація (400 при порушенні) + console.log даних або запис у JSON
  • Після відправки — «Дякую! Відповім найближчим часом»

6. Layout та дизайн

  • Header з навігацією + footer на всіх сторінках
  • Посилання поточної сторінки в навігації візуально виділене (usePathname)
  • Responsive, mobile-first, Tailwind
  • next/font для шрифту, next/image для зображень

7. SEO

  • metadata для кожної сторінки (title, description)
  • generateMetadata + Open Graph для статей
  • robots.txt та sitemap.xml у public/

8. Deploy на Vercel

  1. Запуш проєкт на GitHub
  2. Зайди на vercel.comAdd New → Project → Import свого GitHub-репозиторію
  3. Vercel сам розпізнає Next.js — тисни Deploy, білд-команди налаштовувати не треба
  4. Якщо є env-змінні — додай їх у Project Settings → Environment Variables (у git їх немає, пам'ятаєш?)
  5. Перевір live URL: усі сторінки, блог, форму
  6. Постав live URL у README і в описі GitHub-репозиторію
Порада

Після підключення кожен git push у main автоматично деплоїться в продакшн, а кожен push у гілку отримує свій preview URL. Так працюють справжні команди — і тепер ти теж.


Структура проєкту

src/
├── app/
│   ├── layout.tsx
│   ├── page.tsx
│   ├── about/page.tsx
│   ├── projects/page.tsx
│   ├── blog/
│   │   ├── page.tsx
│   │   └── [slug]/page.tsx
│   ├── contact/page.tsx
│   └── api/contact/route.ts
├── components/        # Header, Footer, ProjectCard, PostCard, SkillBadge, ContactForm
└── lib/posts.ts       # з ДЗ #24
content/posts/         # статті з ДЗ #24
public/                # зображення, robots.txt, sitemap.xml

Як здати

  1. Це — окремий публічний репозиторій
  2. README.md: хто ти, що за сайт, live URL на Vercel, як запустити локально, які env-змінні потрібні (якщо є)
  3. .envНЕ комітити; якщо змінні є — додай .env.example
  4. Мінімум 5 комітів — фінальний проєкт заслуговує на чесну історію
  5. Скріншоти в screenshots/: desktop.png (головна), mobile.png, interaction.png (форма контактів з помилками валідації або сторінка проєктів)
  6. Здай посиланням на репозиторій (у README — обов'язково live URL)

Критерії оцінювання

КритерійТипБали
Головна: hero, навички бейджиками, 2-3 виділені проєкти, CTA[код]10
Проєкти: мін. 3 картки з описом, технологіями, скріншотом і посиланнями; каталог (ДЗ #23/#25) — головний кейс[код]10
Блог: статті з ДЗ #24 перенесені, SSG через generateStaticParams, мін. 3 статті[код]15
Форма контактів: клієнтська валідація + API route з 400 + повідомлення про успіх[поведінка]10
Layout: header/footer скрізь, активне посилання виділене[код]5
SEO: metadata всіх сторінок, generateMetadata + OG для статей, robots.txt, sitemap.xml[код]10
next/font + next/image використані[код]5
Deploy на Vercel: live URL у README, сайт відкривається, сторінки і блог працюють[поведінка]15
Скріншоти: цілісний дизайн, responsive mobile-версія, форма[скрін]15
Якість коду[код]5
Разом100
Бонус: темна/світла тема (next-themes або свій Context)[поведінка]+10
Бонус: анімації при скролі (CSS або IntersectionObserver)[скрін]+5
Бонус: кастомний домен або лічильник переглядів статей[поведінка]+5

Підказки

Рівень 1: напрямок

Спочатку каркас усіх сторінок з layout і навігацією — і одразу перший деплой на Vercel, навіть напівпорожнього сайту. Далі кожна завершена секція — коміт, push — і вона вже в продакшні. Так ти зловиш проблеми білду рано, а не в ніч перед здачею. Блог не переписуй — скопіюй файли з ДЗ #24 і підлаштуй стилі.

Рівень 2: які інструменти

Активне посилання: 'use client' у Header, usePathname() з next/navigation, порівняння з href → умовний клас. Дані проєктів — простий масив об'єктів у lib/projects.ts, не хардкодь у JSX. next/font: import { Inter } from 'next/font/google' → клас на body. sitemap.xml можна написати руками (6 URL) або згенерувати через app/sitemap.ts. Якщо білд на Vercel падає — читай лог: найчастіше це TypeScript-помилка або звернення до env-змінної, якої немає в налаштуваннях проєкту.

Рівень 3: план на 4 вечори
  1. Вечір 1: create-next-app → layout + header/footer → порожні сторінки → GitHub → перший деплой на Vercel
  2. Вечір 2: головна (hero, навички, виділені проєкти) + сторінка проєктів з реальними скріншотами твоїх ДЗ
  3. Вечір 3: перенос блогу з ДЗ #24 + форма контактів з API route
  4. Вечір 4: SEO (metadata, OG, robots, sitemap), responsive-прохід по всіх сторінках на 390px, скріншоти, README з live URL

Що далі

А далі — все по-справжньому. Цей сайт — живий: додавай нові проєкти, пиши статті, онови його, коли знайдеш першу роботу. Постав live URL у резюме та LinkedIn. Ти пройшов шлях від <h1>Привіт, світ!</h1> до задеплоєного Next.js-застосунку в продакшні — тепер ти розробник з портфоліо, яке це доводить.