תארו לעצמכם: אתם טוענים דף בלוג, והדפדפן מוריד 200KB של JavaScript רק בשביל תוכן עניינים אינטראקטיבי וכפתור שיתוף. 80% מהקוד הזה מיותר עבור הרינדור הראשוני—הוא רק צורך רוחב פס ומעבד. ארכיטקטורת איים (Islands Architecture) פותרת את זה: רק ה-JS הדרוש נטען עבור כל בלוק אינטראקטיבי. השתמשנו בתבנית זו עם Astro בפרויקטים רבים, והלקוחות שלנו רואים הפחתה של 80–90% ב-JS הראשוני, ציון Lighthouse Performance של עד 96, והפחתה פי 4 ב-Time to Interactive (TTI). זה יכול לקצץ משמעותית בעלויות התעבורה ולהאיץ את זמני הטעינה. צרו קשר לבדיקה.
מודל ארכיטקטוני
Статичный 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
└─────────────────────────────────────┘ אילו בעיות פותרת ארכיטקטורת איים?
טעינת JavaScript מוגזמת
אפילו אלמנטים אינטראקטיביים קטנים במסגרות SSR קלאסיות מושכים את כל ה-bundle. לדוגמה, כפתור שיתוף יכול להיות 50KB של React + ReactDOM. עם ארכיטקטורת איים, כל אי הוא chunk נפרד שמתחבר (hydrate) רק כשצריך. בפרויקטים אמיתיים, הפחתנו את ה-JS הראשוני מ-250KB ל-15–40KB. בהשוואה ל-SSR קלאסי, Astro Islands יכול להיות מהיר פי 3 ב-Total Blocking Time. החיסכון בתעבורה ובאחסון מהפחתת JS יכול להגיע ל-30–50% מהעלויות הנוכחיות.
TBT ו-TTI איטיים
כל קילובייט של JS מוסיף עיכוב ל-Total Blocking Time. איים מפזרים את ההידרציה לאורך זמן: תוכן סטטי נטען מיידית, ואיים מופעלים לאחר טעינת הדף. זה מניב TTI מתחת לשנייה אחת בהשוואה ל-3–4 שניות לפני המעבר.
כיצד ארכיטקטורת איים משפרת את Core Web Vitals?
מדידות מפרויקטים אמיתיים לאחר המעבר:
| מדד | לפני (Full React SSR) | אחרי (Astro Islands) |
|---|---|---|
| JS ראשוני | 180–250 KB | 15–40 KB |
| TTI | 3.2 שניות | 0.8 שניות |
| TBT | 480 ms | 60 ms |
| Lighthouse Performance | 62 | 96 |
הטווח תלוי במספר ובמורכבות של האיים, אבל הרווח ברור. בקשו ייעוץ—נעריך את הפוטנציאל של ארכיטקטורת איים עבור הפרויקט שלכם ללא עלות.
הנחיות הידרציה
| הנחיה | רגע ההידרציה | שימוש |
|---|---|---|
Статичный 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 └─────────────────────────────────────┘ |
מיידית לאחר טעינת הדף | כפתור שיתוף, עגלת קניות |
client:load |
כשהדפדפן במצב סרק | תוכן עניינים, חיפוש |
client:idle |
כשהאלמנט נכנס לאזור התצוגה | תגובות, טפסי יצירת קשר |
client:visible |
כשמדיה query מתאימה | ווידג'טים רספונסיביים |
client:media |
רינדור מלא בצד הלקוח (ללא SSR) | אנימציות מותאמות אישית |
כיצד ליישם איים ב-Astro צעד אחר צעד?
- התקינו את Astro עם תמיכה במסגרות הנדרשות (
client:only). - חלקו את הפריסה לבלוקים סטטיים ואינטראקטיביים. סטטיים משתמשים ב-
npx create astroאו.astro; אינטראקטיביים משתמשים ב-.mdx,.tsx,.vue. - העבירו רכיבים אינטראקטיביים לתיקיית
.svelte. כל קובץ הוא אי נפרד. - ייבאו את האי לתבנית והוסיפו הנחיית הידרציה:
-
islands/— מיידית בטעינת הדף (אלמנטים קריטיים כמו עגלת קניות). -
client:load— כשהדפדפן במצב סרק (תוכן עניינים). -
client:idle— כשהאלמנט נכנס לאזור התצוגה (תגובות).
דוגמה לדף בלוג טיפוסי:
--- // 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: פריסה, תיעוד
הצוות שלנו של מומחים מנוסים עם למעלה מ-50 מעברים מוצלחים מבטיח תוצאות. בקשו בדיקת ביצועים—נחזור אליכם תוך יום ונציע את הפתרון הטוב ביותר.
-







