Домашнє завдання #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 →
fetchPOST на/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
- Запуш проєкт на GitHub
- Зайди на vercel.com → Add New → Project → Import свого GitHub-репозиторію
- Vercel сам розпізнає Next.js — тисни Deploy, білд-команди налаштовувати не треба
- Якщо є env-змінні — додай їх у Project Settings → Environment Variables (у git їх немає, пам'ятаєш?)
- Перевір live URL: усі сторінки, блог, форму
- Постав 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
Як здати
- Це — окремий публічний репозиторій
README.md: хто ти, що за сайт, live URL на Vercel, як запустити локально, які env-змінні потрібні (якщо є).env— НЕ комітити; якщо змінні є — додай.env.example- Мінімум 5 комітів — фінальний проєкт заслуговує на чесну історію
- Скріншоти в
screenshots/:desktop.png(головна),mobile.png,interaction.png(форма контактів з помилками валідації або сторінка проєктів) - Здай посиланням на репозиторій (у 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: create-next-app → layout + header/footer → порожні сторінки → GitHub → перший деплой на Vercel
- Вечір 2: головна (hero, навички, виділені проєкти) + сторінка проєктів з реальними скріншотами твоїх ДЗ
- Вечір 3: перенос блогу з ДЗ #24 + форма контактів з API route
- Вечір 4: SEO (metadata, OG, robots, sitemap), responsive-прохід по всіх сторінках на 390px, скріншоти, README з live URL
Що далі
А далі — все по-справжньому. Цей сайт — живий: додавай нові проєкти, пиши статті, онови його, коли знайдеш першу роботу. Постав live URL у резюме та LinkedIn. Ти пройшов шлях від <h1>Привіт, світ!</h1> до задеплоєного Next.js-застосунку в продакшні — тепер ти розробник з портфоліо, яке це доводить.