שיפור Cumulative Layout Shift (CLS) בקבוצת מדיה של Telegraph

בתוך כמה חודשים, אתר החדשות המוביל בבריטניה הצליח לשפר את הערך של CLS ב-75% מהפרמטר ה-percentile ל-250%, מ-0.25 ל-0.1.

האתגר של יציבות חזותית

שינויי פריסה יכולים להיות מאוד מפריעים. ב-Telegraph Media Group‏ (TMG) חשובה במיוחד יציבות חזותית, כי הקוראים משתמשים בעיקר באפליקציות שלנו כדי לצרוך את החדשות. אם הפריסה תשתנה בזמן קריאת מאמר, סביר להניח שהקורא יאבד את המקום שבו הוא עצר. זה יכול להיות חוויה מתסכלת ומסיחת דעת.

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

ב-TMG יש כמה צוותים שתורמים קוד מצד הלקוח:

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

יכול להיות שיהיה קשה לוודא שכל אחד מהצוותים האלה לא יגרום לשינויים קיצוניים בפריסה של הדף. בעזרת המדד Cumulative Layout Shift, שמודד את התדירות שבה הקוראים שלנו נתקלים בבעיה הזו, הצוותים קיבלו תובנות נוספות לגבי חוויית המשתמש בפועל ויעד ברור שאפשר לשאוף אליו. כתוצאה מכך, ערך ה-CLS ב-75% העליונים השתפר מ-0.25 ל-0.1, והאחוז של הבקשות שעברו את הבדיקה עלה מ-57% ל-72%.

250%

שיפור של אחוזון 75 ב-CLS

15%

יותר משתמשים עם ניקוד CLS גבוה

איפה התחלנו

בעזרת לוחות הבקרה של CrUX הצלחנו לקבוע שהדפים שלנו זזו יותר ממה שרצינו.

מרכז הבקרה של CrUX שבו מוצגים כ-55-60% ציונים טובים, 15% ציונים שדורשים שיפור ו-25% ציונים נמוכים.
הציונים שלנו במדד Cumulative Layout Shift (CLS) בין יוני 2020 לפברואר 2021.

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

איך מדדו את שינויי הפריסה

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

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

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

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

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

הפחתת שינויי הפריסה

התמקדנו בארבעה תחומים שבהם הצלחנו לצמצם את השינויים בפריסה: - מודעות - תמונות - כותרות - הטמעות

מודעות

המודעות נטענות אחרי הצביעה הראשונית באמצעות JavaScript. לחלק מהקונטיינרים שהם העלו לא היה גובה שמובטח להם.

אנימציה של אתר Telegraph. רשימת הסטוריז מוסטת למטה כשמודעה נטענת מעליה.
הבלוק 'עוד כתבות' שמתחת למודעה נע למטה אחרי שהמודעה נטענת.

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

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

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

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

בדקנו שוב את החריץ והתאמנו את הגובה שלו לגודל הנפוץ ביותר.

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

תמונות

הרבה מהתמונות באתר נטענות באיטרציה, והמקום שלהן שמור.

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

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

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

הוספת מאפייני הרוחב והגובה לתמונות פשוט מונעת את האפשרות שהפריסה תשתנה.

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

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

ALT_TEXT_HERE
הכותרת של הדף נטענת בצורה לא אלגנטית.

העברת הכותרת לחלק העליון של הרכיב אפשרה לדף להירטן בלי המעבר הזה.

ALT_TEXT_HERE
הכותרת של טעינת הדף כבר לא מפריעה לפריסת הדף.

הטמעות

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

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

מדידת ההשפעה

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

תרשים SpeedCurve שבו מוצגת ירידה חדה בציון CLS.
מעקב סינתטי אחר ההתקדמות ב-CLS באמצעות SpeedCurve

לאחר שהקוד יגיע לסביבת הייצור, נוכל לאמת את התוצאות בנתוני ה-RUM שלנו (שסופקו על ידי mPulse).

תרשים mPulse שבו מוצג ירידה בציון CLS.
אימות השיפורים ב-CLS בכל האתר באמצעות נתוני RUM של mPulse לפני ואחרי ביצוע השינויים.

בדיקת נתוני RUM מאפשרת לנו לדעת ברמה גבוהה של ביטחון שהשינויים שאנחנו מבצעים משפיעים באופן חיובי על הקוראים שלנו.

המספרים הסופיים שבדקנו הם של נתוני RUM ש-Google אוספת. זה רלוונטי במיוחד עכשיו, כי בקרוב יהיה להם השפעה על דירוג הדפים. קודם כול, השתמשנו בדוח חוויית המשתמש ב-Chrome, גם בנתונים החודשיים ברמת המקור שזמינים דרך מרכז הבקרה של CrUX, וגם על ידי שליחת שאילתה ל-BigQuery כדי לאחזר נתונים היסטוריים של p75. כך הצלחנו לראות בקלות שכל התנועה שנמדדת על ידי CrUX, השתפרה ב-250% במדד CLS ב-75% העליונים, מ-0.25 ל-0.1, והיקף הבקשות שעברו את הבדיקה גדל מ-57% ל-72%.

במרכז הבקרה של CrUX מוצג שהערך של CLS‏ p75 באתר telegraph.co.uk הוא 0.1.
תוצאות מלוח הבקרה של Crux.
ב-BigQuery מוצגים ערכים של p75 שמשתפרים מחודש לחודש, מ-0.25 ל-0.1.
הרצה של BigQuery שמוצגים בה ערכי p75 מ-2021 ועד היום.

בנוסף, הצלחנו להשתמש ב-API של דוח חוויית המשתמש ב-Chrome וליצור כמה מרכזי בקרה פנימיים שמחולקים לתבניות.

מרכז בקרה פנימי שבו מוצג ציון ממוצע טוב של 76.2, ציון 'דרוש שיפור' של 9.3 וציון 'איטי' של 14.6.
לוחות בקרה פנימיים שמשתמשים ב-API של דוח חוויית המשתמש של Chrome, ומדגישים את הציון הממוצע שלנו ואת הדפים עם הביצועים הגרועים ביותר באמצעות התבנית הזו.

הימנעות מנסיגות במדד CLS

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

מרכז בקרה של תקציב ביצועים שבו מוצגות בדיקות סינתטיות למדידת מדד CLS בחלק מהתבניות שלנו עם נפח תנועה גבוה. התקציב מוגדר כרגע ל-0.025.

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

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

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

סיכום

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

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