חזרה למאמרים

Smart Websites

איך להשתמש ב-scheduler.yield() כדי לשמור על INP מושלם באתרי AI

עיבוד מודלי AI בדפדפן תוקע את ה-Main Thread והורס את ה-INP. המדריך הפרקטי לשימוש ב-Scheduler API וב-scheduler.yield() לחלוקת משימות כבדות ללא קפיאות ממשק.

3 דקות קריאהWeb Performance · INP · JavaScript · Scheduler API · Browser AI

yield() כדי לשמור על INP מושלם באתרי AI

TL;DR

הרצת מודלי AI ועיבוד נתונים ישירות בדפדפן מייצרים משימות ארוכות (Long Tasks) התוקעות את הממשק. השימוש ב-scheduler.yield() מאפשר לפצל משימות כבדות, לטפל בקלטי משתמש בזמן אמת ולשמור על מדד INP ירוק ומהיר.

אני רואה יותר ויותר אתרים שמריצים מודלי AI ישירות בדפדפן ב-2026. מניתוח טקסט בלוקאלי ועד עיבוד וקטורים בזמן אמת, העבודה עברה אל הלקוח. אבל יש מחיר: הממשק נתקע.

כשהדפדפן מריץ בלוק קוד של 300 מילי-שניות, המשתמש מנסה ללחוץ על כפתור וכלום לא קורה. מדד ה-INP (Interaction to Next Paint) שלכם צונח באותו רגע.

הגדרה · INP (Interaction to Next Paint)

מדד ביצועים של גוגל המודד את הזמן שחולף מרגע שהמשתמש ביצע אינטראקציה (לחיצה, הקלדה) ועד שהדפדפן עדכן את המסך בפועל.

הנה 6 הצעדים הפרקטיים ליישום scheduler.yield() כדי לפצל עיבודי AI כבדים ולשמור על אתר טס.

1. זיהוי נקודות החנק של ה-Main Thread

לפני שניגשים לקוד, צריך להבין איפה הבעיה. עיבוד של טוקנים, ג'נרייטור של טקסט, או חישוב דמיון קוסינוס בין וקטורים הם החשודים המיידיים.

כשרצים בלולאה צפופה, ה-Event Loop של הדפדפן נחסם. כל לחיצה על עכבר נכנסת לתור וממתינה לסיום הלולאה.

200ms

סף המקסימום של מדד INP לפני שהאתר מוגדר כאיטי על ידי גוגל

מקור: Chrome Web Vitals, 2026

אם יש לכם משימה שלוקחת 400 מילי-שניות, עברתם את הרף פי שניים. התשובה היא לא לבטל את החישוב, אלא לחתוך אותו למקעים קטנים.

2. להבין את הקסם של scheduler.

yield()

בעבר, מפתחים השתמשו ב-setTimeout(fn, 0) כדי לפצל משימות. הבעיה? setTimeout מעביר את המשימה לסוף התור, מה שגורם להשהיות מיותרות ולחוסר עקביות.

המנגנון של scheduler.yield() עובד אחרת. הוא אומר לדפדפן: "קח הפסקה קצרה, תבדוק אם המשתמש לחץ על משהו או אם יש רנדור דחוף, ומיד תחזור אליי".

async function processAITokens(tokens) {
  for (let i = 0; i < tokens.length; i++) {
    heavyCalculation(tokens[i]);
    
    // הזרמת שליטה לדפדפן בכל 50 איטרציות
    if (i % 50 === 0 && 'scheduler' in window && 'yield' in scheduler) {
      await scheduler.yield();
    }
  }
}

הקוד קצר. ההשפעה על חווית המשתמש דרמטית.

3. חלוקת לולאות עיבוד טקסט ו-Embeddings

במקום לעבד את כל המערך במכה אחת, הגדירו נקודות יציאה (Yield points) בתוך הלולאות העיקריות.

אם אתם מעבדים מסמך ארוך כדי לייצר ממנו chunks עבור RAG מקומי, אל תריצו את ה-chunking במקשה אחת.

אל תבצעו yield בכל איטרציה יחידה. הפעולה עצמה בעלת תקורה קטנה. בצעו את ה-yield במנות (Chunks) של 10-16 מילי-שניות של עבודה רציפה.

זה שומר על זרימה רציפה מחד, ולא חוסם פריים יחיד מאידך.

4. עדכון רכיבי UI בזמן העיבוד

אחד היתרונות של scheduler.yield() הוא הנראות. כשה-Main Thread משתחרר, הדפדפן יכול לרנדר שינויים ב-DOM.

זה מאפשר לכם להציג פרוגרס-בר אמיתי שמתעדכן באופן חלק, ולא כזה שקופא ב-0% ופתאום קופץ ל-100%.

  • המשתמש רואה שהמערכת עובדת
  • הממשק מגיב ללחיצות ביטול (Cancel)
  • מדד ה-INP נשאר מתחת ל-50 מילי-שניות

התחושה של האתר הופכת מאפליקציה כבדה לאפליקציית נייטיב מהירה.

5. מימוש Fallback דפדפנים בטוח

למרות התמיכה הרחבה ב-2026, תמיד כדאי לוודא שהקוד לא נשבר בדפדפנים ישנים או בסביבות קצה.

כך נראה פוליפיל פשוט ונקי:

async function safeYield() {
  if ('scheduler' in window && 'yield' in scheduler) {
    await scheduler.yield();
  } else {
    await new Promise(resolve => setTimeout(resolve, 0));
  }
}

משתמשים בפונקציה הזו בתוך ה-Async Loops שלכם, והקוד מוגן לחלוטין.

6. מדידה ובקרה ב-Chrome DevTools

אל תנחשו — תמדדו. פתחו את לשונית Performance ב-DevTools והקליטו את פעולת ה-AI.

חפשו פספסים אדומים מעל לשורת ה-Main Thread. אלה ה-Long Tasks. כשהטמעה של scheduler.yield() עובדת נכון, הפסים האדומים הארוכים נעלמים ובמקומם מופיע גוש ירוק של משימות קצרות (Short Tasks).

מדדלפני השימושאחרי השימוש
Long Task Max Duration450ms14ms
INP Score380ms (Poor)28ms (Good)
תגובתיות כפתוריםקפואמיידית

💡

ביצועים הם לא רק גודל הקובץ שלכם — הם בעיקר הזמן שה-Main Thread פנוי להקשיב למשתמש.

סיכום

שילוב מודלי AI בדפדפן מעניק פרטיות ומהירות, אך מציב אתגר ביצועים קשה. ה-Scheduler API ומתודת scheduler.yield() הם הכלים המרכזיים שלכם לשמירה על מדדי Core Web Vitals מעולים. חלוקה נכונה של המשימות תבטיח שהאתר שלכם יישאר מהיר, נגיש ומדורג גבוה.

שאלות נפוצות

כל מה שעוד רצית לדעת

מה ההבדל בין scheduler.yield() לבין setTimeout(..., 0)?
בזמן ש-setTimeout מעביר את המשימה לסוף התור של ה-Event Loop ומכניס השהיה של לפחות 4 מילי-שניות, scheduler.yield() מחזיר את השליטה לדפדפן רק כדי לעבד אירועי קלט ולרנדר פריים, ואז חוזר מיד להמשך המשימה מבלי לאבד קדימות.
האם Web Workers לא פותרים את הבעיה הזו לחלוטין?
Web Workers מצוינים להרצת חישובים ברקע, אך העברת נתונים גדולים (כמו וקטורים או טקסטים קריטיים) בין ה-Worker ל-Main Thread כוללת Serialization שמייצרת תקורה. בנוסף, לעיתים העיבוד חייב להתבצע ישירות מול אלמנטים ב-DOM.
מה קורה בדפדפנים שעדיין לא תומכים ב-Scheduler API?
ניתן לבצע Feature Detection פשוט ולפולבק ל-requestIdleCallback או ל-setTimeout. בצורה זו דפדפנים מתקדמים נהנים מביצועים אופטימליים ודפדפנים ישנים שומרים על יציבות.
AB

כתב

אדיר בן יעקב · Adir Ben Yaakov

מקים JustBetterSite, סוכנות בניית אתרים ושיווק דיגיטלי בתל אביב. מתמחה ב-GEO (Generative Engine Optimization) — בנייה של אתרים שמופיעים בתשובות של ChatGPT, Claude, Perplexity ו-Gemini, לא רק בגוגל.

עוד עליי →

להמשך הקריאה

מאמרים קשורים