Next.js
На мой взгляд, Next.js - это лучший на сегодняшний день инструмент для разработки веб-приложений.
Обратите внимание: руководство актуально для Next.js версии 14.
- Официальные примеры использования Next.js
- Классные туториалы по разработке веб-приложений с помощью Next.js
Введение
Что такое Next.js?
Next.js - это фреймворк React для создания клиент-серверных (fullstack) веб-приложений. Мы используем компоненты React для разработки UI (user interface - пользовательский интерфейс) и Next.js для дополнительных возможностей и оптимизаций.
Под капотом Next.js также абстрагирует и автоматически настраивает инструменты, необходимые React, такие как сборка, компиляция и др. Это позволяет сосредоточиться на разработке приложения вместо того, чтобы тратить время на настройку этих инструментов.
Next.js помогает разрабатывать интерактивные, динамичные и быстрые приложения React.
Основные возможности
Некоторые из основных возможностей, предоставляемых Next.js:
Возможность | Описание |
---|---|
Маршрутизация (далее также - роутинг) | Основанный на файловой системе маршрутизатор (далее также - роутер), разработанный на основе серверных компонентов, поддерживающий макеты (layouts), вложенный роутинг, состояние загрузки, обработку ошибок и др. |
Рендеринг | Клиентский и серверный рендеринг с помощью соответствующих компонентов. Возможность дальн ейшей оптимизации с помощью статического и динамического рендеринга на сервере за счет граничной (edge) потоковой передачи Next.js и среды выполнения Node.js |
Запрос/получение данных | Упрощенное получение данных с помощью async/await в серверных компонентах. Расширенный Fetch API для мемоизации запросов, кеширования и ревалидации данных |
Стилизация | Поддержка разных способов стилизации, включая модули CSS, TailwindCSS и CSS-в-JS |
Оптимизации | Оптимизация изображений, шрифтов и скриптов для улучшения показателей Core Web Vitals приложения и UX (user experience - пользовательский опыт) |
TypeScript | Улучшенная поддержка TS с лучшей проверкой типов и более эффективной компиляцией, а также кастомный плагин TS и средство проверки типов |
Установка
Требования к системе:
- Node.js 18.17+
- macOS, Windows (включая WSL) и Linux
Для создания нового проекта рекомендуется использовать CLI (command line interface - интерфейс командной строки) create-next-app
:
npx create-next-app@latest
Структура проекта Next.js
Директории верхнего уровня
Директории верхнего уровня предназначены для организации кода приложения и статических ресурсов.
Директория | Назначение |
---|---|
app | Роутер приложения |
pages | Роутер страниц |
public | Статические файлы |
src | Опциональная дир ектория кода приложения |
Файлы верхнего уровня
Файлы верхнего уровня используются для настройки приложения, управления зависимостями, запуска посредников (middleware - промежуточное программное обеспечение), интеграции инструментов мониторинга и определения переменных окружения.
Файл | Назначение |
---|---|
next.config.js | Настройки Next.js |
package.json | Зависимости и скрипты проекта |
instrumentation.ts | Телеметрия |
middleware.ts | Посредники |
.env | Переменные окружения |
.env.local | Переменные локального окружения |
.env.production | Переменные производственного окружения |
.env.development | Переменные рабочего окружения |
.eslintrc.json | Настройки ESLint |
.gitignore | Файлы и директории, игнорируемые Git |
next-env.d.ts | Файл определений типов Next.js |
tsconfig.json | Настройки TypeScript |
jsconfig.json | Настройки JavaScript |
Соглашения о файлах директории app
В роутере приложения используются следующие соглашения для определения роутов и обработки метаданных:
Файлы роутов
Файл | Расширение | Назначение |
---|---|---|
layout | .js .jsx .tsx | Макет |
page | .js .jsx .tsx | Страница |
loading | .js .jsx .tsx | UI загрузки |
not-found | .js .jsx .tsx | UI отсутствующей страницы |
error | .js .jsx .tsx | UI ошибки |
global-error | .js .jsx .tsx | UI глобальной ошибки |
route | .js .ts | Конечная точка API |
template | .js .jsx .tsx | Повторно используемый макет |
default | .js .jsx .tsx | Резервная страница параллельных роутов |
Вложенные роуты
Название | Назначение |
---|---|
folder | Сегмент роута |
folder/folder | Вложенный сегмент роута |
Динамические роуты
Название | Назначение |
---|---|
[folder] | Сегмент динамического роута |
[...folder] | Сегмент роута-перехватчика |
[[..folder]] | Сегмент опционального роута-перехватчика (catch-all route) |
Группы роутов и закрытые директории
Название | Назначение |
---|---|
(folder) | Группировка роутов без влияния на роутинг (вид URL (uniform resource locator - единообразный указатель местонахождения ресурса)) |
_folder | Опциональная директория, потомки которой не влияют на роутинг |
Параллельные и перехваченные роуты
Название | Назначение |
---|---|
@folder | Именованный слот |
(.)folder | Перехват роута того же уровня |
(..)folder | Перехват роута верхнего уровня |
(..)(..)folder | Перехват роута на два уровня выше |
(...)folder | Перехват роута корневого уровня |
Соглашения о файлах с метаданными
Иконки приложения
Файл | Расширение | Назначение |
---|---|---|
favicon | .ico | Фавиконка |
icon | .ico .jpg .jpeg .png .svg | Иконка приложения |
icon | .js .ts .tsx | Генерируемая иконка приложения |
apple-icon | .jpg .jpeg, .png | Иконка приложения Apple |
apple-icon | .js .ts .tsx | Генерируемая иконка приложения Apple |
Изображения Open Graph и Twitter
Файл | Расширение | Назначение |
---|---|---|
opengraph-image | .jpg .jpeg .png .gif | Изображение Open Graph |
opengraph-image | .js .ts .tsx | Генерируемое изображение Open Graph |
twitter-image | .jpg .jpeg .png .gif | Изображение Twitter |
twitter-image | .js .ts .tsx | Генерируемое изображение Twitter |
SEO (search engine optimization - оптимизация движка поиска)
Файл | Расширение | Назначение |
---|---|---|
sitemap | .xml | Sitemap |
sitemap | .js .ts | Генерируемый Sitemap |
robots | .txt | Robots |
robots | .js .ts | Генерируемый Robots |
Роутинг
Основы
Терминология
- tree (дерево) - соглашение о визуализации иерархической структуры. Например, дерево компонентов с родительским и дочерними компонентами, структура директории и др.
- subtree (поддерево) - часть дерева, начинающаяся в новом корне (root) и заканчивающаяся в листьях (leaves)
- root (корень) - первый узел дерева или поддерева, такой как корневой макет
- leaf (лист) - узел поддерева, не имеющий потом ков, такой как последней сегмент URL
- URL segment (сегмент URL) - часть URL, отделенная слэшем
- URL path (путь URL) - часть URL, следующая за доменом (состоит из сегментов)
Роутер app
В версии 13 Next.js представил новый роутер приложения, разработанный на основе серверных компонентов React, поддерживающий общие (shared) макеты, вложенный роутинг, состояние загрузки, обработку ошибок и др.
Роуты приложения теперь находятся в директории app
. Раньше такой директорией являлась pages
. Эти директории могут существовать совместно, например, во время перехода с pages
на app
(или до того, как это сделают библиотеки экосистемы Next.js), но app
имеет приоритет.
По умолчанию компоненты внутри app
являются серверными. Существуют также клиентские компоненты. Мы поговорим об этом позже.
Роли директорий и файлов
В Next.js используется роутинг на основе файловой системы, где:
- директории используются для определения роутов. Роут - это единичный путь вложенных директорий, следующий иерархии файловой системы от корневой директории к финальной листовой директории, содержащей файл
page.js
- файлы используются для создания UI, отображаемого для сегмента роута
Сегменты роута
Каждая директория в роуте представляет его сегмент. Каждый сегмент роута связан с соответствующим сегментом URL.
Вложенные роуты
Для создания вложенных роутов директории вкладываются друг в друга. Например, мы можем добавить новый роут /dashboard/settings
путем вложения двух новых директорий в директорию app
.
Роут /dashboard/settings
состоит из трех сегментов:
/
(корневой сегмент)dashboard
(сегмент)settings
(листовой сегмент)
Соглашения о файлах
Next.js предоставляет специальные файлы для создания UI с определенным поведением во вложенных роутах:
Название | Назначение |
---|---|
layout | Общий UI для сегмента и его потомков |
page | Уникальный UI роута. Делает роут открытым (публично доступным) |
loading | UI загрузки для сегмента и его потомков |
not-found | UI отсутствующей страницы для сегмента и его потомков |
error | UI ошибки для сегмента и его потомков |
global-error | UI глобальной ошибки |
route | Серверная конечная точка API |
template | Специальный повторно используемый UI макета |
default | Резервный UI для параллельных роутов |
Для специальных файлов могут использоваться расширения .js,
.jsx
или .tsx
.
Иерархия компонентов
Компоненты, определенные в специальных файлах сегмента роута, рендерятся в следующем порядке:
-layout.js
-template.js
-error.js
(React error boundary (предохранитель))
-loading.js
(React suspense boundary (для ленивой загрузка, частичного рендеринга и др.))
-not-found.js
(предохранитель)
-page.js
или вложенный layout.js
Во вложенном роуте компоненты сегмента будет вложенными внутри компонентов их родительского сегмента.
Совместное размещение
В дополнение к специальным, мы можем добавлять собственные файлы (компоненты, стили, тесты и др.) в директории app
.
Это возможно благодаря тому, что публично доступным является только содержимое файлов page.js
и route.js
.
Продвинутые паттерны роутинга
Роутер приложения также позволяет реализовывать более продвинутые паттерны роутинга:
- параллельные роуты - позволяют одновременно показывать несколько страниц в одном отображении (view). На страницы можно переходить независимо. Параллельные роуты используются для разделения отображений, содержащих собственную навигацию. Примером такого компонента может служить панель управления (dashboard)
- перехватывающие роуты - позволяют перехватывать роут и показывать его содержимое в контексте другого роута. Они используются в случаях, когда важно сохранить контекст текущей страницы. Примером такой ситуации может служить просмотр всех задач при редактировании одной из них и увеличение изображения в галерее
Эти паттерны позволяют разрабатывать более богатые и сложные UI.