Прокачайся в код-ревью: для первых 50 участников — курс бесплатный

время чтения: 5 мин

Как улучшить производительность сайта с помощью Next.js: 7 полезных советов

Автор статьи — EPAM Senior Software Engineer Рави Кант Сингх.

Senior Software Engineer Рави Кант Сингх

Введение

Для успеха любого бизнеса важно, чтобы у компании был эффективный сайт, поскольку пользователи рассчитывают на быструю загрузку и удобный просмотр страниц.

Достичь этой цели можно с помощью Next.js — популярного фреймворка для создания React-приложений с серверным рендерингом. В статье, основанной на личном опыте, я расскажу, как улучшить производительность сайта с помощью Next.js.

1. Серверный рендеринг (SSR)

Одна из ключевых особенностей Next.js — способность к серверному рендерингу (англ. server-side rendering, SSR). SSR позволяет отрисовать начальную загрузку страницы на стороне сервера и отправить клиенту в виде HTML, уменьшая время загрузки страницы. Это может значительно улучшить производительность сайта, особенно для страниц с большим количеством контента.

Используя SSR, Next.js может получать данные с внешних API или баз данных на стороне сервера и отрисовывать страницу с уже извлеченными данными. Благодаря этому не нужны дополнительные вызовы API на стороне клиента, в результате время загрузки уменьшается. Также SSR может улучшить позиции сайта в выдаче, так как поисковые системы легко индексируют страницы, отрисованные на сервере.

Реализовать SSR в Next.js можно с помощью функции getServerSideProps. Эта функция используется в рамках компонента страницы и позволяет получать данные во время запроса перед отрисовкой страницы.

getServerSideProps function

Используйте getServerSideProps только в том случае, если вам нужно отрисовать страницу, данные для которой должны быть получены во время запроса.

2. Генерация статических сайтов (SSG)

Генерация статических сайтов (англ. static site generation, SSG) в Next.js позволяет предварительно создавать HTML-страницы во время сборки. Это означает, что страницы генерируются в процессе сборки и служат как статические файлы при запросе. Такой подход ускоряет время загрузки страниц, так как контент уже подготовлен и не требует серверной обработки для каждого запроса.

Генерировать статические сайты в Next.js можно с помощью функции getStaticProps. Она позволяет получать данные во время сборки. Также следует использовать getStaticProps, если данные, необходимые для отрисовки страницы, доступны во время сборки — до запроса пользователя.

Функция getStaticProps

3. Разделение кода и ленивая загрузка

Еще две техники для улучшения производительности сайта — разделение кода (англ. code splitting) и ленивая загрузка (англ. lazy loading). Разделение кода позволяет разбить код JavaScript на более мелкие части, которые могут быть загружены по требованию, по мере того, как пользователь перемещается по веб-сайту. Это предотвращает загрузку лишнего кода заранее, в результате страница загружается быстрее.

Next.js предоставляет встроенную поддержку разделения кода. Используя динамические импорты и функцию import(), вы можете динамически загружать компоненты или модули только тогда, когда они нужны. Это уменьшает исходный размер пакета (англ. bundle) и улучшает общую производительность сайта.

Ленивая загрузка нужна для того, чтобы отложить загрузку второстепенных ресурсов (например изображений, компонентов или данных) до тех пор, пока они не понадобятся. Это помогает уменьшить время загрузки страницы: сначала загружается только необходимый контент, а затем (по мере взаимодействия пользователя со страницей) подгружаются дополнительные ресурсы.

В контексте React и Next.js ленивая загрузка часто используется для компонентов, чтобы загружать их асинхронно только когда они нужны, а не на начальной фазе отрисовки.

Lazy loading

В приведенном выше примере DynamicComponent будет загружен тогда, когда он понадобится. Параметр loading в функции dynamic позволяет указать компонент «заполнитель» (англ. placeholder) для отображения во время загрузки фактического компонента.

Таким образом разделение кода и ленивая загрузка в Next.js помогают оптимизировать производительность приложения, улучшить пользовательский опыт и сократить начальное время загрузки страниц.

4. Кэширование и оптимизация ресурсов

Кэширование и оптимизация ресурсов — еще одна отличная стратегия для улучшения производительности сайта. Кэширование статических ресурсов, таких как файлы CSS и JavaScript, позволяет уменьшить количество запросов к серверу и улучшить общее время загрузки сайта.

Next.js предоставляет встроенную поддержку оптимизации и кэширования ресурсов. Он автоматически создает оптимизированные версии файлов CSS и JavaScript, добавляя уникальный хэш к имени файла. Это позволяет браузеру кэшировать ресурсы и загружать их только в случае изменений, поэтому в следующий раз страницы загружаются быстрее.

Преимущества такого подхода:

  • Минификация: Next.js автоматически минифицирует файлы JavaScript и CSS в процессе сборки. Размеры файлов уменьшаются за счет удаления ненужных символов (например пробелов и отступов) без изменения функциональности.
  • Оптимизация изображений: в Next.js есть компонент Image, который автоматически оптимизирует изображения. Вы можете использовать этот компонент для импорта изображений в современных форматах, таких как WebP, и автоматического создания нескольких размеров для адаптивных изображений.
Оптимизация изображений
  • Анализ размера пакетов: проанализируйте и оптимизируйте размер пакетов приложения, чтобы выявить большие зависимости или блоки кода, которые можно разделить или дополнительно оптимизировать. Сделать это можно с помощью специальных инструментов, например, webpack-bundle-analyzer.
  • Сервис-воркеры: внедрение сервис-воркеров позволяет использовать более продвинутые стратегии кэширования, такие как использование Cache API. Это нужно для управления хранилищем кэша и его извлечения, при этом ассеты доступны даже в режиме офлайн. Next.js поддерживает сервис-воркеры, которые можно настроить в приложении.
  • Заголовки кэширования HTTP: Next.js использует заголовки кэширования HTTP для управления кэшированием ресурсов в браузерах и CDN. Вы можете установить заголовки кэширования с помощью файла next.config.js, чтобы указать настройки cache-control для различных типов ассетов:

code-scr5.png

В этом примере:

  • Первая запись устанавливает заголовки кэширования для всех страниц (source: '/(.*)') для кэширования ассетов на 1 год.
  • Вторая запись предназначена для конкретного каталога изображений (source: '/static/images/(.*)') и устанавливает продолжительность кэширования на 30 дней.

Вы можете настраивать эти заголовки в зависимости от конкретных требований кэширования для различных типов ресурсов или маршрутов в вашем приложении.

5. Мониторинг и оптимизация производительности

В дополнение к техникам, о которых я рассказал выше, важно постоянно мониторить и оптимизировать производительность сайта. Здесь пригодятся специальные инструменты, например Lighthouse, WebPageTest и Google Analytics. Они помогут выявить узкие места и определить области, где вы можете дополнительно оптимизировать свой код, уменьшить размеры файлов или ускорить время ответа сервера. Регулярный мониторинг и оптимизация производительности могут значительно улучшить время загрузки сайта и общий пользовательский опыт.

Мониторинг производительности

6. Мобильная оптимизация сайта

Все больше людей пользуются мобильными устройствами для просмотра веб-страниц, поэтому важно уделить внимание мобильной оптимизации сайта. Ее основная цель — сделать сайт удобным для пользователей, чтобы он быстро загружался и корректно отображался на смартфонах и планшетах.

В Next.js есть встроенная поддержка адаптивного дизайна. Она позволяет создавать макеты, которые адаптируются к разным размерам экранов. Оптимизировать производительность сайта на мобильных устройствах можно также следующими способами: минимизировать количество изображений и видео большого размера, уменьшить количество HTTP-запросов и использовать кэширование браузера.

7. Непрерывное тестирование и оптимизация производительности

Улучшение производительности сайта — это не разовая задача, а непрерывный процесс. Особенно важно тестировать и оптимизировать производительность, когда добавляются новые функции или вносятся изменения.

Чтобы автоматизировать процесс тестирования и оптимизации, можно внедрять практики непрерывной интеграции и непрерывного развертывания (CI/CD). Интеграция тестирования производительности в пайплайн CI/CD поможет находить проблемы на ранних этапах и обеспечивать оптимальную производительность сайта на протяжении его жизненного цикла.

Заключение

Next.js предлагает ряд мощных функций и стратегий для улучшения производительности сайта. Серверный рендеринг, разделение кода, ленивая загрузка, оптимизация ассетов и непрерывное тестирование производительности помогут создать быстрый и эффективный сайт. Также не забывайте мониторить производительность, применять практики CI/CD и адаптировать дизайн для мобильных устройств. Следуя этим советам, вы сможете улучшить производительность сайта и сделать его удобным для пользователей.