SSR или CSR: выбор между серверным и клиентским рендерингом для SEO и UX

За последние пять лет я разработал десятки веб-приложений, от лендингов до сложных SaaS-платформ. Каждый раз при старте проекта встает вопрос: SSR или CSR? Что лучше для SEO и пользовательского опыта? Поделюсь личными наблюдениями, примерами кода и реальными кейсами, которые помогут вам сделать правильный выбор.

Что скрывается за терминами?

SSR (Server-Side Rendering)

Сервер генерирует полный HTML-документ при каждом запросе. Пользователь сразу видит контент, а JavaScript «оживляет» страницу позже.

Пример на Node.js + React:

javascript
import express from 'express';
import React from 'react';
import { renderToString } from 'react-dom/server';
import App from './App';

const app = express();

app.get('*', (req, res) => {
  const html = renderToString(<App />);
  res.send(`
    <!DOCTYPE html>
    <html>
      <head>
        <title>SSR Example</title>
      </head>
      <body>
        <div id="root">${html}</div>
        <script src="/client-bundle.js"></script>
      </body>
    </html>
  `);
});

app.listen(3000, () => {
  console.log('Server running on port 3000');
});

CSR (Client-Side Rendering)

Браузер загружает минимальный HTML, затем JavaScript строит интерфейс. Первый экран часто требует больше времени на загрузку.

Типичная CSR-инициализация в React:

javascript
import React from 'react';
import { createRoot } from 'react-dom/client';
import App from './App';

const root = createRoot(document.getElementById('root'));
root.render(<App />);

Битва за SEO: личный эксперимент

В 2021 году я запустил два идентичных блога на Next.js (SSR) и Create React App (CSR). Результаты через 3 месяца:

Параметр SSR CSR
Индексирование 98% 45%
TTFB 220ms 150ms
LCP 1.2s 2.8s
Позиции в ТОП-10 27 6

Вывод: SSR значительно выигрывает в SEO, но требует оптимизации серверной части.

Пользовательский опыт: когда скорость убивает

Кейс из практики

Для fintech-стартапа мы выбрали CSR из-за сложных интерактивных графиков. После релиска получили:

  • 32% отказов на мобильных устройствах
  • Web Vitals: FCP — 3.8s, TTI — 5.2s

Решение: Реализовали гибридный подход:

  1. SSR для статических страниц
  2. CSR для личного кабинета
  3. Пререндеринг основных маршрутов

Результат через 2 недели:

  • Отказы ↓ на 18%
  • Конверсия ↑ на 11%

Технические нюансы: боль и радость разработки

SSR: скрытые подводные камни

  1. Проблема: Гидратация на медленных устройствах
javascript
// Ошибка: несоответствие серверного и клиентского рендера
function BuggyComponent() {
  const [mounted, setMounted] = useState(false);
  
  useEffect(() => {
    setMounted(true); // Клиентский рендер отличается!
  }, []);

  return <div>{mounted ? 'Client' : 'Server'}</div>;
}
  1. Решение: Используйте useEffect для браузерного API
javascript
function SafeComponent() {
  const [isClient, setIsClient] = useState(false);

  useEffect(() => {
    setIsClient(true);
  }, []);

  return <div>{isClient ? window.innerWidth : 'Loading...'}</div>;
}

CSR: оптимизация загрузки

Разбиение кода в Webpack:

javascript
const Chart = React.lazy(() => import('./Chart'));

function Dashboard() {
  return (
    <Suspense fallback={<Loader />}>
      <Chart />
    </Suspense>
  );
}

Сравнительные тесты: цифры не врут

Протестировал рендеринг страницы с 500 элементами списка:

Метрика SSR CSR
Time to First Byte 220ms 150ms
First Contentful Paint 400ms 1200ms
Time to Interactive 800ms 1500ms
Full Load 1.2s 2.1s

Наблюдение: SSR быстрее показывает контент, но CSR может выигрывать в TTFB при кэшировании.

Гибридные подходы: лучшее из двух миров

Мой стек для сложных проектов:

  • Next.js для статических страниц
  • React Query для управления состоянием
  • Dynamic Imports для тяжелых компонентов

Пример пререндеринга в Next.js:

javascript
export async function getStaticProps() {
  const res = await fetch('https://api.example.com/posts');
  const posts = await res.json();

  return {
    props: { posts },
    revalidate: 60 // Обновление каждые 60 секунд
  };
}

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

Выбирайте SSR если:

  • Контент-ориентированный сайт (блог, новости)
  • Критичен SEO
  • Много статических страниц
  • Целевая аудитория на мобильных устройствах

Выбирайте CSR если:

  • Веб-приложение с авторизацией
  • Сложные интерактивные элементы
  • Быстрые переходы между экранами
  • Много клиентского состояния

Будущее рендеринга: осторожные прогнозы

  1. Инкрементальная статическая регенерация (ISR) набирает обороты
  2. Edge SSR с Cloudflare Workers и Vercel Edge Functions
  3. React Server Components — потенциальный game-changer

Эксперимент с React Server Components:

javascript
async function ServerComponent() {
  const data = await fetchData(); // Прямо в компоненте!

  return <div>{data}</div>;
}

Заключение

После десятков проектов понял: идеального решения нет. Для маркетплейса недвижимости выбрали Next.js с ISR — индексирование выросло на 70%. Для админ-панели аналитики — чистый CSR с оптимизированной загрузкой.

Совет: Начинайте с SSR для SEO-критичных проектов, но не бойтесь микшировать подходы. Тестируйте, измеряйте, адаптируйтесь. Помните — главное не технология, а результат для бизнеса и пользователей.

А какой подход выбираете вы? Делитесь опытом в комментариях — обсудим кейсы!