מסע לפתרון INP של ה-EEA

צמצום מספר ה-TBT פי 30 והמעבר ל-Next.js עזרו ל-The Ecomonic Times להפחית את מספר ה-INP כמעט פי ארבעה, מה שהוביל לירידה של 50% בשיעור העזיבה ולעלייה של 43% במספר הצפיות.

Daya Ram Yadav
Daya Ram Yadav
Saurabh Rajpal
Saurabh Rajpal

Interaction to Next Paint (INP) הוא מדד שמעריך את יכולת התגובה של האתר לקלט של משתמשים. תגובה טובה פירושה שהדף מגיב במהירות לאינטראקציות של משתמשים. ככל שה-INP של דף נמוך יותר, כך התגובה שלו לאינטראקציות של משתמשים טובה יותר.

ערכי INP תקינים הם 200 אלפיות שנייה או פחות, ערכים גרועים גדולים מ-500 אלפיות שנייה, וכל מה שביניהם טעון שיפור.

ההתחלה המעורפלת

כש-Google השיקה לראשונה את INP כמדד ניסיוני עם פוטנציאל להפוך לאחד ממדדי הליבה לבדיקת חוויית המשתמש באתר, הצוות של Economic Times לקח על עצמו את האתגר לתקן אותו לפני שהוא הופך לאחד, מאחר שיצירת חוויית משתמש ברמה עולמית היא קריטית לערכים העסקיים העיקריים שלנו.

עד כה, מדד INP הוא אחד מהמדדים הקשים ביותר לפתרון. בהתחלה לא היה ברור איך למדוד את ה-INP בצורה יעילה. הדבר הקשה ביותר היה היעדר תמיכה מהקהילה, כולל רוב הספקים של Real User Monitoring (RUM) שעדיין לא תומכים בו. עם זאת, היו לנו כלים של Google RUM כמו דוח חוויית המשתמש ב-Chrome (CrUX), ספריית JavaScript ב-web-vitals וכלים אחרים שתמכו בו, והכלים האלה סיפקו לנו מושג איפה עמדנו בזמן שחיקנו את הנתיב בתהליך. כשהתחלנו, מספר ה-INP שלנו היה קרוב ל-1,000 אלפיות השנייה ברמת המקור.

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

מהו TBT ואילו פעולות נקטנו כדי לשפר אותו?

TBT הוא מדד בשיעור Lab שמודד את הרספונסיביות של דף אינטרנט לקלט של משתמש במהלך טעינת הדף. כל משימה שמתבצעת יותר מ-50 אלפיות השנייה נחשבת למשימה ארוכה, והזמן אחרי הסף של 50 אלפיות השנייה נקרא זמן החסימה.

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

  • משימה א' נמשכת 80 אלפיות השנייה (30 אלפיות השנייה יותר מ-50 אלפיות השנייה).
  • משימה ב' נמשכת 100 אלפיות השנייה (50 אלפיות השנייה יותר מ-50 אלפיות השנייה).

גודל ה-TBT של הדף יהיה 80 אלפיות השנייה (30 + 50). ככל שה-TBT נמוך יותר, כך טוב יותר, ו-TBT משתלב היטב עם INP.

הנה השוואה מהירה במעבדה של ה-TBT לפני ואחרי שנקטנו פעולות לשיפור:

תמונה מורכבת של משימות ארוכות במהלך ההפעלה כפי שהיא מוצגת בחלונית הביצועים של כלי הפיתוח ל-Chrome, ודוח של מדדי הדף. ה-thread הראשי חסום במהלך טעינת הדף למשך 3,260 אלפיות השנייה.
ה-thread הראשי במהלך ההפעלה לפני האופטימיזציה של TBT. מספר ה-TBT הוא 3,260 אלפיות השנייה.
תמונה מורכבת של משימות ארוכות במהלך ההפעלה כפי שהיא מוצגת בחלונית הביצועים של כלי הפיתוח ל-Chrome, ודוח של מדדי הדף. ה-thread הראשי חסום במהלך טעינת הדף למשך 120 אלפיות השנייה.
ה-thread הראשי במהלך ההפעלה אחרי האופטימיזציה של TBT. מספר ה-TBT הוא 120 אלפיות השנייה.

צמצום העבודה על ה-thread הראשי

ה-thread הראשי של הדפדפן מטפל בכל מה שקשור לניתוח HTML, בניית ה-DOM, ניתוח CSS והחלת סגנונות, ועד הערכה וביצוע של JavaScript. ה-thread הראשי מטפל גם באינטראקציות של המשתמשים – כלומר, לחיצה, הקשה והקשות. אם ב-thread הראשי יש פעילות אחרת, יכול להיות שהוא לא יגיב בצורה יעילה לקלט של משתמשים וזה עלול להוביל לחוויית משתמש גרועה.

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

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

if ('requestIdleCallback' in window) {
  this.requestIdleCallbackId = requestIdleCallback(fetchMarketsData.bind(this), {timeout: 3000});
} else {
  fetchMarketsData(); // Fallback in case requestIdleCallback is not supported
}

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

קיצור זמן ההערכה של הסקריפט

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

צילום מסך של הכלי 'כיסוי' בכלי הפיתוח ל-Chrome. כאן, הכלי מציג חלקים שלא נמצאים בשימוש של קובצי JavaScript ו-CSS במהלך טעינת הדף.

הקטנת גודל ה-DOM

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

צילום מסך של בדיקת גודל ה-DOM ב-Lighthouse. מספר רכיבי ה-DOM שדווחו הוא 2,706 רכיבים.

צמצמנו את מספר צומתי DOM בשתי דרכים:

  • בשלב הראשון, עיבדנו את האפשרויות בתפריט לפי בקשת המשתמש (בלחיצה). הוא הקטין את גודל ה-DOM בכ-1,200 צמתים.
  • שנית, טעינה עצלה של ווידג'טים פחות חשובים.

עקב כל המאמצים האלה, צמצמנו באופן משמעותי את הצפייה ב-TBT, וה-INP שלנו ירד בהתאם בכמעט 50%:

צילום מסך של ביקורת INP ב-CrUX. ערך ה-INP של הדף הוא 539 אלפיות השנייה, והוא חורג מהסף 'חלש'.

בשלב הזה כמעט אזלו לנו הזכיות הקלות כדי לצמצם עוד יותר את TBT (ואת ה-INP דרך שרת proxy), אבל ידענו שיש לנו הרבה מקום לשיפור. זה השלב שבו החלטנו לשדרג את התבנית המבוצרת בהתאמה אישית לממשק המשתמש שלנו לגרסה האחרונה של React יחד עם Next.js, כדי לעשות שימוש טוב יותר ב-hooks כדי להימנע מעיבוד מחדש של רכיבים.

עקב עדכונים תכופים יותר ותנועה קטנה יחסית בהשוואה לחלקים אחרים באתר, התחלנו להעביר את דפי הנושא שלנו ל-Next.js. כמו כן, השתמשנו ב-PartyTown כדי להסיר מעובדי האינטרנט עבודה רבה ב-thread הראשי, יחד עם שיטות כמו requestIdleCallBack לדחיית משימות לא קריטיות.

איך שיפור INP סייע ל-The Economic Times?

TBT ו-INP נוכחיים במקור

כשפורסם הפוסט הזה, מספר ה-TBT של המקור שלנו היה 120 אלפיות השנייה, פחות מ-3,260 אלפיות השנייה כשהתחלנו במאמצי האופטימיזציה שלנו. באופן דומה, משך זמן ה-INP של המקור שלנו היה 257 אלפיות השנייה לאחר מאמצי האופטימיזציה, פחות מ-1,000 אלפיות השנייה.

צילום מסך של ביקורת INP ב-CrUX. ערך ה-INP של הדף הוא 257 אלפיות השנייה, בטווח של 'נדרש שיפור'.

מגמת INP CrUX

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

צילום מסך של ההתפלגות של INP כפי שמוצג ב-CrUX בתקופה של ארבעה חודשים, החל מיולי 2022 ומסתיים באוקטובר 2022. הערכים בתוך הסף 'חלש' ו 'דרוש שיפור' ירדו במידה מסוימת, בעוד שהערכים בטווח 'טוב' עלו.

ניתוח TBT של Akamai mPulse

אנחנו משתמשים ב-Akamai mPulse כפתרון RUM, למדידת TBT בשטח. ראינו ירידה עקבית ב-TBT, תוך מיפוי ברור לתוצאות המאמצים שלנו לצמצם את היקף ה-INP. כפי שאפשר לראות בצילום המסך שבהמשך, ערכי ה-TBT צנחו בסופו של דבר מכ-5 שניות לכ-200 אלפיות השנייה בשדה.

צילום מסך של תרשים ב-Akamai mPulse שבו רואים ירידה ב-TBT במהלך כחודש.

תוצאה עסקית

באופן כללי, המאמצים שלנו לצמצם את מספר ה-TBT ב-30 פעמים, יחד עם המעבר ל-Next.js, עזרו לנו להפחית את מדד ה-INP כמעט פי 4, ובסופו של דבר הובילו לירידה של 50% בשיעור העזיבה ולעלייה של 43% במספר הצפיות בדפים בדפי נושאים.

צילום מסך של Google Analytics שמשווה בין צפיות בדף לבין שיעור העזיבה. בזכות האופטימיזציות שבוצעו ב-INP באתר Economic Times, הייתה ירידה של 50% בשיעור העזיבה ועלייה של 43% במספר הצפיות בדפים.

סיכום

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