תאריך פרסום: 14 במאי 2025
Compression Dictionary Transport הוא תקן חדש שמאפשר לנו לדחוס תוכן חוזר בבקשות שונות. הוא שוחרר ב-Chrome 130 בסוף שנת 2024. הטכנולוגיה החדשה הזו הוכנסה לחיפוש Google, והיא הביאה לשיפורים משמעותיים.
ההזדמנות
יש הרבה תוכן כפול בדפי האינטרנט שבהם אנחנו מבקרים. דפים רבים באותו אתר מורכבים מחלקים גדולים של אותו קוד – בין אם מדובר ב-HTML, ב-CSS או ב-JavaScript, כאשר רק התוכן בין כל הקוד הזה משתנה. כל תוצאה היא שילוב ייחודי של מאות תכונות שמניב תוכן ייחודי לחלוטין, אבל עדיין יש הרבה תכונות משותפות בקוד שנשלח לדפדפן כדי ליצור אותן.
מבחינה חזותית, רוב דפי תוצאות החיפוש דומים זה לזה, ללא קשר למונח החיפוש שהוזן: בחלק העליון מופיעים הלוגו של Google, סרגל החיפוש ואמצעי בקרה מסוימים. באמצע יש כמה כרטיסיות לסוג החיפוש, ואז רשימה של תוצאות החיפוש בצד ימין, עם ווידג'טים שונים שיעזרו למשתמש, והקשר נוסף בצד שמאל עם חלוניות 'מידע על':
לבסוף, בתחתית הדף מופיעות אפשרויות החלוקה לדפים והכותרת התחתונה הרגילה. זהו רק מה שגלוי לעין – מאחורי הקלעים יש הרבה קוד (HTML, CSS ו-JavaScript) שדרוש כדי ליצור את הדף הזה. חלק גדול מהקוד הזה מוטמע ישירות ב-HTML של הדף כחלק מאופטימיזציית הביצועים. אמנם האפשרות הזו מאפשרת טעינה מהירה יותר של הדף, אבל היא כרוכה בעלות של אי-שיתוף הקוד הזה בין דפי תוצאות שונים – כמו שאפשר לעשות עם משאב שמאוחסן במטמון חיצוני.
דחיסה באינטרנט
דחיסה היא טכנולוגיה שמשמשת באינטרנט. דחיסת משאבים באמצעות gzip או אלגוריתמים חדשים יותר כמו Brotli או Zstandard מאפשרת להימנע מהחזרה על עצמה בקובץ באמצעות דחיסה ללא אובדן נתונים, כדי לארוז את כל המידע בצורה הכי צפופה שאפשר בשרת לפני השליחה. לאחר מכן הדפדפן יכול לפרוס את הבייטים הדחוסים כדי לשחזר את התוכן המקורי. בתמונות, דחיסת נתונים עם אובדן נתונים מספקת יתרונות דומים על ידי הסרת בייטים מיותרים שעשויים להיות שונים באופן לא מורגש למשתמשים.
עד לאחרונה, הדחיסה באינטרנט הייתה מוגבלת לדחיסה בתוך משאבים. לא ניתן היה לדחוס משאבים שונים, ובטח שלא דפים שונים. זוהי מגבלה שידועה כבר זמן רב, והנדסי אינטרנט ניסו לתקן אותה.
העברה של מילון דחיסה מצילה את המצב!
Compression Dictionary Transport הוא תקן חדש שמאפשר דחיסה בכל המשאבים באמצעות 'מילונים' משותפים שמאפשרים להחליף סדרות נפוצות של בייטים בהפניות מהמילון המשותף הזה.
אלגוריתמים מודרניים לדחיסה, כמו Brotli ו-Zstandard, תומכים בשימוש במילונים של מונחים נפוצים שמאפשרים דחיסה טובה יותר על ידי החלפת המונחים האלה בהפניה קטנה יותר למילון. אפילו יש ב-Brotli מילון מובנה של מונחים נפוצים באינטרנט. התכונה 'העברה של מילון דחיסה' מתבססת על כך ומספקת דרכים לשרת ולדפדפן לשתף מילונים מותאמים אישית.
מילונים מותאמים אישית יכולים להיות משאב שכבר נעשה בו שימוש באתר. לדוגמה, אפשר להשתמש ב-app.v1.js כמילון בזמן ההורדה של app.v2.js, כדי להוריד בעיקר את ההבדל (המכונה לרוב 'דחיסת דלתא'). לחלופין, אפשר לציין משאב מילון נפרד באמצעות תג <link rel="compression-dictionary"> (או כותרת HTTP Link מקבילה).
כך אפשר להקטין באופן משמעותי את גודל ההורדה של משאבים עם הרבה תוכן או קוד משותפים, כמו דפי תוצאות החיפוש שצוינו למעלה.
השימוש של חיפוש Google במילונים דחוסים
צוות חיפוש Google תמיד מחפש דרכים לשפר את הביצועים של החיפוש. הם היו מהראשונים שהשתמשו במילונים לדחיסת נתונים, כי הם זיהו את הפוטנציאל של הטכנולוגיה הזו.
בחיפוש Google נעשה שימוש בלחץ Brotli משותף בדפי התוצאות, באמצעות קובץ מילון נפרד שנוצר מדגימה מייצגת של תוצאות חיפוש. צינור עיבוד נתונים (pipeline) אוטומטי חזק מבטיח שהמילון יישאר עדכני, תוך התאמה לתוכן של מודעות ה-SRP שמשתנה לעיתים קרובות ומתפרסם כמה פעמים ביום. אפשר להשתמש בכלי הפיתוח כדי לראות בדיוק איך זה עובד.
כשלקוח טוען בפעם הראשונה דף של תוצאות חיפוש, השרת מספק קישור למילון באמצעות כותרת ה-HTTP Link: עם סוג rel=compression-dictionary:
Link בכרטיסייה 'רשת'אם הלקוח תומך בדחיסת מילון Brotli, אבל עדיין לא שמר במטמון את המילון המשותף, הדפדפן יוריד את המילון הזה במהלך זמן ההמתנה. תגובת המילון כוללת את כותרת התגובה Use-As-Dictionary, שמציינת לדפדפן לאילו משאבים הוא יכול להשתמש במילון הזה:
Use-As-Dictionary בכרטיסייה 'רשת'במילון יתבצע שימוש בסמינטיקה רגילה של cache-control, והוא יהיה זמין לכל המשאבים שתואמים לכללים שהוגדרו בכותרת הזו – בדוגמה הזו, דפים שהתחילו ב-/search.
בדפים עתידיים של תוצאות חיפוש, הדפדפן יכול להודיע לשרת שיש לו מילון באמצעות כותרת הבקשה Available-Dictionary של HTTP. כשמטענים מחדש את הדף, אפשר לראות את זה בפעולה:
Available-Dictionary בכרטיסייה 'רשת'כשתיבת הסימון שימור היומן מופעלת ומתבצע סינון, אפשר להשוות בין שתי התשובות:
בדוגמה הזו, הבקשה הראשונה היא התגובה המלאה בגודל 107KB, והיא משתמשת בדחיסת Brotli (br). לעומת זאת, בקשת הטעינה מחדש השנייה היא כמעט חצי מהגודל, 60KB, והיא משתמשת בדחיסת Brotli דחוסה במילון (dcb), וכתוצאה מכך זמן ההורדה מהיר יותר.
בדפדפן Chrome, אפשר להציג את הדף chrome://net-internals/#sharedDictionary כדי לראות את המילונים המשותפים ולנקות אותם אם רוצים לחזור על הדוגמה הזו מההתחלה.
#sharedDictionary של Net-Internalsהתוצאות
השינוי הוצג למשתמשים בחיפוש Google באביב 2025, בהתחלה למשתמשים ב-Chrome. בעקבות זאת, הגודל הממוצע של עומס העבודה של HTML בכל משתמשי Chrome ירד ב-23% בהשוואה לדחיסת Brotli רגילה. הממוצע הכולל הזה כולל גם תוצאות חיפוש שלא עברה אותן דחיסה לפי מילון (לדוגמה, משתמשים בפעם הראשונה ללא מילון) וגם תוצאות חיפוש שהוגדרו להן דחיסה לפי מילון. בחיפוש עם דחיסת מילון, החיסכון גדול עוד יותר – כפי שראינו בשיפור של כמעט 50% בדוגמה הקודמת שבדקנו.
התוצאה הייתה שיפור של 1.7% במדד Largest Contentful Paint (LCP) באופן כללי, ועד 9% ברשתות עם זמן אחזור גבוה. אולי זה נראה לכם קטן, אבל חיפוש Google הוא אתר שעברו אופטימיזציה ברמה גבוהה מאוד, ולכן שיפורים בסדר גודל כזה הם משמעותיים מאוד. באתרים אחרים יכול להיות שיחולו שיפורים גדולים יותר בעזרת הטכנולוגיה הזו.
כדאי לנסות את התכונה באתר שלכם.
אפשר להשתמש בהעברה של מילון דחיסה בכל הדפדפנים המבוססים על Chromium (Chrome, Edge, Opera וכו'). זוהי שיפור הדרגתי שדפדפנים שלא תומכים בו יתעלמו ממנו, אבל ככל שיהיו יותר דפדפנים שתומכים בו, כך גם הם יוכלו ליהנות מהיתרונות שלו.
האתגרים שהטכנולוגיה הזו מטפלת בהם הם רחוקים מלהיות ספציפיים לחיפוש Google. אתרים רבים יכולים להפיק תועלת מהעברה של מילון דחוס, בין אם עם מילון נפרד כמו זה שבו נעשה שימוש בחיפוש, ובין אם באמצעות שימוש במשאב קיים כמילון (למשל, הגרסה הקודמת של אפליקציה כשמשיקים גרסה חדשה).
במדריך ב-MDN מוסבר בהרחבה איך הטכנולוגיה הזו פועלת ואיך אפשר להטמיע אותה באתר.
כדי לעשות זאת, צריך לבצע הגדרות מסוימות בשרת או בתהליך ה-build כדי ליצור משאבים דחוסים שמבוססים על מילון ולספק אותם בהתאם – אבל התוצאות יכולות להיות מרשימות מאוד מבחינת הביצועים!