Практичний вступ до сучасного Next.js 

План заняття

  1. Вступ до Next.js
  2. Налаштування середовища розробки
  3. Структура файлів і папок
  4. Порівняння app та pages
  5. Маршрутизація з App Router
  6. Серверні та клієнтські компоненти
  7. Фетчинг даних у App Router
  8. Налаштування Next.js
  9. Збірка та розгортання проекту
  10. Підсумки та запитання

1. Вступ до Next.js

1.1. Що таке Next.js

Next.js — фреймворк для React, який дозволяє створювати веб-застосунки різного типу.
З виходом версії 13, Next.js представив App Router, що відкриває нові можливості для розробників.

1.2. Ключові особливості та переваги

  • Серверні та клієнтські компоненти: Можливість використовувати переваги серверних компонентів React 18.
  • Покращена маршрутизація: Новий App Router забезпечує гнучкіший та потужніший підхід до маршрутизації.
  • Оптимізація продуктивності: Краща розбивка коду та кешування даних.
  • Нові можливості фетчингу даних: Просте отримання та кешування даних на сервері.

1.3. Нововведення в останніх версіях

Останні версії Next.js включають:

  • App Router та папка app/
  • Підтримка серверних компонентів React
  • Покращений фетчинг даних з автоматичним кешуванням

2. Налаштування середовища розробки

2.1. Встановлення Node.js та npm

Переконайтеся, що у вас встановлені Node.js та npm. Завантажте їх з офіційного сайту nodejs.org.

2.2. Створення нового проекту Next.js з App Router

Для створення нового проекту з використанням App Router та TypeScript виконайте команду:

npx create-next-app@latest my-next-app

Потрібно обрати відповідні параметри для App Router та TypeScript.

2.3. Огляд файлу package.json

Відкрийте файл package.json, де містяться залежності та скрипти для запуску проекту.

3. Структура файлів і папок

3.1. Огляд основних папок

  • app/: містить серверні та клієнтські компоненти, маршрути та макети.
  • public/: статичні файли, доступні безпосередньо.
  • styles/: файли стилів CSS.
  • types/: файли з типами TypeScript (опціонально).
  • api/: файли для API запитів.

3.2. Призначення ключових файлів

  • app/page.tsx: головна сторінка застосунку.
  • app/layout.tsx: кореневий макет для застосунку.
  • next.config.mjs: файл налаштувань Next.js.
  • tsconfig.json: конфігураційний файл TypeScript.

3.3. Діаграма структури проекту з App Router

Візуалізація структури проекту

4. Порівняння app та pages

4.1. Папка pages/

  • Маршрутизація на основі файлів: кожен файл у папці pages/ стає маршрутом.
  • Обмеження: Підтримує лише клієнтські компоненти.
  • getStaticProps та getServerSideProps: Спеціальні функції для фетчингу даних.
  • За замовчуванням: Використовується у версіях Next.js до 13.

4.2. Папка app/ (App Router)

  • Новий підхід до маршрутизації: Представлений у Next.js 13.
  • Серверні та клієнтські компоненти: Підтримка React Server Components.
  • Фетчинг даних: Використання fetch безпосередньо у серверних компонентах.
  • Макети: Підтримка спільних макетів з layout.tsx.

4.3. Порівняльна таблиця

Особливість pages/ app/ (App Router)
Підтримка серверних компонентів ❌ Немає ✔️ Є
Система маршрутизації На основі файлів На основі директорій
Фетчинг даних getStaticProps, getServerSideProps Використання fetch у компоненті
Макети Немає Підтримуються через layout.tsx
Статична генерація Підтримується Підтримується
Підтримка TypeScript ✔️ Є ✔️ Є

5. Маршрутизація з App Router

5.1. Нова система маршрутизації

App Router використовує папку app/ для визначення маршрутів. Кожна папка представляє маршрут, а файл page.tsx в цій папці відповідає за вміст сторінки.

5.2. Створення маршрутів у папці app/

Наприклад, створення сторінки "About":

// app/about/page.tsx
export default function AboutPage() {
  return <h1>Про нас</h1>;
}

5.3. Приклади коду

Створимо динамічний маршрут для постів:

// app/posts/[id]/page.tsx
interface PostPageProps {
  params: { id: string };
}

export default function PostPage({ params }: PostPageProps) {
  const { id } = params;

  return <p>Пост: {id}</p>;
}

6. Серверні та клієнтські компоненти

6.1. Різниця між серверними та клієнтськими компонентами

  • Серверні компоненти виконуються на сервері та можуть виконувати фетчинг даних безпосередньо.
  • Клієнтські компоненти виконуються у браузері та можуть використовувати стан та ефекти.

6.2. Створення компонентів у App Router

За замовчуванням, компоненти у папці app/ є серверними. Щоб створити клієнтський компонент, додайте 'use client'; на початку файлу.

// app/components/Counter.tsx
"use client";

import { useState } from "react";

export default function Counter() {
  const [count, setCount] = useState(0);

  return (
    <button onClick={() => setCount(count + 1)}>Клікнули {count} разів</button>
  );
}

Використовуємо компонент у сторінці поста:

// app/posts/[id]/page.tsx
import Counter from "@/app/components/Counter";

interface PostPageProps {
  params: { id: string };
}

export default function PostPage({ params }: PostPageProps) {
  const { id } = params;

  return (
    <>
      <p>Пост: {id}</p>
      <Counter />
    </>
  );
}

6.3. Використання хуків та стану

Клієнтські компоненти можуть використовувати React-хуки, такі як useState, useEffect тощо.

7. Фетчинг даних у App Router

7.1. Використання fetch у серверних компонентах

Серверні компоненти можуть виконувати фетчинг даних безпосередньо за допомогою fetch.

Приклад фетчингу даних у сторінці постів:

// app/products/page.tsx
interface Product {
  id: number;
  title: string;
}

export default async function ProductsPage() {
  const res = await fetch("https://fakestoreapi.com/products");
  const products: Product[] = await res.json();

  return (
    <ul>
      {products.map((product) => (
        <li key={product.id}>{product.title}</li>
      ))}
    </ul>
  );
}

7.2. Кешування та повторне використання даних

Next.js автоматично кешує запити fetch у серверних компонентах. Ви можете налаштувати кешування за допомогою опцій fetch.

await fetch("https://fakestoreapi.com/products", { cache: "no-store" });

7.3. Приклади використання

Створення сторінки поста з фетчингом даних:

// app/products/[id]/page.tsx
interface ProductPageProps {
  params: { id: string };
}

interface Product {
  id: number;
  title: string;
}

export default async function ProductPage({ params }: ProductPageProps) {
  const { id } = params;
  const res = await fetch(`https://fakestoreapi.com/products/${id}`);
  const product: Product = await res.json();

  return (
    <div>
      <h1>{product.title}</h1>
    </div>
  );
}

8. Налаштування Next.js

8.1. Файл next.config.mjs

Файл next.config.mjs використовується для налаштування вашого Next.js застосунку з App Router.

8.2. Налаштування та оптимізація з App Router

Приклад налаштування basePath:

// next.config.mjs
/** @type {import('next').NextConfig} */
const nextConfig = {
  experimental: {
     basePath: '/docs',
  },
};

module.exports = nextConfig;

8.3. Плагіни та модулі

Ви можете продовжувати використовувати плагіни Next.js з App Router для розширення функціональності.

9. Збірка та розгортання проекту

9.1. Процес збірки

Для збірки проекту виконайте команду:

npm run build

9.2. Розгортання на Vercel

Vercel повністю підтримує проекти з App Router.

9.2.1. Створення облікового запису на Vercel

  1. Перейдіть на vercel.com та зареєструйтеся.
  2. Надати Vercel доступ до ваших репозиторіїв.

9.2.2. Імпорт проекту

  1. Натисніть кнопку "New Project".
  2. Оберіть ваш проект.
  3. Натисніть "Import".

9.2.3. Налаштування проекту

Vercel автоматично визначить налаштування для Next.js з App Router.

9.2.4. Розгортання проекту

  1. Натисніть "Deploy".
  2. Після розгортання отримайте свій URL.

9.2.5. Подальші розгортання та інтеграція з Git

Кожен пуш до репозиторію ініціює нове розгортання.

9.2.6. Налаштування власного домену

Додайте свій домен у вкладці "Domains" та оновіть DNS-записи.

9.2.7. Управління змінними середовища

Додайте змінні у вкладці "Environment Variables".

9.2.8. Моніторинг та логування

Використовуйте Analytics та Logs у Vercel для моніторингу.

9.3. Розгортання на інших платформах

  • Netlify
  • AWS Amplify
  • Heroku

9.4. Best practices

  • Використовуйте серверні компоненти для покращення продуктивності.
  • Налаштуйте кешування фетчингу даних.
  • Використовуйте макети (layout.tsx) для спільних компонентів.

10. Підсумки та запитання

10.1. Ключові моменти заняття

Сьогодні ми ознайомилися з новим App Router у Next.js 13, його структурою та можливостями. Ви дізналися, як створювати серверні та клієнтські компоненти, працювати з фетчингом даних, розгортати проект та використовувати TypeScript.

10.2. Відповіді на запитання студентів

Час для ваших запитань та обговорення.

Додаткові матеріали та ресурси

Вступ до Next.js з використанням App Router

By Programming Mentor (Vyacheslav Koldovskyy)

Вступ до Next.js з використанням App Router

  • 47