מבוא: למה Core Web Vitals חשובים יותר מתמיד ב-2026
בואו נדבר תכלס — ב-2026, ביצועי אתרי אינטרנט הם כבר לא רק "נחמד שיהיה". הם גורם מכריע בדירוג בגוגל, בשיעורי המרה ובשביעות רצון המשתמשים. גוגל עדכנה את מדדי Core Web Vitals עם כמה שינויים רציניים: סף מחמיר יותר למדד INP, מדידה מדויקת יותר של LCP, ומדדים חדשים כמו Visual Stability Index שמוסיפים שכבה נוספת של מורכבות.
במדריך הזה נפרק את הכל — LCP, INP ו-CLS — עם דוגמאות קוד, כלים ואסטרטגיות מוכחות שתוכלו ליישם כבר היום.
ואם אתם צריכים מספרים כדי להשתכנע: 53% מהמבקרים נוטשים אתר שזמן הטעינה שלו עולה על 3 שניות. אתרים שעומדים בסף של Core Web Vitals נהנים משיעורי נטישה נמוכים ב-24% לעומת אתרים שלא עומדים בו. זה הבדל ענק. אז כן, הבנה עמוקה של המדדים האלה היא הכרחית — לא רק לגוגל, אלא גם לשורה התחתונה שלכם.
חלק 1: Largest Contentful Paint (LCP) — אופטימיזציית זמן טעינה
מה זה LCP ומה השתנה ב-2026
Largest Contentful Paint מודד את הזמן שלוקח לאלמנט התוכן הגדול ביותר שנראה בחלון התצוגה להיטען במלואו. נשמע פשוט, נכון? ובכן, ב-2026 המדד הפך למדויק יותר — הוא מתחשב עכשיו גם בטעינת תמונות רקע ותוכן שמוכנס דינמית, מקרים שגרסאות קודמות פספסו.
הסף המומלץ נשאר 2.5 שניות או פחות, אבל הדרך למדוד אותו כוללת עכשיו תרחישים מורכבים יותר. אלמנט LCP טיפוסי יכול להיות תמונת גיבור (hero image), כותרת גדולה, וידאו מוטמע, או בלוק טקסט משמעותי.
אסטרטגיה 1: שימוש ב-fetchpriority לשיפור דרמטי
זו אחת הטכניקות האהובות עלי. התכונה fetchpriority מאפשרת להנחות את הדפדפן להעדיף משאבים קריטיים, ומחקרים מראים שיפור של 20-30% ב-LCP כשמשתמשים בה נכון. Etsy, למשל, דיווחו על שיפור של 4% ב-LCP רק מהוספת התכונה הזו — וזה בלי לגעת בשום דבר אחר.
<!-- העדפת תמונת ה-LCP -->
<img
src="/images/hero-banner.webp"
alt="Hero Banner"
fetchpriority="high"
width="1200"
height="600"
decoding="async"
/>
<!-- הורדת עדיפות לתמונות שמתחת לקפל -->
<img
src="/images/secondary.webp"
alt="Secondary Image"
fetchpriority="low"
loading="lazy"
/>
חשוב: השתמשו ב-fetchpriority="high" רק עבור תמונת ה-LCP היחידה. ראיתי מפתחים שמוסיפים את זה לכל התמונות בדף — וזה בדיוק ההפך ממה שרוצים. כשהכל בעדיפות גבוהה, שום דבר לא באמת בעדיפות גבוהה.
אסטרטגיה 2: Preconnect ו-Preload למשאבים חיצוניים
כשתמונת ה-LCP שלכם נטענת משרת חיצוני (CDN, לדוגמה), חיבור מוקדם חוסך מאות מילישניות. וב-web performance, מאות מילישניות זה הכל:
<head>
<!-- חיבור מוקדם ל-CDN -->
<link rel="preconnect" href="https://cdn.example.com">
<link rel="dns-prefetch" href="https://cdn.example.com">
<!-- טעינה מוקדמת של תמונת ה-LCP -->
<link
rel="preload"
as="image"
href="https://cdn.example.com/hero.webp"
fetchpriority="high"
type="image/webp"
>
<!-- טעינה מוקדמת של פונט קריטי -->
<link
rel="preload"
as="font"
href="/fonts/main-font.woff2"
type="font/woff2"
crossorigin
>
</head>
אסטרטגיה 3: אופטימיזציית תמונות מודרנית
ב-2026, אם אתם עדיין מגישים JPEG או PNG בלבד — אתם משאירים ביצועים על השולחן. AVIF ו-WebP הם הסטנדרט, ושימוש באלמנט <picture> עם fallback מבטיח תאימות מלאה:
<picture>
<source
srcset="/images/hero.avif"
type="image/avif"
>
<source
srcset="/images/hero.webp"
type="image/webp"
>
<img
src="/images/hero.jpg"
alt="Hero Image"
width="1200"
height="600"
fetchpriority="high"
decoding="async"
>
</picture>
טיפ מתקדם: השתמשו בתמונות רספונסיביות עם srcset ו-sizes כדי להגיש תמונות בגודל שבאמת מתאים למכשיר של המשתמש:
<img
srcset="
/images/hero-400.webp 400w,
/images/hero-800.webp 800w,
/images/hero-1200.webp 1200w,
/images/hero-1600.webp 1600w
"
sizes="(max-width: 768px) 100vw, (max-width: 1200px) 80vw, 1200px"
src="/images/hero-1200.webp"
alt="Hero"
fetchpriority="high"
width="1200"
height="600"
/>
אסטרטגיה 4: צמצום TTFB (Time to First Byte)
TTFB הוא הבסיס שעליו נבנה ה-LCP. אפשר לחשוב על זה ככה — אם ה-TTFB שלכם איטי, אין סיכוי שה-LCP יהיה מהיר. גוגל ממליצה על 800 מילישניות או פחות. הנה כמה שיטות שעובדות:
- Edge Computing: עיבוד בקרבת המשתמש עם Cloudflare Workers או Vercel Edge Functions יכול להוריד את ה-TTFB מתחת ל-50 מילישניות. כן, 50.
- Server-Side Caching: שימוש ב-Redis או Varnish לשמירת תגובות HTML בזיכרון.
- 103 Early Hints: שליחת resource hints עוד לפני שהתגובה המלאה מוכנה — זו תכונה שלא מספיק אנשים מנצלים:
# הגדרת Early Hints ב-Nginx
location / {
add_header Link "; rel=preload; as=style" early;
add_header Link "; rel=preload; as=image" early;
proxy_pass http://backend;
}
אסטרטגיה 5: Critical CSS ו-Inline Styles
טעינת CSS קריטי ישירות בתוך ה-HTML מבטיחה שהדפדפן יכול לרנדר את התוכן הראשוני הרבה יותר מהר. הרעיון פשוט: במקום לחכות לטעינת קובץ CSS חיצוני שלם, מטמיעים רק את מה שצריך לתצוגה הראשונית:
<head>
<!-- CSS קריטי מוטמע -->
<style>
/* רק ה-CSS הנדרש לתצוגה ראשונית */
.hero { position: relative; min-height: 60vh; }
.hero img { width: 100%; height: auto; display: block; }
.nav { display: flex; align-items: center; padding: 1rem; }
h1 { font-size: 2.5rem; line-height: 1.2; }
</style>
<!-- טעינת שאר ה-CSS באופן אסינכרוני -->
<link
rel="preload"
href="/css/main.css"
as="style"
onload="this.onload=null;this.rel='stylesheet'"
>
<noscript><link rel="stylesheet" href="/css/main.css"></noscript>
</head>
חלק 2: Interaction to Next Paint (INP) — אופטימיזציית תגובתיות
הבנת INP לעומק
INP החליף את FID (First Input Delay) שיצא משימוש ב-2024, וזה שינוי שבאמת היה צריך לקרות. בעוד FID מדד רק את ההשהיה של האינטראקציה הראשונה (שזה קצת כמו לשפוט מסעדה לפי המנה הראשונה בלבד), INP מודד את התגובתיות של כל האינטראקציות לאורך כל חיי הדף — לחיצות, הקשות מקלדת ונגיעות במסך.
הסף: 200 מילישניות או פחות נחשב טוב, 200-500 דורש שיפור, ומעל 500 נחשב גרוע. ב-2026, גוגל בוחנת את זה בצורה מחמירה יותר ומתמקדת ב-P75 (אחוזון 75) של כל האינטראקציות.
שלוש הפאזות של כל אינטראקציה
כל אינטראקציה מורכבת משלוש פאזות, וחשוב להבין כל אחת כדי לדעת איפה לאופטמז:
- Input Delay (השהיית קלט): הזמן בין האינטראקציה לתחילת העיבוד. בדרך כלל נגרם ממשימות ארוכות (long tasks) שחוסמות את ה-main thread.
- Processing Duration (זמן עיבוד): הזמן שלוקח ל-event handlers לרוץ.
- Presentation Delay (השהיית הצגה): הזמן בין סיום העיבוד לרנדור הוויזואלי הבא.
אסטרטגיה 1: פיצול משימות ארוכות (Long Tasks)
משימות ארוכות — כל דבר מעל 50 מילישניות — חוסמות את ה-main thread ומגדילות את ה-Input Delay. הבעיה הזו מופיעה כמעט בכל אתר שעבדתי עליו. הנה הטכניקה המרכזית לפיצולן:
// ❌ גרוע: משימה ארוכה שחוסמת את ה-main thread
function processLargeDataset(data) {
data.forEach(item => {
heavyComputation(item);
updateDOM(item);
});
}
// ✅ טוב: פיצול עם yield ל-main thread
async function processLargeDataset(data) {
const CHUNK_SIZE = 50;
for (let i = 0; i < data.length; i += CHUNK_SIZE) {
const chunk = data.slice(i, i + CHUNK_SIZE);
chunk.forEach(item => {
heavyComputation(item);
updateDOM(item);
});
// נותנים לדפדפן להגיב לאינטראקציות
await yieldToMain();
}
}
function yieldToMain() {
return new Promise(resolve => {
if ('scheduler' in window && 'yield' in scheduler) {
// API מודרני ב-2026
scheduler.yield().then(resolve);
} else {
setTimeout(resolve, 0);
}
});
}
ב-2026, ה-API scheduler.yield() זמין בדפדפנים מבוססי Chromium ומאפשר yield אלגנטי ל-main thread תוך שמירה על סדר העדיפויות. זו ממש מתנה למפתחים.
אסטרטגיה 2: העברת עבודה ל-Web Workers
חישובים כבדים שלא צריכים גישה ל-DOM? אין סיבה שהם ירוצו על ה-main thread. העבירו אותם ל-Worker:
// main.js
const worker = new Worker('/js/data-worker.js');
document.getElementById('processBtn').addEventListener('click', () => {
// עדכון UI מיידי
showLoadingSpinner();
// העברת עבודה כבדה ל-worker
worker.postMessage({ action: 'process', data: largeDataset });
});
worker.onmessage = (event) => {
const { results } = event.data;
hideLoadingSpinner();
renderResults(results);
};
// data-worker.js
self.onmessage = (event) => {
const { action, data } = event.data;
if (action === 'process') {
const results = performHeavyCalculation(data);
self.postMessage({ results });
}
};
אסטרטגיה 3: Debounce ו-Throttle חכם
אירועים שמתרחשים בתדירות גבוהה — scroll, resize, input — יכולים להציף את ה-main thread אם לא מטפלים בהם נכון. הטריק הוא להפריד בין תגובה ויזואלית מיידית לבין פעולות כבדות:
// ❌ גרוע: עיבוד בכל אירוע קלט
searchInput.addEventListener('input', (e) => {
fetchSearchResults(e.target.value);
renderSuggestions();
});
// ✅ טוב: debounce עם עדכון UI מיידי
searchInput.addEventListener('input', (e) => {
// עדכון ויזואלי מיידי (presentation)
updateSearchHighlight(e.target.value);
// debounce לפעולות כבדות
clearTimeout(searchTimeout);
searchTimeout = setTimeout(() => {
fetchSearchResults(e.target.value);
}, 300);
});
אסטרטגיה 4: צמצום גודל ה-DOM
DOM גדול (מעל 1,400 אלמנטים) מאט כל אינטראקציה, כי הדפדפן צריך לחשב מחדש את הפריסה. זה אחד מהדברים שמפתחים נוטים להתעלם מהם, אבל ההשפעה יכולה להיות דרמטית:
/* שימוש ב-content-visibility לאלמנטים שמחוץ למסך */
.below-fold-section {
content-visibility: auto;
contain-intrinsic-size: 0 500px;
}
/* CSS Containment לבידוד אזורים */
.independent-widget {
contain: layout style paint;
}
עבור רשימות ארוכות, וירטואליזציה היא הפתרון — רנדרו רק את הפריטים שנראים על המסך:
// דוגמה בסיסית של וירטואליזציה
class VirtualList {
constructor(container, items, itemHeight) {
this.container = container;
this.items = items;
this.itemHeight = itemHeight;
this.visibleCount = Math.ceil(container.clientHeight / itemHeight);
container.addEventListener('scroll', () => this.render());
this.render();
}
render() {
const scrollTop = this.container.scrollTop;
const startIndex = Math.floor(scrollTop / this.itemHeight);
const endIndex = Math.min(
startIndex + this.visibleCount + 2,
this.items.length
);
// רנדור רק פריטים גלויים
const fragment = document.createDocumentFragment();
for (let i = startIndex; i < endIndex; i++) {
const el = this.createItem(this.items[i], i);
fragment.appendChild(el);
}
this.container.innerHTML = '';
this.container.style.paddingTop = `${startIndex * this.itemHeight}px`;
this.container.appendChild(fragment);
}
}
אסטרטגיה 5: אופטימיזציית Event Handlers
Layout Thrashing — קריאה וכתיבה חוזרת ל-DOM בלולאה — הוא רוצח ביצועים שקט. הנה איך להימנע ממנו:
// ❌ Layout Thrashing
items.forEach(item => {
const height = item.offsetHeight; // קריאה → Force Layout
item.style.height = height * 2 + 'px'; // כתיבה
});
// ✅ Batch reads, then batch writes
const heights = items.map(item => item.offsetHeight); // כל הקריאות
items.forEach((item, i) => {
item.style.height = heights[i] * 2 + 'px'; // כל הכתיבות
});
// ✅ או שימוש ב-requestAnimationFrame
function optimizedUpdate() {
// קריאות
const measurements = items.map(item => item.getBoundingClientRect());
requestAnimationFrame(() => {
// כתיבות
items.forEach((item, i) => {
item.style.transform = `translateY(${measurements[i].top}px)`;
});
});
}
חלק 3: Cumulative Layout Shift (CLS) — יציבות ויזואלית
הבנת CLS ב-2026
אתם מכירים את ההרגשה הזו — אתם עומדים ללחוץ על כפתור, ופתאום הכל קופץ ואתם לוחצים על משהו אחר? זה בדיוק מה ש-CLS מודד. הסף הוא 0.1 או פחות.
ב-2026, גוגל הוסיפה גם את מדד Visual Stability Index (VSI) שמודד יציבות לאורך כל הסשן, כולל תזוזות שנגרמות מפעולות ניווט. הסיבות הנפוצות ביותר ל-CLS גבוה:
- תמונות ומדיה ללא מימדים מוגדרים
- פונטים שגורמים ל-FOUT (Flash of Unstyled Text)
- תוכן דינמי שמוכנס מעל תוכן קיים
- פרסומות וצדדים שלישיים שמשנים פריסה
- אנימציות שמשתמשות בתכונות שמפעילות Layout
אסטרטגיה 1: מימדים מפורשים לכל מדיה
הפתרון הכי פשוט וגם הכי אפקטיבי — הגדירו מימדים לכל תמונה, וידאו ו-iframe. זה ממש לא מסובך:
<!-- ✅ תמונות עם מימדים -->
<img src="photo.webp" width="800" height="600" alt="Photo">
<!-- ✅ וידאו עם aspect-ratio -->
<div style="aspect-ratio: 16/9;">
<iframe
src="https://www.youtube.com/embed/VIDEO_ID"
width="100%"
height="100%"
loading="lazy"
></iframe>
</div>
<!-- ✅ CSS aspect-ratio מודרני -->
<style>
.responsive-image {
aspect-ratio: 4/3;
width: 100%;
height: auto;
object-fit: cover;
}
</style>
אסטרטגיה 2: אופטימיזציית טעינת פונטים
פונטים מותאמים אישית יכולים לגרום ל-FOUT או FOIT, ושניהם מובילים ל-CLS. כנס שראיתי בנושא הציג מקרה שבו שינוי אחד בטעינת פונטים הוריד CLS ב-40%. הנה הגישה המומלצת:
<head>
<!-- טעינה מוקדמת של פונטים -->
<link
rel="preload"
href="/fonts/custom-font.woff2"
as="font"
type="font/woff2"
crossorigin
>
<style>
@font-face {
font-family: 'CustomFont';
src: url('/fonts/custom-font.woff2') format('woff2');
font-display: optional; /* מונע FOUT לחלוטין */
/* size-adjust לצמצום הבדלי גודל */
size-adjust: 102%;
ascent-override: 90%;
descent-override: 22%;
line-gap-override: 0%;
}
body {
font-family: 'CustomFont', system-ui, sans-serif;
}
</style>
</head>
שימוש ב-font-display: optional מונע לחלוטין החלפת פונט אחרי הרנדור הראשון. אם הפונט לא הספיק להיטען — הדפדפן פשוט ישתמש ב-fallback ולא יגרום ל-layout shift. פשוט ויעיל.
אסטרטגיה 3: שמירת מקום לתוכן דינמי
פרסומות, באנרים ותוכן שנטען דינמית הם מהאשמים הכי גדולים ב-CLS. הפתרון? שמרו להם מקום מראש:
<!-- ✅ שמירת מקום לפרסומת -->
<div class="ad-slot" style="min-height: 250px; min-width: 300px;">
<!-- הפרסומת תוכנס כאן -->
</div>
<!-- ✅ skeleton loading עם מקום שמור -->
<div class="content-placeholder" style="min-height: 200px;">
<div class="skeleton-line" style="width: 80%; height: 1.2em;"></div>
<div class="skeleton-line" style="width: 60%; height: 1.2em;"></div>
<div class="skeleton-line" style="width: 70%; height: 1.2em;"></div>
</div>
<style>
.skeleton-line {
background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%);
background-size: 200% 100%;
animation: shimmer 1.5s infinite;
border-radius: 4px;
margin-bottom: 0.5rem;
}
@keyframes shimmer {
0% { background-position: 200% 0; }
100% { background-position: -200% 0; }
}
</style>
אסטרטגיה 4: הכנסת תוכן ללא הזזה
כשמוסיפים תוכן דינמי, הכלל הוא פשוט: הוסיפו אותו מתחת לאזור הנראה, או השתמשו בפוזיציונינג שלא מזיז תוכן אחר:
// ✅ הכנסת הודעה ללא layout shift
function showNotification(message) {
const notification = document.createElement('div');
notification.className = 'notification';
notification.textContent = message;
// שימוש ב-position: fixed — לא מזיז תוכן אחר
notification.style.cssText = `
position: fixed;
top: 0;
left: 50%;
transform: translateX(-50%) translateY(-100%);
transition: transform 0.3s ease-out;
z-index: 1000;
`;
document.body.appendChild(notification);
// אנימציה עם transform (לא top/margin)
requestAnimationFrame(() => {
notification.style.transform = 'translateX(-50%) translateY(0)';
});
}
חלק 4: Speculation Rules API — ניווט מיידי
מה זה Speculation Rules ולמה זה משנה את כללי המשחק
אם יש API אחד שהכי מרגש אותי ב-2026, זה Speculation Rules. הוא מאפשר לדפדפן לבצע prefetch או אפילו prerender של עמודים שהמשתמש עשוי לנווט אליהם — מה שמוביל לניווט כמעט מיידי. ואני מתכוון לכמעט מיידי — כאילו, אפס תחושה של המתנה.
המספרים מדברים: אתרים שמשתמשים ב-prerender רואים שיפור של 500 מילישניות ב-P95 של LCP ו-177 מילישניות ב-P75. העמוד הבא פשוט כבר מוכן ברקע כשהמשתמש לוחץ על הקישור.
יישום Speculation Rules
<!-- Speculation Rules בסיסי -->
<script type="speculationrules">
{
"prefetch": [
{
"where": {
"and": [
{ "href_matches": "/*" },
{ "not": { "href_matches": "/logout" } },
{ "not": { "href_matches": "/api/*" } }
]
},
"eagerness": "moderate"
}
],
"prerender": [
{
"where": {
"and": [
{ "href_matches": "/*" },
{ "not": { "selector_matches": ".no-prerender" } }
]
},
"eagerness": "moderate"
}
]
}
</script>
רמות eagerness
אפשר לשלוט ברמת ה"להיטות" של הדפדפן, וזה חשוב כי prerender צורך משאבים:
- immediate: ביצוע מיידי עם טעינת הדף. מתאים לדפי נחיתה עם CTA ברור.
- eager: ב-desktop, הפעלה אחרי 10 מילישניות של ריחוף עם העכבר. במובייל, 50 מילישניות אחרי שהקישור נכנס ל-viewport.
- moderate: הפעלה אחרי 200 מילישניות של ריחוף — האיזון המומלץ לרוב המקרים.
- conservative: הפעלה רק כשהמשתמש לוחץ על הקישור (mousedown/pointerdown). הכי חסכוני במשאבים.
שילוב עם bfcache
ה-bfcache שומר עמודים בזיכרון הדפדפן כשהמשתמש עוזב אותם, ומאפשר חזרה מיידית. אבל קל מאוד לשבור אותו בלי לשים לב. כדי להבטיח תאימות:
// ❌ פעולות שמונעות bfcache
window.addEventListener('unload', () => {
// אירוע unload מונע bfcache!
sendAnalytics();
});
// ✅ שימוש ב-pagehide במקום unload
window.addEventListener('pagehide', (event) => {
if (!event.persisted) {
// הדף לא יישמר ב-bfcache
sendAnalytics();
}
});
// ✅ שחזור מצב כשחוזרים מ-bfcache
window.addEventListener('pageshow', (event) => {
if (event.persisted) {
// הדף שוחזר מ-bfcache
refreshDynamicContent();
updateTimestamps();
}
});
חלק 5: מדידה וניטור — הכלים והשיטות
כלי מדידה בשדה (Field Data)
מדידה בשדה (Real User Monitoring) היא המדידה שגוגל בפועל משתמשת בה לדירוג. ספריית web-vitals של גוגל היא הכלי הסטנדרטי, ואני ממליץ להתקין אותה בכל פרויקט:
import { onLCP, onINP, onCLS } from 'web-vitals';
function sendToAnalytics(metric) {
const data = {
name: metric.name,
value: metric.value,
rating: metric.rating, // 'good', 'needs-improvement', 'poor'
delta: metric.delta,
id: metric.id,
navigationType: metric.navigationType,
// מידע נוסף לדיבוג
entries: metric.entries.map(entry => ({
element: entry.element?.tagName,
url: entry.url,
startTime: entry.startTime,
})),
};
// שליחה ל-analytics endpoint
if (navigator.sendBeacon) {
navigator.sendBeacon('/api/vitals', JSON.stringify(data));
}
}
onLCP(sendToAnalytics);
onINP(sendToAnalytics);
onCLS(sendToAnalytics);
כלי מדידה במעבדה (Lab Data)
כלי מעבדה חיוניים לדיבוג ופיתוח, גם אם הם לא משקפים בדיוק את מה שקורה אצל המשתמשים:
- Lighthouse: ביקורת ביצועים מקיפה עם המלצות ספציפיות. ב-2026, הוא כולל בדיקות INP סינתטיות משופרות.
- Chrome DevTools Performance Panel: ניתוח מפורט של כל אינטראקציה, long tasks ו-layout shifts. כלי אדיר לדיבוג.
- DebugBear / SpeedCurve: כלי ניטור מתמשך שמשלבים נתוני שדה ומעבדה.
- PageSpeed Insights: נתוני CrUX אמיתיים מ-28 הימים האחרונים — זה מה שגוגל רואה.
בדיקה אוטומטית ב-CI/CD
שילוב בדיקות ביצועים ב-CI/CD הוא לדעתי חובה. אין טעם לעבוד קשה על אופטימיזציה אם PR הבא יכול לקלקל הכל:
# .github/workflows/performance.yml
name: Performance Audit
on: [pull_request]
jobs:
lighthouse:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run Lighthouse
uses: treosh/lighthouse-ci-action@v12
with:
urls: |
https://staging.example.com/
https://staging.example.com/products
budgetPath: ./lighthouse-budget.json
uploadArtifacts: true
- name: Assert Performance Budget
run: |
# בדיקת סף ביצועים
npx lighthouse-ci assert --preset=lighthouse:recommended
// lighthouse-budget.json
[
{
"path": "/*",
"timings": [
{ "metric": "largest-contentful-paint", "budget": 2500 },
{ "metric": "cumulative-layout-shift", "budget": 0.1 },
{ "metric": "total-blocking-time", "budget": 300 }
],
"resourceSizes": [
{ "resourceType": "script", "budget": 150 },
{ "resourceType": "image", "budget": 300 },
{ "resourceType": "total", "budget": 500 }
]
}
]
חלק 6: רשימת בדיקה מסכמת — Quick Wins
שיפורי LCP מהירים
- הוסיפו
fetchpriority="high"לתמונת ה-LCP - השתמשו ב-
preconnectלדומיינים חיצוניים - הטמיעו Critical CSS ב-inline
- עברו לפורמטים AVIF/WebP
- הגדירו
preloadלתמונת ה-LCP - שקלו שימוש ב-103 Early Hints
שיפורי INP מהירים
- פצלו long tasks עם
scheduler.yield() - העבירו חישובים כבדים ל-Web Workers
- השתמשו ב-debounce/throttle לאירועים תכופים
- צמצמו את גודל ה-DOM
- השתמשו ב-
content-visibility: autoלאלמנטים שמחוץ למסך - הימנעו מ-Layout Thrashing
שיפורי CLS מהירים
- הגדירו
widthו-height(אוaspect-ratio) לכל מדיה - השתמשו ב-
font-display: optionalעםsize-adjust - שמרו מקום לפרסומות ותוכן דינמי
- הימנעו מהכנסת תוכן מעל אזור הנראה
- וודאו תאימות ל-bfcache
סיכום
אופטימיזציית Core Web Vitals ב-2026 דורשת גישה מקיפה שמשלבת טכניקות מרובות — אין כדור כסף אחד שפותר הכל. המפתח להצלחה הוא מדידה מתמשכת, בשדה ובמעבדה, וטיפול מתודי בכל אחד משלושת המדדים.
התחילו עם ה-Quick Wins מהרשימה למעלה. מדדו את ההשפעה. ואז המשיכו לשפר בצורה איטרטיבית.
וכן, המטרה האמיתית היא לא רק לעבור את הסף של גוגל — אלא ליצור חווית משתמש שאנשים באמת רוצים לחזור אליה. אתר מהיר, תגובתי ויציב ויזואלית מוביל ליותר המרות, יותר מעורבות ויותר הכנסות. עם הכלים והטכניקות שתיארנו כאן, אין באמת תירוץ לחוויית משתמש איטית.
הצעד הבא שלכם: הריצו PageSpeed Insights על האתר, זהו את המדד הבעייתי ביותר, והתמקדו באסטרטגיות הרלוונטיות. שיפור של מדד אחד בלבד יכול להוביל לשינוי משמעותי בדירוג ובחוויה של המשתמשים.