[Перевод] Next.js и революционные изменения в React

image

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

Что такое Next.js?


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

Рендеринг на стороне сервера (SSR) и статическая генерация сайтов (SSG)


Когда в Next.js появились функции рендеринга на стороне сервера (SSR) и статической генерации сайтов (SSG), возможности приложений React значительно расширились, особенно в том, что касается поисковой оптимизации (SEO) и производительности. Давайте подробнее рассмотрим, как эти функции помогают решать конкретные задачи и находить надежные решения.

Сложность работы с React:


  • Приложения React обычно отображаются в браузере клиента. Хотя такой рендеринг на стороне клиента отлично подходит для интерактивных веб-приложений, у него есть недостатки, особенно касающиеся SEO и медленной первичной загрузки страниц.
  • Поисковики системы иногда с трудом индексируют страницы с JavaScript и клиентскими рендерами, что может негативно сказаться на SEO.
  • Рендеринг на стороне клиента также означает, что содержимое страницы становится доступно не сразу, поскольку перед рендерингом необходимо загрузить и запустить JavaScript, из-за чего загрузка, опять же, замедляется.


Чтобы проиллюстрировать, как Next.js развился на основе традиционного React и эффективно решает проблемы, связанные с рендерингом на стороне клиента, давайте рассмотрим пример с кодом. Мы создадим простую страницу блога, на которой продемонстрируем как SSR, так и SSG в Next.js.

Пример: Страница блога с React (традиционный подход)


В типичной конфигурации React можно получать посты из блога на стороне клиента, например, так:

// Blog.js (используется React)
import React, { useState, useEffect } from 'react';

const Blog = () => {
  const [posts, setPosts] = useState([]);

  useEffect(() => {
    fetch('/api/posts')
      .then(response => response.json())
      .then(data => setPosts(data));
  }, []);

  return (
    
{posts.map(post => (

{post.title}

{post.content}

))}
); }; export default Blog;


При таком подходе данные собираются на стороне клиента, из-за этого замедляется загрузка и ухудшаются показатели SEO, поскольку контент не сразу поступает на индексирование в поисковых системах.

Переход на Next.js с применением SSR


Решение Next.js, в котором применяется SSR:

  • SSR в Next.js отображает компоненты React на стороне сервера, заранее генерируя полный HTML для каждой страницы.
  • Когда пользователь или поисковый бот запрашивает страницу, сервер отправляет полностью структурированный HTML, обеспечивая немедленный доступ к контенту. Это способствует SEO, так как поисковые системы могут легко просматривать и индексировать содержимое страницы.
  • SSR также ощутимо улучшает производительность, особенно при первичной загрузке страницы, так как пользователи получают полностью сформированную страницу быстрее.
  • Такой подход особенно полезен на сайтах с большим объемом контента, в частности, в блогах или интернет-магазинах, где качественная SEO и быстрая доставка контента имеют решающее значение.


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

// pages/blog.js (using Next.js with SSR)
import React from 'react';

const Blog = ({ posts }) => (
  
{posts.map(post => (

{post.title}

{post.content}

))}
); export async function getServerSideProps() { const response = await fetch('https://example.com/api/posts'); const posts = await response.json(); return { props: { posts }, }; } export default Blog;


Здесь getServerSideProps получает данные с сервера до того, как страница будет отображена. Тем самым гарантируется, что HTML-разметка, отправленная в браузер, уже содержит посты из блога.

Как это работает:

1. Получение данных на сервере: Каждый раз, когда пользователь запрашивает страницу из блога, на сервере запускается getServerSideProps.

2. Fetch API: Получает записи блога из внешнего API. (https://example.com/api/posts).

3. Возврат элементов: Полученные записи возвращаются в качестве элементов компонента Blog.Render

4. Страница: Next.js затем отображает компонент Blog на стороне сервера, используя эти пропсы, и отправляет полностью отображённый HTML на клиент.
Пример использования: этот подход идеален, когда содержимое блога часто меняется, и вы хотите, чтобы на странице всегда отображались самые актуальные записи.

Лучшие примеры использования статической генерации сайта (SSG)


1. Блоги и сайты с документацией:

  • Контент, который редко меняется, идеально подходит для SSG.
  • Быстрая загрузка и превосходные показатели SEO, поскольку страницы предварительно преобразуются в статический HTML…


2. Маркетинговые веб-сайты:

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


3. Списки товаров в интернет-магазинах:

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


4. Порталы с общедоступным контентом:

  • Новостные сайты или образовательные ресурсы со статичными статьями.
  • SSG легко справляется с большим трафиком благодаря CDN-кэшированию.


Реализация статической генерации сайта (SSG)


Проблемы с динамическим рендерингом:

  • Динамический рендеринг страниц, несмотря на большие возможности, может быть ресурсоемким и более медленным, чем традиционные подходы поскольку при каждом запросе серверу приходится рендерить страницу заново.
  • Из-за этого могут возникать «узкие места» в производительности, особенно в условиях высокого трафика…


Решение Next.js с использованием SSG:

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


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

// pages/blog.js (использование Next.js с SSG)
import React from 'react';

const Blog = ({ posts }) => (
  // ... как и ранее
);

export async function getStaticProps() {
  const response = await fetch('https://example.com/api/posts');
  const posts = await response.json();
  return {
    props: { posts },
    revalidate: 10, // Инкрементная статическая регенерация (ISR),  на которую требуются считанные секунды
  };
}

export default Blog;


В этом случае страница генерируется во время сборки и подается как статический файл. С помощью функции инкрементной статической регенерации (опция revalidate) страница может периодически обновляться, обеспечивая свежесть содержимого.

Как это работает:

1. Получение данных во время сборки: getStaticProps запускается во время сборки, получая записи блога из API.

2. Статическая генерация: Страница Blog предварительно отображается в виде статического HTML с полученными данными.

3. Переаттестация: Ключ revalidate, установленный на 10, включает ISR. Он указывает Next.js обновлять страницу не чаще чем раз в 10 секунд, если поступают новые запросы.

4. Подача статической страницы: Статично сгенерированная страница обслуживается пользователями. Если через 10 секунд страница запрашивается снова, а данные изменились, Next.js регенерирует страницу с обновленным содержимым.

Пример использования: Этот метод подходит для содержания блогов, не требующих обновления в реальном времени. ISR гарантирует, что содержимое не устарело, периодически обновляя страницу.

Лучшие примеры использования рендеринга на стороне сервера (SSR)


1. Динамические пользовательские панели:

  • Приложения, в которых содержимое зависит от конкретного пользователя и часто меняется, например, пользовательские панели в SaaS-приложениях.
  • SSR гарантирует, что контент будет актуальным и персонализированным для каждого пользователя.


2. Сайты электронной коммерции с динамическим контентом:

  • Страницы с часто меняющимся содержимым, например, прайс-листы, сведения о наличии товаров на складе или отзывы пользователей.
  • SSR может динамически генерировать страницы на основе поступающих данных в режиме реального времени.


3. Социальные сети:

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


4. Сайты, характеризующиеся интенсивным взаимодействием с пользователями и данными в реальном времени:

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


Выбор между SSG и SSR


Компромисс между производительностью и свежестью данных:

  • SSG обеспечивает более высокую производительность и масштабируемость, поскольку обслуживает статические файлы.
  • SSR обеспечивает более свежий контент, но сам подход может быть более ресурсоемким.


Аспекты SEO:

  • И SSG, и SSR подходят для SEO. SSG может выигрывать за счёт ускорения загрузки, но SSR больше подходит для динамического контента, который должен быть проиндексирован.


Разработка и обслуживание:

  • SSG, как правило, проще разрабатывать и поддерживать для сайтов со статичным содержимым.
  • SSR может быть более сложным, но необходим для динамичных, ориентированных на пользователя приложений.


Заключение


Сочетая SSR и SSG, Next.js предоставляет разработчикам мощные инструменты для преодоления ограничений клиентского рендеринга в React. Эти приёмы позволяют улучшить поисковую оптимизацию, обеспечивают более быструю загрузку и более эффективное использование ресурсов сервера. Выбор между SSR и SSG (или гибридным подходом) может быть сделан в зависимости от конкретных потребностей приложения, от того, что для вас более актуально: динамическая интерактивность или оптимизированную производительность. Такая гибкость — значительный прогресс в создании современных, масштабируемых и высокопроизводительных веб-приложений на React.

© Habrahabr.ru