האם משימות JavaScript ארוכות מעכבות את הזמן עד לפעילות מלאה?

משימה ארוכה היא קוד JavaScript שמשתלט על ה-thread הראשי לפרק זמן ארוך, וכתוצאה מכך ממשק המשתמש 'קופא'.

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

הזמן עד לפעילות מלאה שמוצג בדוח Lighthouse
דוח Lighthouse שמוצג בו זמן טעינה ראשוני (TTI) נמוך.

עכשיו אפשר להציג משימות ארוכות כתרשים בכלי הפיתוח של Chrome, וכך קל יותר לראות אילו משימות צריך לבצע אופטימיזציה שלהן.

מה נחשב כמשימה ארוכה?

משימות ארוכות שמנצלות הרבה משאבי מעבד נגרמות משימוש מורכב שנמשך יותר מ-50 אלפיות השנייה. לפי מודל RAIL, מומלץ לעבד אירועי קלט של משתמשים תוך 50 אלפיות השנייה כדי להבטיח תגובה גלויה תוך 100 אלפיות השנייה ולשמור על הקשר בין הפעולה לתגובה.

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

האם יש בדף משימות ארוכות שעלולות לעכב את האינטראקטיביות?

עד עכשיו, כדי לזהות את המשימות שגורמות לעיכוב האינטראקטיביות, הייתם צריכים לחפש באופן ידני 'בלוקים צהובים ארוכים' של סקריפט באורך של יותר מ-50 אלפיות השנייה ב-Chrome DevTools או להשתמש ב-Long Tasks API.

צילום מסך של חלונית הביצועים של DevTools, שבו מוצגים ההבדלים בין משימות קצרות למשימות ארוכות
העמודות הצהובות מציינות את אורך המשימה.

כדי להקל על תהליך הביקורת של הביצועים, עכשיו אפשר לראות משימות ארוכות בתצוגה חזותית ב-DevTools. משימות ארוכות (מוצגות באפור) מופיעות עם דגלים אדומים.

DevTools מציג גרפיקה של משימות ארוכות כעמודות אפורות בחלונית הביצועים, עם דגל אדום למשימות ארוכות

כדי להשתמש בכלי התצוגה החזותית החדש:

  1. מתעדים בחלונית הביצועים את הטראסינג של טעינת דף אינטרנט.
  2. מחפשים את הדגל האדום בתצוגה של השרשור הראשי. המשימות אמורות להיות מסומנות עכשיו באפור עם התווית משימה.
  3. מעבירים את הסמן מעל סרגל אפור. תוצג תיבת דו-שיח עם משך המשימה וההגדרה שלה כמשימה ארוכה.

מה גורם למשימות הארוכות?

כדי לבדוק מה הסיבה למשימה ארוכה, בוחרים בסרגל האפור משימה. בתיבה שנפתחת למטה, בוחרים באפשרות Bottom-Up (מלמטה למעלה) ובאפשרות Group by Activity (קיבוץ לפי פעילות). כך תוכלו לראות אילו פעילויות תרמו הכי הרבה (סה"כ) לכך שהמשימה נמשכת כל כך הרבה זמן. בדוגמה הבאה, נראה שגורם העיכוב הוא קבוצה של שאילתות DOM יקרות.

אם בוחרים משימה ארוכה ב-DevTools, מוצגות הפעילויות שאחראיות לה.
בתפריט הזה מוצגים ב-DevTools הגורמים למשימות ארוכות.

מהן הדרכים הנפוצות לביצוע אופטימיזציה של משימות ארוכות?

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

כדאי לפצל את כל העבודה לקטעים שפועלים תוך פחות מ-50 אלפיות השנייה, ולהריץ את הקטעים האלה בזמן ובמקום הנכון. יכול להיות שחלק מהן יתבצעו מחוץ לשרשור הראשי, ב-service worker. למידע נוסף על פיצול משימות ארוכות, קראו את המאמר אופטימיזציה של משימות ארוכות ואת המאמר Idle Until Urgent של Phil Walton.

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