1. Фундамент стека: Глубокий разбор TypeScript, React и архитектуры Next.js
Фундамент стека: Глубокий разбор TypeScript, React и архитектуры Next.js
Добро пожаловать в первый модуль курса «Создание эффектного портфолио». Прежде чем мы начнем создавать сложные анимации с Framer Motion или настраивать плавную прокрутку с Lenis, нам необходимо построить прочный фундамент. Эффектное портфолио — это не только красивая картинка, но и производительность, масштабируемость и чистота кода.
В этой статье мы разберем «большую тройку» нашего стека: TypeScript, React и Next.js (с использованием App Router). Мы не будем читать документацию вслух, а сфокусируемся на архитектурных принципах, которые критически важны для современного веб-разработчика.
TypeScript: Ваша страховка от ошибок
Многие новички воспринимают TypeScript как «JavaScript, который заставляет писать больше кода». Однако в контексте профессиональной разработки, TypeScript — это инструмент документации и предотвращения ошибок на этапе написания кода, а не его выполнения.
Статическая типизация против Динамической
JavaScript — язык с динамической типизацией. Это значит, что переменная может хранить число, затем строку, а затем объект. Это удобно для быстрых скриптов, но губительно для крупных приложений.
TypeScript вводит строгую типизацию. Если вы определили, что функция принимает объект с данными о проекте, вы физически не сможете передать туда что-то другое.
Рассмотрим пример компонента карточки проекта для портфолио:
Интерфейсы и Типы
В нашем курсе мы будем часто использовать ключевое слово interface для описания форм объектов (например, пропсов компонентов) и type для создания союзов (Unions) или примитивов.
> TypeScript не запускается в браузере. Он компилируется (транспилируется) в обычный JavaScript. Браузер никогда не узнает о ваших интерфейсах, они нужны только вам и вашему редактору кода.
React: Мышление компонентами
React изменил способ создания интерфейсов, перейдя от манипуляции DOM-деревом к декларативному описанию состояния. Для нашего портфолио важно понимать три кита React: Компоненты, Пропсы и Состояние.
Декларативный подход
Вместо того чтобы говорить браузеру «найди элемент с ID 'button' и добавь ему класс 'active'», мы говорим: «Кнопка должна быть активной, если переменная isActive равна true». React сам решит, как обновить DOM.
Хуки: Управление жизненным циклом
В функциональных компонентах мы используем хуки. Для портфолио нам понадобятся в основном:
Пример использования useRef для анимации:
Архитектура Next.js: App Router
Next.js — это мета-фреймворк поверх React. Если React — это библиотека для создания UI, то Next.js — это полноценный каркас для создания веб-приложений. В версии 13+ был представлен App Router, который мы и будем использовать.
Файловая маршрутизация
В Next.js структура папок определяет URL вашего сайта. Это интуитивно понятно и удобно.
!Структура файловой маршрутизации в Next.js App Router
* app/page.tsx Главная страница (/)
* app/about/page.tsx Страница «Обо мне» (/about)
* app/projects/[id]/page.tsx Динамический маршрут (/projects/1, /projects/cool-app)
Server Components (RSC) vs Client Components
Это самая важная концепция в современном Next.js. По умолчанию все компоненты в папке app являются Серверными Компонентами (React Server Components).
| Характеристика | Server Components (RSC) | Client Components |
| :--- | :--- | :--- |
| Где рендерятся | На сервере (один раз при запросе) | На клиенте (в браузере) и сервере (гидратация) |
| Доступ к БД/Файлам | Прямой доступ | Нет доступа |
| Размер JS-бандла | Не влияет (код не летит в браузер) | Увеличивает размер бандла |
| Интерактивность | Нет (нельзя использовать onClick, useState) | Да (полная интерактивность) |
Для портфолио это разделение критично. Тяжелые вычисления, получение данных о проектах из CMS или Markdown-файлов мы делаем в серверных компонентах. Анимации, слайдеры и формы обратной связи — в клиентских.
Чтобы превратить компонент в клиентский, нужно добавить директиву 'use client' в первой строке файла.
Специальные файлы
В App Router есть зарезервированные имена файлов:
* layout.tsx: Обертка для страниц. Здесь живут <html>, <body>, навигация и футер. Layout не перерисовывается при переходе между страницами внутри него, что идеально для сохранения состояния анимаций переходов.
* page.tsx: Уникальный UI для конкретного маршрута.
* loading.tsx: Показывается, пока грузится содержимое page.tsx.
* not-found.tsx: Кастомная страница 404.
Tailwind CSS: Утилитарный подход
Вместо написания CSS-файлов и придумывания имен классов (.wrapper-main-content-left), мы используем утилитарные классы прямо в JSX.
Пример:
Это ускоряет разработку и гарантирует, что стили не будут конфликтовать. В сочетании с компонентами React, мы получаем изолированные, стилизованные блоки, которые легко переиспользовать.
Подготовка окружения
Для начала работы нам потребуется Node.js. Мы создадим проект следующей командой:
При установке выберите следующие опции:
* TypeScript: Yes
* ESLint: Yes
* Tailwind CSS: Yes
* src/ directory: No (или Yes, по вкусу, но в курсе мы будем работать в корне)
* App Router: Yes
Customize default import alias: No (оставим @/)
Заключение
Мы разобрали фундамент. TypeScript обеспечит надежность данных, React даст нам компонентную модель, а Next.js App Router возьмет на себя маршрутизацию и оптимизацию производительности. Понимание разницы между Server и Client Components — ключ к созданию быстрого портфолио, которое нравится поисковикам и пользователям.
В следующей статье мы начнем настраивать базовый макет и интегрировать Lenis для создания той самой «дорогой» плавной прокрутки.