Подписывайтесь на Telegram-канал Анатолия Половинкина основателя компании TolkaDigital

SPA

Single Page Application

SPA (Single Page Application, одностраничное приложение) — это архитектура веб-приложения, при которой браузер загружает единственный HTML-документ один раз, а все последующие переходы между разделами происходят без перезагрузки страницы за счет динамического обновления контента через JavaScript.

Что такое SPA

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

Идея динамического обновления страниц без перезагрузки появилась в конце 1990-х с технологией AJAX. Настоящий прорыв случился в 2004 году, когда Google запустил Gmail — первый массовый продукт, полностью построенный на принципах одностраничного приложения. В 2005 году Google Maps окончательно доказал жизнеспособность подхода: карта, которая перемещается без перезагрузки, изменила пользовательские ожидания. Широкое распространение SPA получил после появления Angular от Google в 2010 году и React от Facebook в 2013 году. Vue.js вышел в 2014 году и замкнул тройку доминирующих фреймворков. По данным Stack Overflow Developer Survey 2024, React, Vue и Angular входят в пятерку самых используемых веб-фреймворков в мире.

В контексте digital-маркетинга SPA создает специфическую среду для аналитики, SEO и пользовательского опыта. Традиционные метрики сессии перестают работать корректно: переход между разделами SPA не создает новый pageview в Google Analytics или Яндекс.Метрике по умолчанию, и без настройки аналитика покажет одностраничные сессии с нулевым временем и bounce rate 100%. SEO-роботы исторически плохо обрабатывали JavaScript-контент: Google начал официально рендерить JS только с 2015 года, и по данным Search Engine Journal, задержка индексации JS-контента может составлять от нескольких дней до нескольких недель. Маркетологу важно понимать, что SPA — это не просто технический выбор, а решение с прямыми последствиями для SEO-стратегии, настройки аналитики и бюджета на продвижение.

Для предпринимателя понимание SPA критично при двух сценариях: когда заказывается новая разработка и когда не понятно, почему органический трафик не растет. Если заказывается новый сервис, технология реализации напрямую влияет на стоимость SEO и трудоемкость настройки веб-аналитики — об этом подрядчики нередко умалчивают. По данным Searchmetrics, сайты с корректно настроенным серверным рендерингом показывают на 30-50% лучшую индексируемость по сравнению с CSR-only SPA. Знание разницы между CSR, SSR и SSG позволяет задавать правильные вопросы разработчикам и выбирать архитектуру, которая не создаст проблем при продвижении. В конечном счете, технологический выбор всегда несет маркетинговые последствия.

Как работает SPA

  1. Первая загрузка приложения. Пользователь открывает URL, браузер получает минимальный HTML-файл и ссылку на JavaScript-бандл. Браузер скачивает, парсит и выполняет весь JavaScript, после чего фреймворк строит интерфейс прямо в браузере без участия сервера. Время от первого запроса до момента, когда пользователь может взаимодействовать со страницей (TTI — Time to Interactive), у чистого SPA обычно выше, чем у серверно-рендерируемых сайтов.
  2. Перехват навигации роутером. После инициализации JavaScript-роутер подписывается на все клики по ссылкам внутри приложения. Когда пользователь нажимает на внутреннюю ссылку, роутер перехватывает событие, отменяет стандартный переход браузера и обновляет URL через History API — адресная строка меняется, но страница не перезагружается. Роутер сопоставляет новый URL с маршрутами и вызывает соответствующий компонент, который отображается вместо предыдущего без мигания экрана.
  3. Запрос данных через API. Вместо готового HTML от сервера SPA запрашивает только данные в формате JSON через REST API или GraphQL. При переходе на страницу товара приложение отправляет запрос и получает объект: название, цена, описание, фотографии. Сервер занимается только выборкой данных, а не генерацией HTML для каждого пользователя — это снижает нагрузку и позволяет обслуживать значительно больше одновременных запросов.
  4. Обновление DOM через виртуальный DOM. После получения данных фреймворк вычисляет, какие части интерфейса нужно изменить, с помощью алгоритма сравнения. React строит виртуальный DOM, сравнивает его с текущим состоянием и применяет только минимально необходимые изменения к реальному DOM браузера. Браузеру не нужно заново парсить HTML и пересчитывать стили для всей страницы — меняются только те элементы, которые реально изменились.
  5. Управление состоянием приложения. По мере навигации приложение накапливает данные: содержимое корзины, профиль пользователя, настройки фильтров. Эти данные хранятся в централизованном хранилище состояния (Redux, Pinia), которое доступно любому компоненту в любой момент. Когда пользователь добавляет товар в корзину и переходит к оформлению, данные уже там без повторного запроса к серверу.
  6. Кеширование и предзагрузка данных. Однажды загруженные данные сохраняются в памяти приложения и при повторном посещении того же раздела не запрашиваются с сервера снова. Продвинутые реализации поддерживают предзагрузку: когда пользователь наводит курсор на ссылку, приложение уже начинает загружать данные следующей страницы. В результате второй и последующие переходы воспринимаются как мгновенные, что дает SPA ключевое преимущество по воспринимаемой скорости.

Виды SPA

  • CSR (Client-Side Rendering) — классическое SPA. Весь рендеринг происходит в браузере пользователя: сервер отдает пустой HTML и JS-бандл, браузер строит интерфейс самостоятельно. Такой подход обеспечивает максимальную интерактивность и снимает нагрузку с сервера, но плохо индексируется поисковиками. Подходит для закрытых сервисов без SEO-требований: CRM-системы, дашборды аналитики, личные кабинеты клиентов, куда трафик приходит после авторизации, а не из поиска.
  • SSR (Server-Side Rendering) — SPA с серверным рендерингом. Первый запрос обрабатывается сервером: он генерирует полный HTML с контентом, поисковый робот получает готовую разметку без необходимости выполнять JavaScript. После загрузки браузер подключает JavaScript-логику, и дальше сайт работает как обычное SPA с мгновенными переходами. Next.js для React и Nuxt.js для Vue реализуют SSR из коробки и стали стандартом для публичных сайтов, которым важна индексация.
  • SSG (Static Site Generation) — статически генерируемое SPA. Все страницы генерируются при сборке проекта и сохраняются как готовые HTML-файлы, которые раздаются через CDN. Скорость загрузки максимальная, SEO-индексация отличная, нагрузка на сервер нулевая. Подходит для блогов, лендингов, документации и любых сайтов, где контент меняется нечасто — это архитектурно идеальное решение для контентных проектов, продвигаемых через органику.
  • PWA (Progressive Web App) на основе SPA. SPA с технологиями ServiceWorker и Web App Manifest работает офлайн, устанавливается на рабочий стол как нативное приложение и получает push-уведомления. По данным Google Case Studies, Twitter Lite после перехода на PWA зафиксировал снижение bounce rate на 20% и рост числа просматриваемых страниц за сессию на 65%. Для e-commerce PWA позволяет конкурировать с нативными мобильными приложениями без отдельных затрат на разработку под iOS и Android.
  • Micro-frontend SPA. Крупные приложения разбиваются на независимые SPA-модули, которые разрабатываются разными командами и выкатываются независимо. Пользователь видит единый интерфейс, но под капотом работают десятки отдельных приложений: каталог, корзина, поиск, профиль. Этот подход применяют крупные e-commerce игроки: IKEA, Zalando — он позволяет масштабировать команды разработки без риска сломать единый монолитный фронтенд.
  • Islands Architecture (архитектура островов). Гибридный подход: большая часть страницы — это статический HTML, а интерактивные элементы («острова») — мини-SPA-компоненты, которые «оживают» после загрузки. Сайт получает лучшее из двух миров: мгновенную загрузку и отличное SEO от статики плюс интерактивность там, где она нужна. Astro — наиболее известный фреймворк для этого подхода, набирающий популярность в контентных проектах.

Сравнение SPA и классического сайта

Параметр SPA (CSR) MPA (традиционный сайт) SPA с SSR
Скорость повторной навигации Мгновенная (данные в памяти) Полная перезагрузка, 0.5-3 сек Мгновенная после первой загрузки
Первый показ контента (FCP) Медленнее: нужно выполнить JS-бандл Быстрее: сервер отдает готовый HTML Быстрый: сервер рендерит первый экран
SEO-индексация Проблематична, нужны доработки Отличная из коробки Хорошая, сравнима с MPA
Настройка веб-аналитики Сложная: pageview не срабатывает автоматически Простая: стандартные теги работают из коробки Средняя: нужна настройка history-событий
Нагрузка на сервер Низкая: отдает только JSON Высокая: генерирует HTML для каждого запроса Средняя: HTML только для первого запроса
Пользовательский опыт (UX) Высокий: нет перезагрузок, плавные переходы Средний: мигание при каждом переходе Высокий

Пример использования

Онлайн-платформа для бронирования туров с трафиком около 22 000 визитов в месяц работала на классическом PHP-сайте. Среднее время загрузки страницы составляло 4.1 секунды, bounce rate — 71%, конверсия в заявку — 0.9%. Анализ Яндекс.Метрики показал, что 68% пользователей уходили, не дойдя до третьего шага оформления: процесс бронирования состоял из 5 шагов с полной перезагрузкой страницы на каждом, а среднее время заполнения формы составляло 4.2 минуты. Команда разработки предложила переписать раздел бронирования как SPA с сохранением PHP для SEO-страниц туров.

Через три месяца после запуска гибридного решения результаты оказались значительными. Время прохождения воронки оформления сократилось с 4.2 минуты до 1.8 минуты: пользователи перестали ждать перезагрузок между шагами. Конверсия в заявку выросла с 0.9% до 2.3%, bounce rate раздела снизился с 71% до 38%. При неизменном рекламном бюджете выручка раздела бронирования за первые 60 дней выросла на 156%. SEO-трафик на посадочные страницы туров не пострадал, поскольку они остались на прежней серверной технологии.

Частые вопросы

Плохо ли SPA для SEO и можно ли это исправить?

Чистый CSR-SPA создает реальные проблемы для SEO, которые при этом полностью решаемы — выбор метода зависит от технических возможностей. Корень проблемы в том, что поисковый робот при первом обходе получает пустой HTML-контейнер, а реальный контент появляется только после выполнения JavaScript. Яндекс официально заявлял, что краулер может не рендерить JavaScript при каждом обходе страницы. Лучшее решение — SSR или SSG: сервер сам генерирует HTML с контентом, роботу не нужно ничего рендерить самостоятельно. Если переход на SSR невозможен, используют Pre-rendering: специальный сервис (Prerender.io, Rendertron) рендерит страницы заранее и отдает готовый HTML только поисковым роботам. Для диагностики откройте Google Search Console, перейдите в раздел URL Inspection и проверьте, как Google видит ключевые страницы — это покажет, что реально проиндексировано.

Как правильно настроить веб-аналитику на SPA-сайте?

Стандартный тег Google Analytics или Яндекс.Метрики срабатывает один раз — при первой загрузке. Все последующие переходы внутри SPA аналитика не видит, что дает полностью искаженные данные: средняя глубина просмотра кажется равной 1, время на сайте — 0 секунд, bounce rate — 100%, хотя пользователь провел на сайте 10 минут и посетил 7 разделов. Правильное решение — подписаться на события изменения маршрута в роутере и вручную отправлять pageview при каждом переходе: в React Router через хук useEffect на объекте location, в Vue Router через хук afterEach. Для Google Analytics 4 вызов gtag с параметрами page_path и page_title при каждом route change полностью решает проблему, для Яндекс.Метрики — метод ym(id, ‘hit’, url). Цели в SPA также настраиваются вручную: события (клик кнопки, отправка формы, добавление в корзину) отправляются напрямую из кода при наступлении события, а не через автоматическое определение по URL.

SPA или классический многостраничный сайт — как выбрать?

Выбор строится вокруг одного ключевого вопроса: откуда на этот продукт придет трафик? Если проект — контентный сайт, интернет-магазин или лендинг с упором на органический трафик, классический MPA или гибридный подход предпочтительнее: продвижение чистого CSR-SPA в органике потребует дополнительных затрат на Pre-rendering или переход на SSR. Если проект — закрытое приложение без SEO-требований (CRM, личный кабинет, B2B-инструмент для авторизованных пользователей), SPA — оптимальный выбор: интерактивность выше, разработка быстрее. Золотая середина для публичных сервисов с богатым пользовательским интерфейсом — Next.js или Nuxt.js: они дают SEO от SSR при первой загрузке и скорость SPA при навигации. Главный совет: не позволяйте разработчикам принимать это решение самостоятельно — технологический выбор напрямую определяет маркетинговые возможности проекта на годы вперед.

Все термины