Подход к разработке фронтенда в продукте – уже давно не прихоть разработчика, а инструмент для решения бизнес-задачи. В статье простыми словами о том, почему это так, как выбор подхода зависит от назначения продукта, а также примеры использования подходов.

Приветствую! Меня зовут Андрей Степанов, я CTO во fuse8. Мне интересно знакомиться с опытом коллег по цеху и делиться своим. В сфере я уже больше 20 лет. В этой статье – расскажу о том, как выбрать фронтенд-подход исходя из целей бизнеса и объясню, какие особенности есть у каждого из подходов.

Сразу ремарка: в этой статье не рассматриваются варианты использования конструкторов сайтов вроде Tilda или Webflow. Речь пойдет о разработке сложных ИТ-продуктов: highload проектов, личных кабинетов в B2B и автоматизации бизнеса. Такие запросы конструкторы, как правило, покрыть не в состоянии.

Личные кабинеты, онлайн-сервисы, веб-приложения: клиентский рендеринг

Поговорим о приложениях, в которые пользователь заходит через логин: личный кабинет, внутренняя корпоративная система, CRM, ERP. Сюда же – интернет-банк, веб-интерфейс почты, личный кабинет на Озоне или Госуслугах, лента и переписка в соцсетях. Пользователь в таких приложениях видит данные, актуальные только для него. А индексация поисковиками для этих данных не нужна, поэтому используется метод клиентского рендеринга.

Клиентский рендеринг (client side rendering) или SPA (Single Page Application) – метод, при котором браузер загружает основную структуру страницы и код приложения один раз и генерирует HTML код страницы в самом браузере на устройстве пользователя.

Далее при взаимодействии с пользователем браузер обращается в один или несколько API за дополнительными данными и динамически обновляет HTML без необходимости полной перезагрузки страницы. В результате, когда пользователь решит перейти в другой модуль, браузер откроет его практически мгновенно.

схема работы клиентского рендеринга
схема работы клиентского рендеринга

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

Когда такие приложения становятся достаточно большими, первая загрузка приложения может растянуться на несколько секунд. Это минус, если сервис вы открываете много раз в день (почта или CRM).

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

Можно загружать код и по частям. Например, сначала – код для отображения открытого раздела приложения, с которым пользователь взаимодействует, а остальной код загружается уже после.

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

PWA: вернуть пользователям мобильный сервис, даже если приложение удалили из сторов

Отдельно отметим Progressive web apps (PWA): набор технологий, позволяющий максимально приблизить веб-приложения к привычным мобильным приложениям. Такой подход актуален сейчас, когда приложения регулярного удаляются из App Store и Google Play, а ограничить установку PWA-приложения не может никто.

Установка PWA на мобильное устройство
Установка PWA на мобильное устройство

PWA позволяет добавить ярлык приложения на рабочий стол телефона, работать без интернета, получать push-уведомления. Подход полезен также в случаях, когда делать отдельные мобильные приложения для iOS и Android в дополнение к веб-сервису слишком накладно или сложно.

Контентные порталы, медиа, блоги: статическая генерация сайта

На какие проекты пользователи привлекаются с помощью SEO? Как правило, это контентные ресурсы, где новые материалы регулярно публикуются и затем хранятся в архиве, генерируя трафик. Примеры: онлайн-медиа, журналы, блоги, каталоги продукции компаний, тематические информационные порталы.

Чтобы поисковики лучше индексировали сайт, HTML разметка для каждой его страницы должна отдаваться с сервера. Быстрота загрузки, как и качественное наполнение веб-страницы, влияет на ее позицию в выдаче поисковика. Поэтому важно, чтобы сайт загружался быстро – и на сервере, и в браузере.

Статическая генерация сайта (static site generation или SSG) – подход, при котором HTML код страниц генерируется один раз в момент публикации и сохраняется на сервере. Изменения в этой публикации не появляются (либо появляются очень редко), поэтому генерация «статическая». Дальше сервер будет моментально отдавать HTML код готовой страницы пользователям и поисковикам, гарантируя быструю загрузку страницы.

Схема работы статической генерации контента
Схема работы статической генерации контента

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

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

Headless CMS: конструктор и API для контента

Портал, предназначенный для публикации большого количества индексируемого контента, с использованием статической генерации – это хорошо. Однако контент нужно редактировать и хранить. Для этого удобно использовать Headless CMS. Например, Strapi.

Отличие Headless CMS от предыдущего поколения CMS вроде Битрикс или WordPress в том, что они не генерируют HTML-код страниц сами, а просто предоставляют контент через API в структурированном виде.

Как работает Headless CMS
Как работает Headless CMS

Один и тот же контент из Headless CMS таким образом можно переиспользовать под различные каналы. Например, на сайте, в мобильном приложении или в email-рассылке.

Headless CMS позволяет выбирать любой фронтенд-стек или технологии для создания пользовательского интерфейса, независимо от бекенда.

Другой плюс – проекты на Headless CMS может делать фронтенд- разработчик целиком. Не нужно дополнительно привлекать, например, PHP бекенд-разработчика, как при разработке на Битрикс или WordPress.

Динамические интернет-магазины и пользовательский контент: серверный рендеринг

Контент, который часто публикуется и обновляется на портале, тоже может требовать индексации и непрерывного поддержания актуальности. Например, так происходит в онлайн-магазинах, где часто меняются цены, актуальные позиции или скидки (привет, Озон!). Другой пример – сайты, где в основе пользовательский контент — форумы и площадки с объявлениями, типа hh.ru или Авито.

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

Как работает серверный рендеринг
Как работает серверный рендеринг

Серверный рендеринг (server side rendering / SSR) – подход, в котором страница генерируется на сервере при каждом запросе от пользователя.

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

Из этого вытекает потребность в более опытной и дорогой команде разработки.

Единый код для рендеринга на сервере и в браузере

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

Например, страница каталога товаров с фильтрами. Пользователь попадает на нее из поисковика и сразу может начать фильтровать товары по разным параметрам.

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

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

Раньше, когда серверная часть была реализована на другом языке (например, PHP или C#), отличном от фронтенда, для реализации приходилось дублировать логику рендеринга на фронтенде и бекенде и держать ее в синхронном состоянии при каждом изменении.

Сейчас используется фреймворк Next.js, который позволяет использовать один и тот же код и на сервере, и в браузере на языке JavaScript, и логику отображения на React. Он может автоматически «оживлять» динамические React-компоненты после серверного рендеринга и переходить между страницами без полной их перезагрузки. 

Так можно получить лучшее из двух миров: индексируемость и скорость первой загрузки SSR или SSG и быструю навигацию и последующую загрузку данных как в клиентском рендеринге. И все это без дополнительных затрат.

Гибридные подходы

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

Самый частый и простой случай: догрузить в браузере динамических или персонализированных данных на статически сгенерированную страницу.

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

Пример гибридного подхода 
Пример гибридного подхода 

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

Совмещение подходов помогает веб-сервису быть более производительным.

Что подойдет моему проекту

Чтобы выбрать самый эффективный подход, стоит на этапе переговоров с подрядчиком быть максимально честным. Как на приеме у доктора. И здесь главное для клиента приходить с запросом не в виде решения («Разработайте мне новый сайт»), а в виде описания своей боли («Мой старый сайт совсем не приносит денег, помогите»).

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

Комментарии (3)


  1. MrRewolwer
    06.07.2023 04:03
    +1

    В чем преимущества SSR перед CMS предыдущего поколения?


    1. andrey_stepanov1 Автор
      06.07.2023 04:03

      Фактически CMS предыдущего поколения типа WordPress, Kentico работают через server-side rendering: на бекенде есть шаблоны страниц или компонентов, которые рендерят нам HTML на сервере на каждый запрос.

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

      С переходом на headless CMS и server-side rendering - обе эти проблемы уходят. Достаточно нормального фронтендера и мы имеем единую кодовую базу для отображения - всем проще.


  1. andrey_stepanov1 Автор
    06.07.2023 04:03

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