HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-21
1 <p>Разработка приложений на React может быть долгой и слишком сложной, особенно в самом начале изучения. Рано или поздно вы столкнётесь с проблемами навигации, стилизации и медленным рендерингом на стороне клиента. Все эти проблемы можно решить с помощью Next.js - фреймворка на базе React. В этой статье рассказываем про его фишки и особенности.</p>
1 <p>Разработка приложений на React может быть долгой и слишком сложной, особенно в самом начале изучения. Рано или поздно вы столкнётесь с проблемами навигации, стилизации и медленным рендерингом на стороне клиента. Все эти проблемы можно решить с помощью Next.js - фреймворка на базе React. В этой статье рассказываем про его фишки и особенности.</p>
2 <p><strong>Содержание</strong></p>
2 <p><strong>Содержание</strong></p>
3 <ul><li><a>Что такое Next.js</a></li>
3 <ul><li><a>Что такое Next.js</a></li>
4 <li><a>Зачем нужен Next.js</a></li>
4 <li><a>Зачем нужен Next.js</a></li>
5 <li><a>Основные преимущества Next.js</a></li>
5 <li><a>Основные преимущества Next.js</a></li>
6 <li><a>Салют, Next.js: создаём первый проект</a></li>
6 <li><a>Салют, Next.js: создаём первый проект</a></li>
7 </ul><p>Next.js - это метафреймворк на базе React для разработки клиент-серверных (fullstack) приложений как для мобильных платформ, так и для веба. Если говорить проще, то Next.js помогает решить проблемы, которые есть в React и добавляет новые функции для более удобной и быстрой работы.</p>
7 </ul><p>Next.js - это метафреймворк на базе React для разработки клиент-серверных (fullstack) приложений как для мобильных платформ, так и для веба. Если говорить проще, то Next.js помогает решить проблемы, которые есть в React и добавляет новые функции для более удобной и быстрой работы.</p>
8 <p>Next.js разработала компания Vercel (ранее Zeit) и выпустила его в качестве открытого проекта на GitHub в октябре 2016 года. В его основе лежало шесть принципов:</p>
8 <p>Next.js разработала компания Vercel (ранее Zeit) и выпустила его в качестве открытого проекта на GitHub в октябре 2016 года. В его основе лежало шесть принципов:</p>
9 <ul><li><strong>Всегда готов к работе.</strong>Основные функции фреймворка готовы к работе сразу после развёртывания приложения, надо добавить только данные проекта.</li>
9 <ul><li><strong>Всегда готов к работе.</strong>Основные функции фреймворка готовы к работе сразу после развёртывания приложения, надо добавить только данные проекта.</li>
10 <li><strong>Только JavaScript.</strong>Все функции фреймворка написаны на одном языке программирования, что позволяет добиться большей эффективности.</li>
10 <li><strong>Только JavaScript.</strong>Все функции фреймворка написаны на одном языке программирования, что позволяет добиться большей эффективности.</li>
11 <li><strong>Разделение кода.</strong>Кодовая база приложений автоматически разделяется на серверную и клиентскую. Благодаря этому загружаются только те фрагменты страницы, которые нужны пользователю, а всё остальное, включая внешние скрипты и служебные функции, выполняется на сервере.</li>
11 <li><strong>Разделение кода.</strong>Кодовая база приложений автоматически разделяется на серверную и клиентскую. Благодаря этому загружаются только те фрагменты страницы, которые нужны пользователю, а всё остальное, включая внешние скрипты и служебные функции, выполняется на сервере.</li>
12 <li><strong>Работа с данными.</strong>Разработчик может сам определить, когда и какие данные должно запрашивать приложение.</li>
12 <li><strong>Работа с данными.</strong>Разработчик может сам определить, когда и какие данные должно запрашивать приложение.</li>
13 <li><strong>Предугадывание запросов.</strong>Приложение предсказывает, какие ресурсы скоро понадобятся и заранее загружает их.</li>
13 <li><strong>Предугадывание запросов.</strong>Приложение предсказывает, какие ресурсы скоро понадобятся и заранее загружает их.</li>
14 <li><strong>Простое развёртывание.</strong>Сборка проекта запускается одной командой. Next.js генерирует версию приложения с готовыми файлами HTML, CSS и JavaScript.</li>
14 <li><strong>Простое развёртывание.</strong>Сборка проекта запускается одной командой. Next.js генерирует версию приложения с готовыми файлами HTML, CSS и JavaScript.</li>
15 </ul><p>На момент написания статьи актуальная версия Next.js - 14.0, которая вышла в октябре 2023 года. При этом команда проекта каждый месяц выпускает минорные обновления и работает над версией 15.0.</p>
15 </ul><p>На момент написания статьи актуальная версия Next.js - 14.0, которая вышла в октябре 2023 года. При этом команда проекта каждый месяц выпускает минорные обновления и работает над версией 15.0.</p>
16 <p>Одна из главных задач Next.js - исправить врождённые "болячки" React. Например, React обычно отрисовывает приложение в браузере, а перед рендерингом загружает с сервера и запускает JavaScript-код. Это сильно замедляет работу сайта и заставляет пользователя ждать, пока страница загрузится. Next.js, напротив, рендерит страницы на сервере и отдаёт их в готовом виде.</p>
16 <p>Одна из главных задач Next.js - исправить врождённые "болячки" React. Например, React обычно отрисовывает приложение в браузере, а перед рендерингом загружает с сервера и запускает JavaScript-код. Это сильно замедляет работу сайта и заставляет пользователя ждать, пока страница загрузится. Next.js, напротив, рендерит страницы на сервере и отдаёт их в готовом виде.</p>
17 <p>Вот ещё несколько преимуществ Next.js перед React:</p>
17 <p>Вот ещё несколько преимуществ Next.js перед React:</p>
18 <ul><li><strong>Встроенная навигация.</strong>Для того чтобы добавить новую страницу в приложение и сослаться на неё внутри приложения, достаточно просто создать новый файл в директории проекта.</li>
18 <ul><li><strong>Встроенная навигация.</strong>Для того чтобы добавить новую страницу в приложение и сослаться на неё внутри приложения, достаточно просто создать новый файл в директории проекта.</li>
19 <li><strong>Рендеринг на стороне сервера.</strong>Можно настроить рендеринг так, чтобы он работал на сервере. Тогда приложению не придётся загружать файлы и собирать страницу локально, а пользователю не надо будет ждать, пока страница откроется в браузере.</li>
19 <li><strong>Рендеринг на стороне сервера.</strong>Можно настроить рендеринг так, чтобы он работал на сервере. Тогда приложению не придётся загружать файлы и собирать страницу локально, а пользователю не надо будет ждать, пока страница откроется в браузере.</li>
20 </ul><ul><li><strong>Быстрая разработка.</strong>Многие важные функции в Next.js доступны из коробки, поэтому разработчики могут не тратить время на их реализацию. Например, если в React для настройки маршрутизации надо использовать сторонние библиотеки, то в Next.js всё работает по умолчанию.</li>
20 </ul><ul><li><strong>Быстрая разработка.</strong>Многие важные функции в Next.js доступны из коробки, поэтому разработчики могут не тратить время на их реализацию. Например, если в React для настройки маршрутизации надо использовать сторонние библиотеки, то в Next.js всё работает по умолчанию.</li>
21 <li><strong>Работа с SEO.</strong>Next.js повышает SEO-показатели сайта за счёт серверного рендеринга, статической генерации и управления метатегами.</li>
21 <li><strong>Работа с SEO.</strong>Next.js повышает SEO-показатели сайта за счёт серверного рендеринга, статической генерации и управления метатегами.</li>
22 </ul><p>Давайте рассмотрим, что именно предлагает Next.js, на какие его функции стоит обратить внимание в первую очередь и что они нам дают.</p>
22 </ul><p>Давайте рассмотрим, что именно предлагает Next.js, на какие его функции стоит обратить внимание в первую очередь и что они нам дают.</p>
23 <p>Next.js позволяет разработчикам рендерить HTML-код на стороне сервера в ответ на запрос. Этот метод значительно ускоряет загрузку приложения в сравнении с рендерингом на стороне клиента, особенно если на клиентской стороне слабое железо.</p>
23 <p>Next.js позволяет разработчикам рендерить HTML-код на стороне сервера в ответ на запрос. Этот метод значительно ускоряет загрузку приложения в сравнении с рендерингом на стороне клиента, особенно если на клиентской стороне слабое железо.</p>
24 <p>Next.js позволяет использовать метод генерации статической разметки, при котором HTML-код создаётся на этапе компиляции. Этот метод отлично подходит для страниц, которые редко обновляются. В этом случае код передаётся пользователю напрямую из хранилища контента (content delivery network, CDN).</p>
24 <p>Next.js позволяет использовать метод генерации статической разметки, при котором HTML-код создаётся на этапе компиляции. Этот метод отлично подходит для страниц, которые редко обновляются. В этом случае код передаётся пользователю напрямую из хранилища контента (content delivery network, CDN).</p>
25 <p>В Next.js можно создавать конечные точки API прямо внутри приложения. Если в других фреймворках для работы с базами данных, внешними API и любой другой серверной логикой нужен отдельный бэкенд, то в Next.js всё это можно реализовать в основном проекте.</p>
25 <p>В Next.js можно создавать конечные точки API прямо внутри приложения. Если в других фреймворках для работы с базами данных, внешними API и любой другой серверной логикой нужен отдельный бэкенд, то в Next.js всё это можно реализовать в основном проекте.</p>
26 <p>Next.js использует принципы навигации, основанные на файлах. Благодаря этому структурой проекта можно управлять с помощью простого добавления папок и файлов в основную директорию приложения.</p>
26 <p>Next.js использует принципы навигации, основанные на файлах. Благодаря этому структурой проекта можно управлять с помощью простого добавления папок и файлов в основную директорию приложения.</p>
27 <p>Фреймворк автоматически разбивает ваш код на небольшие части, загружая для каждой страницы только те фрагменты JavaScript-кода, которые в ней используются. Это ускоряет работу всего приложения.</p>
27 <p>Фреймворк автоматически разбивает ваш код на небольшие части, загружая для каждой страницы только те фрагменты JavaScript-кода, которые в ней используются. Это ускоряет работу всего приложения.</p>
28 <p>Горячая замена модулей - функция, которая позволяет разработчикам увидеть внесённые изменения в режиме реального времени. Для этого не надо каждый раз обновлять страницу, что значительно ускоряет разработку.</p>
28 <p>Горячая замена модулей - функция, которая позволяет разработчикам увидеть внесённые изменения в режиме реального времени. Для этого не надо каждый раз обновлять страницу, что значительно ускоряет разработку.</p>
29 <p>Next.js поддерживает импорт файлов CSS и Sass напрямую внутрь компонентов, что позволяет настраивать внешний вид приложения без дополнительных усилий.</p>
29 <p>Next.js поддерживает импорт файлов CSS и Sass напрямую внутрь компонентов, что позволяет настраивать внешний вид приложения без дополнительных усилий.</p>
30 <p>Лучшее обучение - это практика, поэтому от теории перейдём к действиям и создадим свой первый проект на Next.js, но сперва установим сам фреймворк. Чтобы установить последнюю версию Next.js, надо выполнить несколько простых шагов:</p>
30 <p>Лучшее обучение - это практика, поэтому от теории перейдём к действиям и создадим свой первый проект на Next.js, но сперва установим сам фреймворк. Чтобы установить последнюю версию Next.js, надо выполнить несколько простых шагов:</p>
31 <p>1. Убедитесь, что у вас установлен пакетный менеджер NPM или Yarn.</p>
31 <p>1. Убедитесь, что у вас установлен пакетный менеджер NPM или Yarn.</p>
32 <p>2. Откройте терминал и перейдите в папку, в которой будет находиться проект. Для этого можно использовать команду cd.</p>
32 <p>2. Откройте терминал и перейдите в папку, в которой будет находиться проект. Для этого можно использовать команду cd.</p>
33 <p>3. Запустите команду ниже, которая установит последнюю версию Next.js и инициализирует новый проект.</p>
33 <p>3. Запустите команду ниже, которая установит последнюю версию Next.js и инициализирует новый проект.</p>
34 npx create-next-app@latest<p>4. Во время инициализации надо ответить на несколько вопросов, которые помогут настроить проект:</p>
34 npx create-next-app@latest<p>4. Во время инициализации надо ответить на несколько вопросов, которые помогут настроить проект:</p>
35 ВопросПереводЗначение по умолчанию1 ✔ What is your project named?Имя проекта'my-app'2 ✔ Would you like to use TypeScript? No/yesВы хотите использовать TypeScript?Yes3 ✔ Would you like to use ESLint? No/yesВы хотите использовать ESLint?Yes4 ✔ Would you like to use Tailwind CSS? No/yesВы хотите использовать Tailwind CSS?No5 ✔ Would you like to use `src/` directory? No/yesВы хотите использовать папку src?Yes6 ✔ Would you like to use App Router? (recommended) No/yesВы хотите использовать App Router?Yes7 ✔ Would you like to customize the default import alias (@/*)? No/yesВы хотите настроить имя импорта по умолчанию?No8 ✔ What import alias would you like configured? @/*Какое имя импорта вы бы хотели использовать?-<p>5. Теперь вы можете запустить проект всего одной командой:</p>
35 ВопросПереводЗначение по умолчанию1 ✔ What is your project named?Имя проекта'my-app'2 ✔ Would you like to use TypeScript? No/yesВы хотите использовать TypeScript?Yes3 ✔ Would you like to use ESLint? No/yesВы хотите использовать ESLint?Yes4 ✔ Would you like to use Tailwind CSS? No/yesВы хотите использовать Tailwind CSS?No5 ✔ Would you like to use `src/` directory? No/yesВы хотите использовать папку src?Yes6 ✔ Would you like to use App Router? (recommended) No/yesВы хотите использовать App Router?Yes7 ✔ Would you like to customize the default import alias (@/*)? No/yesВы хотите настроить имя импорта по умолчанию?No8 ✔ What import alias would you like configured? @/*Какое имя импорта вы бы хотели использовать?-<p>5. Теперь вы можете запустить проект всего одной командой:</p>
36 npm run dev<p>Вы великолепны! Ваш первый проект на последней версии Next.js запущен.</p>
36 npm run dev<p>Вы великолепны! Ваш первый проект на последней версии Next.js запущен.</p>
37 <p>Давайте посмотрим, что уже есть внутри нашего проекта. Верхнеуровневые папки проекта используются для хранения вашего кода и статических ресурсов, например изображений или внешних скриптов. Всего в Next.js четыре папки:</p>
37 <p>Давайте посмотрим, что уже есть внутри нашего проекта. Верхнеуровневые папки проекта используются для хранения вашего кода и статических ресурсов, например изображений или внешних скриптов. Всего в Next.js четыре папки:</p>
38 <ul><li>app - страницы приложения с навигацией через app;</li>
38 <ul><li>app - страницы приложения с навигацией через app;</li>
39 <li>pages - страницы приложения с навигацией через pages;</li>
39 <li>pages - страницы приложения с навигацией через pages;</li>
40 <li>public - папка для хранения статических ресурсов;</li>
40 <li>public - папка для хранения статических ресурсов;</li>
41 <li>src - дополнительная папка для исходников проекта.</li>
41 <li>src - дополнительная папка для исходников проекта.</li>
42 </ul><p>Верхнеуровневые файлы используются для настройки приложения, управления зависимостями, интеграции систем мониторинга и настройки окружения. Вот основные из них:</p>
42 </ul><p>Верхнеуровневые файлы используются для настройки приложения, управления зависимостями, интеграции систем мониторинга и настройки окружения. Вот основные из них:</p>
43 <ul><li>next.config.js - настройки Next.js;</li>
43 <ul><li>next.config.js - настройки Next.js;</li>
44 <li>package.json - зависимости проекта и скрипты;</li>
44 <li>package.json - зависимости проекта и скрипты;</li>
45 <li>.env - переменные для настройки окружения;</li>
45 <li>.env - переменные для настройки окружения;</li>
46 <li>.eslintrc.json - настройки ESLint;</li>
46 <li>.eslintrc.json - настройки ESLint;</li>
47 <li>tsconfig.json - настройки TypeScript;</li>
47 <li>tsconfig.json - настройки TypeScript;</li>
48 <li>jsconfig.json - настройки JavaScript.</li>
48 <li>jsconfig.json - настройки JavaScript.</li>
49 </ul><p>Добавление страниц в приложение в Next.js основано на структуре файловой системы. До выпуска Next.js 13-й версии всё было просто: чтобы создать новую страницу вашему сайту или приложению, достаточно было добавить файл в структуру pages. Сейчас так тоже можно, но добавился каталог app, который добавляет новые функции и работает одновременно с pages, так что вы можете выбрать, какие страницы где добавлять. Как работает каждый из них и в чём отличия app, рассмотрим ниже.</p>
49 </ul><p>Добавление страниц в приложение в Next.js основано на структуре файловой системы. До выпуска Next.js 13-й версии всё было просто: чтобы создать новую страницу вашему сайту или приложению, достаточно было добавить файл в структуру pages. Сейчас так тоже можно, но добавился каталог app, который добавляет новые функции и работает одновременно с pages, так что вы можете выбрать, какие страницы где добавлять. Как работает каждый из них и в чём отличия app, рассмотрим ниже.</p>
50 <p>Для создания страницы надо добавить файл в папку pages, и он автоматически появится в навигации внутри приложения. Важно помнить, что все файлы в pages - маршруты, основанные на имени файла. Например, если добавить в папку файл contact.js, на сайте появится страница с адресом /contact. При этом разработчику не надо настраивать маршрутизацию вручную.</p>
50 <p>Для создания страницы надо добавить файл в папку pages, и он автоматически появится в навигации внутри приложения. Важно помнить, что все файлы в pages - маршруты, основанные на имени файла. Например, если добавить в папку файл contact.js, на сайте появится страница с адресом /contact. При этом разработчику не надо настраивать маршрутизацию вручную.</p>
51 <p>Next.js также поддерживает динамические маршруты - то есть маршруты, которые могут меняться в зависимости от исходных данных, например названия товаров в онлайн-магазине или ID пользователей социальной сети. Для создания динамической маршрутизации используются файлы с квадратными скобками в названии. Если создать в проекте файл с именем pages/posts/[id].js, он будет доступен по ссылкам posts/1, posts/2 и так далее.</p>
51 <p>Next.js также поддерживает динамические маршруты - то есть маршруты, которые могут меняться в зависимости от исходных данных, например названия товаров в онлайн-магазине или ID пользователей социальной сети. Для создания динамической маршрутизации используются файлы с квадратными скобками в названии. Если создать в проекте файл с именем pages/posts/[id].js, он будет доступен по ссылкам posts/1, posts/2 и так далее.</p>
52 <p>Работать с папкой app так же просто, как с pages, - надо просто добавить файл, а маршрут построится автоматически. При этом у этого способа есть несколько преимуществ:</p>
52 <p>Работать с папкой app так же просто, как с pages, - надо просто добавить файл, а маршрут построится автоматически. При этом у этого способа есть несколько преимуществ:</p>
53 <ul><li>Можно создавать вложенные макеты, которые применяются для страниц определённого раздела.</li>
53 <ul><li>Можно создавать вложенные макеты, которые применяются для страниц определённого раздела.</li>
54 <li>Есть отдельные страницы ошибок для разделов и страниц.</li>
54 <li>Есть отдельные страницы ошибок для разделов и страниц.</li>
55 <li>Выполнение кода на сервере в ответ на действия пользователя.</li>
55 <li>Выполнение кода на сервере в ответ на действия пользователя.</li>
56 <li>Можно рендерить разные страницы по одному и тому же адресу в зависимости от условий.</li>
56 <li>Можно рендерить разные страницы по одному и тому же адресу в зависимости от условий.</li>
57 </ul><p><strong>Важно</strong></p>
57 </ul><p><strong>Важно</strong></p>
58 <p>Навигация внутри папки app приоритетнее навигации внутри pages. Следите, чтобы один и тот же URL не повторялся в разных папках.</p>
58 <p>Навигация внутри папки app приоритетнее навигации внутри pages. Следите, чтобы один и тот же URL не повторялся в разных папках.</p>
59 <p>Вложенные папки внутри app определяют вашу навигацию, следуя от корневой папки до финальной, в которой уже лежит файл page.js. Файлы внутри папок используются для создания контента на определённом узле навигации.</p>
59 <p>Вложенные папки внутри app определяют вашу навигацию, следуя от корневой папки до финальной, в которой уже лежит файл page.js. Файлы внутри папок используются для создания контента на определённом узле навигации.</p>
60 <p>Макет - это набор компонентов, которые используются на разных страницах приложения. Например, меню сайта, хедер и "подвал" одинаковы для всех страниц - значит, их можно вынести в макет и переиспользовать.</p>
60 <p>Макет - это набор компонентов, которые используются на разных страницах приложения. Например, меню сайта, хедер и "подвал" одинаковы для всех страниц - значит, их можно вынести в макет и переиспользовать.</p>
61 <p>У макетов в Next.js есть следующие преимущества:</p>
61 <p>У макетов в Next.js есть следующие преимущества:</p>
62 <ul><li>Элементы макета можно не загружать заново при переходе между страницами - при этом их состояние сохранится. Например, если у вас есть строка поиска, то данные, введённые пользователем на одной странице, сохранятся на другой.</li>
62 <ul><li>Элементы макета можно не загружать заново при переходе между страницами - при этом их состояние сохранится. Например, если у вас есть строка поиска, то данные, введённые пользователем на одной странице, сохранятся на другой.</li>
63 <li>Если у вас несколько групп пользователей с разной навигацией, то вы можете создать макеты навигации для каждой из них. Например, создать два меню: для пользователей и администраторов.</li>
63 <li>Если у вас несколько групп пользователей с разной навигацией, то вы можете создать макеты навигации для каждой из них. Например, создать два меню: для пользователей и администраторов.</li>
64 </ul><p>Чтобы добавить макет в проект, надо создать корневую директорию components и внутри неё файл components/Layout.js, который будет содержать инструкции по загрузке необходимых компонентов. В коде указание children служит для загрузки контента итоговой страницы:</p>
64 </ul><p>Чтобы добавить макет в проект, надо создать корневую директорию components и внутри неё файл components/Layout.js, который будет содержать инструкции по загрузке необходимых компонентов. В коде указание children служит для загрузки контента итоговой страницы:</p>
65 import Header from './Header'; import Footer from './Footer'; const RootLayout = ({ children }) =&gt; { return ( &lt;&gt; &lt;Header /&gt; &lt;main&gt;{children}&lt;/main&gt; &lt;Footer /&gt; &lt;/&gt; ); }; export default RootLayout;<p>Если вы хотите добавить макет только на определённую страницу, то ваш код будет выглядеть так:</p>
65 import Header from './Header'; import Footer from './Footer'; const RootLayout = ({ children }) =&gt; { return ( &lt;&gt; &lt;Header /&gt; &lt;main&gt;{children}&lt;/main&gt; &lt;Footer /&gt; &lt;/&gt; ); }; export default RootLayout;<p>Если вы хотите добавить макет только на определённую страницу, то ваш код будет выглядеть так:</p>
66 import RootLayout from '@/components/Layout'; const Home = () =&gt; { return ( &lt;RootLayout&gt; &lt;main&gt;{/* ... */}&lt;/main&gt; &lt;/RootLayout&gt; ); }; export default Home;<p>Если вы хотите, чтобы макет сохранял своё состояние при переходе между страницами, то его надо добавить в файл pages/_app.js:</p>
66 import RootLayout from '@/components/Layout'; const Home = () =&gt; { return ( &lt;RootLayout&gt; &lt;main&gt;{/* ... */}&lt;/main&gt; &lt;/RootLayout&gt; ); }; export default Home;<p>Если вы хотите, чтобы макет сохранял своё состояние при переходе между страницами, то его надо добавить в файл pages/_app.js:</p>
67 // Импортируем глобальные стили import '@/styles/globals.css'; // Импортируем компонент макета RootLayout import RootLayout from '@/components/Layout'; // Добавляем макет на все страницы приложения export default function App({ Component, pageProps }) { return ( &lt;RootLayout&gt; &lt;Component {...pageProps} /&gt; &lt;/RootLayout&gt; ); }<p>Теперь состояние нашего макета сохраняется при переходе между страницами и нет никакой необходимости прописывать загрузку макета внутри каждой.</p>
67 // Импортируем глобальные стили import '@/styles/globals.css'; // Импортируем компонент макета RootLayout import RootLayout from '@/components/Layout'; // Добавляем макет на все страницы приложения export default function App({ Component, pageProps }) { return ( &lt;RootLayout&gt; &lt;Component {...pageProps} /&gt; &lt;/RootLayout&gt; ); }<p>Теперь состояние нашего макета сохраняется при переходе между страницами и нет никакой необходимости прописывать загрузку макета внутри каждой.</p>
68 <p>Для добавления ссылки в Next.js используется компонент Link. Он реализует навигацию на стороне клиента с использованием JavaScript.</p>
68 <p>Для добавления ссылки в Next.js используется компонент Link. Он реализует навигацию на стороне клиента с использованием JavaScript.</p>
69 <p>Чтобы создать ссылку, например, на страницу about, в код страницы надо добавить следующий код:</p>
69 <p>Чтобы создать ссылку, например, на страницу about, в код страницы надо добавить следующий код:</p>
70 import Link from '@/styles/globals.css' &lt;Link href="/about/"&gt;О нас&lt;/Link&gt;<p>React и Next.js позволяют создавать гибридные приложения, где часть контента рендерится на стороне сервера, а часть - на стороне клиента. По умолчанию Next.js использует серверные компоненты, поэтому вам не надо ничего дополнительно настраивать, чтобы серверный рендеринг работал.</p>
70 import Link from '@/styles/globals.css' &lt;Link href="/about/"&gt;О нас&lt;/Link&gt;<p>React и Next.js позволяют создавать гибридные приложения, где часть контента рендерится на стороне сервера, а часть - на стороне клиента. По умолчанию Next.js использует серверные компоненты, поэтому вам не надо ничего дополнительно настраивать, чтобы серверный рендеринг работал.</p>
71 <p>Использование серверных компонентов идеально для тех частей страниц, которые не требуют динамического обновления в процессе работы пользователя на странице. Вот в чём их преимущество:</p>
71 <p>Использование серверных компонентов идеально для тех частей страниц, которые не требуют динамического обновления в процессе работы пользователя на странице. Вот в чём их преимущество:</p>
72 <ul><li>Так как контент сайта генерируется на сервере, клиенту поступает уже готовая HTML-страница - браузеру не нужно рендерить массивные JS-блоки.</li>
72 <ul><li>Так как контент сайта генерируется на сервере, клиенту поступает уже готовая HTML-страница - браузеру не нужно рендерить массивные JS-блоки.</li>
73 <li>Вы сохраняете логику и чувствительные данные на сервере, включая токены и API. Так меньше шансов, что они "утекут" клиенту.</li>
73 <li>Вы сохраняете логику и чувствительные данные на сервере, включая токены и API. Так меньше шансов, что они "утекут" клиенту.</li>
74 <li>Код готовой страницы может храниться на сервере и повторно использоваться при следующих запросах.</li>
74 <li>Код готовой страницы может храниться на сервере и повторно использоваться при следующих запросах.</li>
75 <li>Сгенерированная на сервере страница гораздо легче обрабатывается поисковыми ботами и ботами социальных сетей.</li>
75 <li>Сгенерированная на сервере страница гораздо легче обрабатывается поисковыми ботами и ботами социальных сетей.</li>
76 </ul><p>Клиентские компоненты, в свою очередь, рендерятся и на сервере, и на клиенте. При первом запросе они создаются на стороне сервера, а затем отправляются в браузер клиента. Когда пользователь просматривает загруженную страницу, все обновления будут происходить уже на клиентской стороне. Такие компоненты удобно использовать для анимации или изменения контента в ответ на действия пользователя - например, при нажатии на кнопку "Нравится" или отправке формы.</p>
76 </ul><p>Клиентские компоненты, в свою очередь, рендерятся и на сервере, и на клиенте. При первом запросе они создаются на стороне сервера, а затем отправляются в браузер клиента. Когда пользователь просматривает загруженную страницу, все обновления будут происходить уже на клиентской стороне. Такие компоненты удобно использовать для анимации или изменения контента в ответ на действия пользователя - например, при нажатии на кнопку "Нравится" или отправке формы.</p>
77 <p>Чтобы использовать клиентские компоненты, просто добавьте строчку 'use client' в начале вашего файла.</p>
77 <p>Чтобы использовать клиентские компоненты, просто добавьте строчку 'use client' в начале вашего файла.</p>
78 'use client' import { useState } from 'react' // the rest of your code<p>Всё, что определено в данном файле, включая импортируемые модули, будет обрабатываться как клиентские компоненты.</p>
78 'use client' import { useState } from 'react' // the rest of your code<p>Всё, что определено в данном файле, включая импортируемые модули, будет обрабатываться как клиентские компоненты.</p>
79 <p>В Next.js есть удобные инструменты для работы с изображениями, например опция ленивой загрузки (lazy load) и заполнение мест под картинки. Это позволяет разработчикам добиться более быстрой загрузки страницы и предотвращает "съезжание" картинок.</p>
79 <p>В Next.js есть удобные инструменты для работы с изображениями, например опция ленивой загрузки (lazy load) и заполнение мест под картинки. Это позволяет разработчикам добиться более быстрой загрузки страницы и предотвращает "съезжание" картинок.</p>
80 <p>Изображения можно загружать как из локального хранилища, так и с внешних источников, например со стороннего сервера. При этом менять размер картинок можно уже внутри самого приложения.</p>
80 <p>Изображения можно загружать как из локального хранилища, так и с внешних источников, например со стороннего сервера. При этом менять размер картинок можно уже внутри самого приложения.</p>
81 <p>Для использования изображений в приложении понадобится следующий код:</p>
81 <p>Для использования изображений в приложении понадобится следующий код:</p>
82 import Image from 'next/image' import Avatar from './me.png' export default function Page() { return ( &lt;Image src={Avatar} ) }<p>Преимущество работы с изображениями в Next.js в том, что фреймворк расширяет базовый HTML-компонент &lt;img&gt; с помощью дополнительных функций. Например, можно оптимизировать размер изображения под платформу пользователя и загружать картинки по мере прокрутки страницы.</p>
82 import Image from 'next/image' import Avatar from './me.png' export default function Page() { return ( &lt;Image src={Avatar} ) }<p>Преимущество работы с изображениями в Next.js в том, что фреймворк расширяет базовый HTML-компонент &lt;img&gt; с помощью дополнительных функций. Например, можно оптимизировать размер изображения под платформу пользователя и загружать картинки по мере прокрутки страницы.</p>
83 <p>С помощью внешних скриптов в приложение можно добавить функции, которые разработали сторонние программисты. Например, системы анализа данных, виджеты поддержки пользователей и рекламные блоки.</p>
83 <p>С помощью внешних скриптов в приложение можно добавить функции, которые разработали сторонние программисты. Например, системы анализа данных, виджеты поддержки пользователей и рекламные блоки.</p>
84 <p>В Next.js можно добавить скрипт как ко всему проекту, так и к отдельному элементу. При этом важно помнить, что если скрипт будет использоваться во всём приложении, то его надо встроить в корневой макет, а все остальные - в макеты конечных страниц.</p>
84 <p>В Next.js можно добавить скрипт как ко всему проекту, так и к отдельному элементу. При этом важно помнить, что если скрипт будет использоваться во всём приложении, то его надо встроить в корневой макет, а все остальные - в макеты конечных страниц.</p>
85 <p>Код интеграции скрипта выглядит следующим образом:</p>
85 <p>Код интеграции скрипта выглядит следующим образом:</p>
86 import Script from 'next/script' export default function Page() { return ( &lt;&gt; &lt;Script src="https://example.com/script.js" /&gt; &lt;/&gt; ) }<p>Можно настроить поведение скрипта в Next.js с помощью свойства strategy:</p>
86 import Script from 'next/script' export default function Page() { return ( &lt;&gt; &lt;Script src="https://example.com/script.js" /&gt; &lt;/&gt; ) }<p>Можно настроить поведение скрипта в Next.js с помощью свойства strategy:</p>
87 <ul><li>beforeInteractive - загружает код скрипта до загрузки всего остального кода;</li>
87 <ul><li>beforeInteractive - загружает код скрипта до загрузки всего остального кода;</li>
88 <li>afterInteractive - используется по умолчанию. Загружается после определения кусков кода, необходимых для страницы;</li>
88 <li>afterInteractive - используется по умолчанию. Загружается после определения кусков кода, необходимых для страницы;</li>
89 <li>lazyOnload - загружает скрипт после загрузки основного кода.</li>
89 <li>lazyOnload - загружает скрипт после загрузки основного кода.</li>
90 </ul><p>Чтобы добавить глобальные стили в приложение на Next.js, надо импортировать CSS-файл в pages/_app.js. Например, если у вас в папке styles есть файл styles.css, то импорт будет выглядеть следующим образом:</p>
90 </ul><p>Чтобы добавить глобальные стили в приложение на Next.js, надо импортировать CSS-файл в pages/_app.js. Например, если у вас в папке styles есть файл styles.css, то импорт будет выглядеть следующим образом:</p>
91 import '../styles/style.css' function MyApp({ Component, pageProps }) { return &lt;Component {...pageProps} /&gt; } export default MyApp<p>Стили можно применить как к отдельной странице, так и к определённому компоненту. Например, у нас есть файл navigationbar.css в папке styles. Тогда в файл navigationbar.js мы добавляем код импорта:</p>
91 import '../styles/style.css' function MyApp({ Component, pageProps }) { return &lt;Component {...pageProps} /&gt; } export default MyApp<p>Стили можно применить как к отдельной странице, так и к определённому компоненту. Например, у нас есть файл navigationbar.css в папке styles. Тогда в файл navigationbar.js мы добавляем код импорта:</p>
92 import styles from '../styles/navigationbar.css'; export default function Navigationbar({ current }) { return ( // Ваш код ); }<p>Для взаимодействия с внешними приложениями, отправки и получение запросов нужна конечная точка API. Для этого создайте в папке pages/api файл с функцией в следующем формате:</p>
92 import styles from '../styles/navigationbar.css'; export default function Navigationbar({ current }) { return ( // Ваш код ); }<p>Для взаимодействия с внешними приложениями, отправки и получение запросов нужна конечная точка API. Для этого создайте в папке pages/api файл с функцией в следующем формате:</p>
93 // req - входящее сообщение HTTP, res - HTTP-ответ сервера export default function handler(req, res) { // ... }<p>Один из наиболее популярных способов применения API - это обработка введённых пользователем данных. Если у вас на странице добавлена форма ввода, вы можете отправить POST-запрос и сохранить данные напрямую в базу данных с помощью следующего кода:</p>
93 // req - входящее сообщение HTTP, res - HTTP-ответ сервера export default function handler(req, res) { // ... }<p>Один из наиболее популярных способов применения API - это обработка введённых пользователем данных. Если у вас на странице добавлена форма ввода, вы можете отправить POST-запрос и сохранить данные напрямую в базу данных с помощью следующего кода:</p>
94 export default function handler(req, res) { const email = req.body.email; }
94 export default function handler(req, res) { const email = req.body.email; }