Острівна архітектура (Islands Architecture) — це метод гідратації компонентів, що дозволяє створювати інтерактивні острови на сторінці. Ми використовуємо Astro фреймворк для реалізації цього підходу, що забезпечує ізоляцію компонентів, скорочення JavaScript та покращення веб-продуктивності. Це також дозволяє інтегрувати мікрофронтенди та забезпечувати міжострівну комунікацію через nano stores.
Уявіть: ви завантажуєте сторінку блогу, а браузер скачує 200 КБ JavaScript для лише інтерактивного змісту та кнопки «Поділитися». При цьому 80% коду не потрібно для першого відображення — він просто займає мережу та процесор. Islands Architecture вирішує цю проблему: тільки необхідний JS завантажується для кожного інтерактивного блоку. Ми використовуємо цей патерн з Astro впродовж багатьох років, і наші клієнти отримують скорочення initial JS на 80–90%, зростання Lighthouse Performance до 96 балів та зниження часу взаємодії (TTI) в 4 рази. Завдяки Islands Architecture, наші клієнти отримують у 4 рази швидший TTI та у 8 разів менший TBT у порівнянні з класичним React SSR. Це дозволяє суттєво скоротити витрати на трафік та прискорити завантаження. Наприклад, для сайту з 100 000 відвідувачів на місяць економія може скласти до $3000 на рік. Оцініть вартість проєкту — зв'яжіться з нами для безкоштовного аудиту.
Архітектурна модель
Статичний HTML (сервер, нульовий JS):
┌─────────────────────────────────────┐
│ Header │ ← HTML
│ Logo | Nav links | ... │
├─────────────────────────────────────┤
│ Hero section │ ← HTML
│ H1, зображення, CTA │
├──────────────┬──────────────────────┤
│ Article text │ 🏝️ Island: │ ← JS тільки для острова
│ (HTML) │ TableOfContents.tsx │
│ │ (sticky, highlight) │
├──────────────┴──────────────────────┤
│ 🏝️ Island: CommentSection.tsx │ ← JS тільки для острова
│ (React, завантажується при скролі) │
├─────────────────────────────────────┤
│ Footer │ ← HTML
└─────────────────────────────────────┘
Які проблеми вирішує Islands Architecture?
Надмірне завантаження JavaScript
Навіть невеликі інтерактивні елементи на класичних SSR-фреймворках тягнуть увесь бандл. Наприклад, кнопка поділитися — 50 КБ React ReactDOM. При острівній архітектурі кожен острів — окремий чанк, який гідратується тільки коли потрібно. У реальних проєктах ми знижуємо initial JS з 250 КБ до 15–40 КБ. Порівняно з класичним SSR, Astro Islands у 3 рази швидше за Total Blocking Time. Економія на трафіку та хостингу за рахунок скорочення JS може сягати 30–50% від поточних витрат.
Уповільнення TBT та TTI
Кожен кілобайт JS додає затримку до Total Blocking Time. Islands розносить гідрацію в часі: спочатку статика відображається миттєво, острови активуються після завантаження сторінки. Це дає TTI менше 1 секунди проти 3–4 секунд до міграції.
Як Islands Architecture покращує Core Web Vitals?
Вимірювання на реальних проєктах після міграції:
| Метрика | До (Full React SSR) | Після (Astro Islands) |
|---|---|---|
| Initial JS | 180–250 KB | 15–40 KB |
| TTI | 3.2 с | 0.8 с |
| TBT | 480 мс | 60 мс |
| Lighthouse Performance | 62 | 96 |
Розкид залежить від кількості та складності островів, але виграш очевидний. Отримайте консультацію — ми оцінимо потенціал Islands Architecture для вашого проєкту безкоштовно.
Директиви гідрації
| Директива | Момент гідрації | Використання |
|---|---|---|
client:load |
Одразу після завантаження сторінки | Кнопка поділитися, кошик |
client:idle |
Коли браузер у простої | Зміст, пошук |
client:visible |
Коли елемент з'являється у вікні перегляду | Коментарі, форми зворотного зв'язку |
client:media |
При виконанні медіа-запиту | Адаптивні віджети |
client:only |
Повністю клієнтський рендеринг (без SSR) | Кастомні анімації |
Як реалізувати Islands в Astro покроково?
- Встановіть Astro з підтримкою потрібних фреймворків (
npx create astro). - Розбийте макет на статичні та інтерактивні блоки. Статичні —
.astroабо.mdx, інтерактивні —.tsx,.vue,.svelte. - Перенесіть інтерактивні компоненти в папку
islands/. Кожен файл — окремий острів. - Імпортуйте острів у шаблон і додайте директиву гідрації:
-
client:load— одразу при завантаженні сторінки (для критичних елементів на кшталт кошика). -
client:idle— коли браузер у простої (для змісту). -
client:visible— коли елемент з'являється у вікні перегляду (для коментарів).
-
- Реалізуйте міжострівну комунікацію через nano stores або браузерні події.
- Виміряйте метрики та за необхідності скоригуйте директиви.
Повний приклад сторінки блогу
---
// src/pages/blog/[slug].astro
import type { GetStaticPaths } from 'astro';
import { getCollection } from 'astro:content';
import BaseLayout from '@/layouts/BaseLayout.astro';
import ArticleHero from '@/components/ArticleHero.astro';
import Prose from '@/components/Prose.astro';
import TableOfContents from '@/islands/TableOfContents.tsx';
import CommentSection from '@/islands/CommentSection.tsx';
import ShareButtons from '@/islands/ShareButtons.svelte';
import NewsletterSignup from '@/islands/NewsletterSignup.vue';
export const getStaticPaths: GetStaticPaths = async () => {
const posts = await getCollection('blog', p => !p.data.draft);
return posts.map(post => ({
params: { slug: post.slug },
props: { post },
}));
};
const { post } = Astro.props;
const { Content, headings } = await post.render();
---
<BaseLayout title={post.data.title} description={post.data.description}>
<ArticleHero post={post} />
<div class="article-layout">
<TableOfContents headings={headings} client:idle />
<article>
<Prose>
<Content />
</Prose>
</article>
</div>
<ShareButtons url={Astro.url.href} title={post.data.title} client:visible />
<CommentSection articleId={post.id} client:visible={{ rootMargin: '0px 0px 200px 0px' }} />
<NewsletterSignup client:load />
</BaseLayout>
Що таке міжострівна комунікація і навіщо вона потрібна?
Острови ізольовані — у них немає спільного контексту. Рекомендуємо nano stores для Astro. Приклад сховища кошика:
// src/stores/cart.ts
import { atom, computed } from 'nanostores';
import { persistentAtom } from '@nanostores/persistent';
export const cartItems = persistentAtom<CartItem[]>('cart', [], {
encode: JSON.stringify,
decode: JSON.parse,
});
export const cartCount = computed(cartItems, items => items.length);
export const cartTotal = computed(cartItems, items =>
items.reduce((sum, item) => sum + item.price * item.qty, 0)
);
export function addToCart(product: Product) {
const items = cartItems.get();
const existing = items.find(i => i.id === product.id);
if (existing) {
cartItems.set(items.map(i =>
i.id === product.id ? { ...i, qty: i.qty + 1 } : i
));
} else {
cartItems.set([...items, { ...product, qty: 1 }]);
}
}
React та Svelte острови підключаються до одного сховища; зміна в одному негайно відображається в іншому. Альтернатива — нативні браузерні події через CustomEvent.
Що входить у роботу?
- Аудит поточної архітектури та визначення островів
- Налаштування Astro з підтримкою потрібних фреймворків
- Перенесення статичних сторінок та розбивка на острови
- Реалізація міжострівної комунікації
- Оптимізація директив гідрації
- Тестування ізоляції та продуктивності
- Документація та навчання команди
- Підтримка після деплою на Cloudflare Pages / Netlify
Вартість аудиту та міграції розраховується індивідуально на основі обсягу робіт.
Строки реалізації
- Тиждень 1–2: аудит, налаштування, виявлення інтерактивних компонентів
- Тиждень 3: перенесення статики, розбивка на острови
- Тиждень 4: міжострівна комунікація, тестування ізоляції
- Тиждень 5: вимірювання Core Web Vitals, оптимізація
- Тиждень 6: деплой, документація
Наша компанія має понад 5 років досвіду в веб-розробці та виконала 50+ успішних міграцій на Islands Architecture. Наша команда з багаторічним досвідом та понад 50 успішних міграцій гарантує результат. Замовте аудит продуктивності — ми зв'яжемося з вами протягом дня і запропонуємо оптимальне рішення.







