Реализация Partial Hydration для оптимизации веб-приложения

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

Разработка и обслуживание любых видов сайтов:

Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Предлагаемые услуги
Показано 1 из 1 услугВсе 2065 услуг
Реализация Partial Hydration для оптимизации веб-приложения
Сложная
~3-5 рабочих дней
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    874
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    851

Реализация Partial Hydration для оптимизации веб-приложения

Полная гидратация (Full Hydration) — это когда браузер загружает весь JS-бандл приложения и оживляет весь DOM, включая компоненты, которые никогда не станут интерактивными. Статичный заголовок, список статей, футер — всё гидратируется. Это прямые потери: лишний JS, лишнее CPU, медленный TTI.

Partial Hydration — гидратация только тех компонентов, которым это нужно. Статичный контент остаётся инертным HTML. JS загружается только для интерактивных островков.

Проблема Full Hydration

Типичная страница блога:
- Header (статичный)         → гидратируется? Зачем?
- Navigation (статичная)     → гидратируется? Зачем?
- ArticleContent (MDX)       → гидратируется? Зачем?
- Comments (интерактивные)   → НУЖНА гидратация
- ShareButtons (onClick)     → НУЖНА гидратация
- Footer (статичный)         → гидратируется? Зачем?

Без partial hydration: загружается весь React (~45 KB) + весь код компонентов
С partial hydration: загружается только код Comments + ShareButtons

Реализация в Astro (Islands Architecture)

Astro реализует partial hydration через директивы client:*:

---
// src/pages/article/[slug].astro
import ArticleHeader from '@/components/ArticleHeader.astro';  // Серверный
import ArticleContent from '@/components/ArticleContent.astro'; // Серверный
import CommentSection from '@/components/CommentSection.tsx';   // React, нужна гидратация
import ShareWidget from '@/components/ShareWidget.svelte';      // Svelte, нужна гидратация
import NewsletterForm from '@/components/NewsletterForm.vue';   // Vue, нужна гидратация

const { slug } = Astro.params;
const article = await getArticle(slug);
---

<html>
  <body>
    <!-- Нулевой JS — чистый HTML -->
    <ArticleHeader title={article.title} author={article.author} />
    <ArticleContent content={article.content} />

    <!-- Гидратация при появлении в viewport -->
    <CommentSection articleId={article.id} client:visible />

    <!-- Гидратация при первом взаимодействии -->
    <ShareWidget url={Astro.url.href} client:idle />

    <!-- Немедленная гидратация (критичный контент) -->
    <NewsletterForm client:load />
  </body>
</html>

Директивы гидратации:

Директива Когда загружается JS
client:load Сразу при загрузке страницы
client:idle После requestIdleCallback (браузер не занят)
client:visible Когда компонент входит в viewport
client:media="..." При совпадении медиа-запроса
client:only="react" Только на клиенте, без SSR

Реализация в Next.js через динамический импорт

import dynamic from 'next/dynamic';

// Эти компоненты НЕ включаются в initial bundle
const CommentSection = dynamic(() => import('@/components/CommentSection'), {
  ssr: false,
  loading: () => <CommentsSkeleton />,
});

const VideoPlayer = dynamic(() => import('@/components/VideoPlayer'), {
  ssr: false, // Нет смысла рендерить на сервере
});

const HeavyChart = dynamic(() => import('@/components/analytics/HeavyChart'), {
  ssr: false,
  loading: () => <div className="h-64 animate-pulse bg-gray-100 rounded" />,
});

// Гидратация при появлении в viewport — нативный IntersectionObserver
function LazyHydrate({ children, rootMargin = '200px' }) {
  const [hydrated, setHydrated] = useState(false);
  const ref = useRef<HTMLDivElement>(null);

  useEffect(() => {
    const observer = new IntersectionObserver(
      ([entry]) => { if (entry.isIntersecting) setHydrated(true); },
      { rootMargin }
    );
    if (ref.current) observer.observe(ref.current);
    return () => observer.disconnect();
  }, []);

  return <div ref={ref}>{hydrated ? children : <div style={{ minHeight: '1px' }} />}</div>;
}

// Использование
export default function ArticlePage({ article }) {
  return (
    <article>
      <ArticleHeader article={article} /> {/* Серверный, 0 JS */}
      <ArticleBody content={article.content} /> {/* Серверный, 0 JS */}

      <LazyHydrate>
        <CommentSection articleId={article.id} />
      </LazyHydrate>
    </article>
  );
}

Прогрессивная гидратация

Гидратировать компоненты можно по очереди, не блокируя main thread:

'use client';
import { useEffect, useState } from 'react';

// Планировщик гидратации через requestIdleCallback
function useIdleHydration(delay = 0): boolean {
  const [ready, setReady] = useState(false);

  useEffect(() => {
    let id: number;

    if ('requestIdleCallback' in window) {
      id = requestIdleCallback(() => setReady(true), { timeout: delay || 2000 });
    } else {
      id = setTimeout(() => setReady(true), delay) as unknown as number;
    }

    return () => {
      'requestIdleCallback' in window
        ? cancelIdleCallback(id)
        : clearTimeout(id);
    };
  }, [delay]);

  return ready;
}

function IdleComponent({ children, fallback }: IdleProps) {
  const ready = useIdleHydration(1000);
  return ready ? children : fallback;
}

Измерение эффекта

Инструменты для оценки до и после partial hydration:

# Webpack Bundle Analyzer
npx @next/bundle-analyzer

# Astro Check: какие компоненты добавляют JS
npx astro check

# Lighthouse CLI для автоматизации
npx lighthouse https://example.com --output json \
  --only-categories=performance \
  | jq '.categories.performance.score'

Метрики, которые меняются:

Метрика Ожидаемое улучшение
Total Blocking Time (TBT) -40–70%
Time to Interactive (TTI) -30–60%
JS Parse/Execute время -50–80%
Lighthouse Performance Score +10–25 баллов

Когда partial hydration нецелесообразен

Partial Hydration не имеет смысла для:

  • SPA с богатой интерактивностью на каждой странице
  • Приложений, где почти все компоненты клиентские
  • Дашбордов за авторизацией — там SEO неважен, JS загружается один раз

Наибольший эффект — на публичных контентных страницах: блоги, документация, каталоги, лендинги.

Сроки реализации

  • Неделя 1: аудит JS-бандла, выявление компонентов без клиентской логики, профилирование TTI
  • Неделя 2–3: разметка компонентов на серверные/клиентские, внедрение директив (client:visible, client:idle) или dynamic() с ssr:false
  • Неделя 4: LazyHydrate обёртки для scroll-below-the-fold контента, измерение метрик
  • Неделя 5: регрессионное тестирование, Lighthouse CI в pipeline, документация