חיפוש ]

עיכוב פריסת Javascript לסרטוני YouTube

עיכוב פריסת Javascript, במילים אחרות Defer parsing of Javascript, היא אחת מההודעות שאתם מקבלים כאשר בודקים את מהירות האתר בכלים כמו GTmetrix ו-Pingdom.

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

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

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

ההערה העיקרית הייתה Defer Parsing of Javascript כאשר שלושה מאותם סקריפטים שהוצגו כבעיתיים היו סקריפטים של youtube.com. הנה ההערה שקיבלתי ב GTmetrix:

לעכב פריסת Javascript YouTube

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

כיצד לעכב פריסת Javascript לסרטוני יוטיוב?

בואו נסביר כיצד לפתור הערה זו. כאשר אתם מטמיעים וידאו בוורדפרס על ידי העתקת כתובת (URL) הוידאו מ-YouTube או Vimeo, וורדפרס מייצרת <iframe> עבור אותו וידאו.

זהו בעצם אותו <iframe> שתקבלו אם תעתיקו את קוד ה-embed ישירות מיוטיוב.

אז במקום להשתמש בכתובת ה URL בכדי להטמיע את הוידאו, גשו ליוטיוב והעתיקו את קוד ה embed בצורה הבאה:

  • תחת הוידאו לחצו על ״שתף״.
  • לחצו על ״הטמע״ שיופיע מתחתיו.
  • בצעו שינויים באפשרויות ההטמעה אם יש צורך.
  • העתיקו את קוד ה embed המתחיל ב …iframe width>

לאחר מכן גשו לאתר שלכם והדביקו את קוד ה <iframe> היכן שאתם מעוניינים להציג את הוידאו. השלב הבא יהיה לשנות מעט קוד זה:

  • מצאו את החלק src="https://www.youtube.com ושנו את src ל data-src.
  • הוסיפו פרמטר ריק בשם ""=src. זה בסופו של דבר יכיל את הכתובת הנמצאית בפרמטר data-src שזה עתה הוספנו.

בסופו של דבר קוד ה <iframe> שלכם ייראה בסגנון הבא:

<iframe width="560" height="315" src="" data-src="https://www.youtube.com/embed/123456789" loading="lazy" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen style="border:0"></iframe>

נגרום לוידאו להטען לאחר שהעמוד נטען בעזרת Javascript

ה <iframe> שכרגע יצרנו לא יטען את הוידאו כראוי. נוסיף מעט Javascript על מנת לטעון אותו רק לאחר שהעמוד נטען במלואו.

function init() {
  const iframes = document.querySelectorAll('iframe[data-src]');
  iframes.forEach((iframe) => {
    iframe.setAttribute('src', iframe.getAttribute('data-src'));
  });
}
window.addEventListener('load', init);

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

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

אם אינכם יודעים כיצד להוסיף Javascript לאתר, תנו מבט בפוסט הוספת נכסים (קבצי Javascript ו- CSS) בוורדפרס.

לפני עיכוב פריסת Javascript לוידאו:

GTmetrix score before defering video

לאחר עיכוב פריסת Javascript לוידאו:

GTmetrix score after defering video

שימו לב כי הציון, מספר הקריאות לשרת, כמו גם גודל העמוד השתפרו בצורה משמעותית. הציון תחת Defer parsing of Javascript קפץ מ F ל A ואותן הערות שהצגנו בתחילת הפוסט עבור סעיף זה נעלמו.

שיקולים נוספים

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

נציין שקוד זה ישפיע אך ורק על אלמנטים מסוג <iframe> להם קיים הפרמטר data-src כך שאינכם צריכים לדאוג שקוד זה ישפיע על וידאו אחר באתר שלכם שאינו מכיל פרמטר זה.

עוד דרך לשיפור זמן הטעינה של וידאו יוטיוב המוטמע באתר שלכם היא תבנית ה-Facade, המוסברת בפוסט שיפור זמן הטעינה של Embedded Videos עם Lite YouTube.

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

תכונת loading="lazy" המובנית

דפדפנים מודרניים תומכים בתכונת loading="lazy" מובנית עבור iframes. הוספת תכונה זו אומרת לדפדפן לדחות את טעינת ה-iframe עד שהוא קרוב לחלון התצוגה:

<iframe src="https://www.youtube.com/embed/123456789" loading="lazy" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen style="border:0"></iframe>

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

לביצועים הטובים ביותר, שלבו loading="lazy" עם טכניקת ה-data-src שהוצגה למעלה. תכונת lazy מטפלת בסרטונים מתחת לקו הקיפול, בעוד גישת data-src מטפלת בסרטונים מעל קו הקיפול שצריכים להיטען רק לאחר שהעמוד מוכן.

תבנית ה-Facade – חלופה מודרנית

הגישה היעילה ביותר להטמעת יוטיוב היא תבנית ה-Facade. במקום לטעון את נגן היוטיוב המלא, מוצג placeholder קל משקל (רק תמונת התצוגה המקדימה של הסרטון) והנגן בפועל נטען רק כשהמשתמש לוחץ על Play.

זה מה שספריות כמו lite-youtube-embed עושות. הן נטענות מהר פי 224 בערך מהטמעות יוטיוב רגילות מכיוון שהטעינה הראשונית היא רק תמונה סטטית ומעט CSS.

כלי Lighthouse של גוגל ממליץ ספציפית על גישה זו תחת הביקורת "Lazy load third-party resources with facades". למדריך יישום מפורט, ראו את הפוסט שלנו על שיפור זמן הטעינה של Embedded Videos עם Lite YouTube.

השפעה על Core Web Vitals

הטמעת יוטיוב רגילה טוענת מספר סקריפטים, גליונות סגנון ומשאבים נוספים גם כשהמשתמש לעולם לא מפעיל את הסרטון. זה משפיע ישירות על Core Web Vitals:

  • LCP (Largest Contentful Paint) – הסקריפטים של יוטיוב חוסמים את ה-Main Thread ומעכבים את הרינדור של אלמנט התוכן הגדול ביותר.
  • INP (Interaction to Next Paint) – ה-JavaScript הנוסף מגדיל את עומס ה-Main Thread, מה שהופך את העמוד לפחות מגיב לאינטראקציות המשתמש.
  • משקל העמוד – הטמעת יוטיוב בודדת מוסיפה כ-800KB לגודל העמוד.

דחיית ההטמעה או החלפתה ב-Facade מבטלת עומס זה לחלוטין עד שהמשתמש באמת צריך את הסרטון.

שאלות נפוצות

שאלות נפוצות בנושא עיכוב JavaScript של יוטיוב:

האם עיכוב JavaScript של יוטיוב משפיע על מראה הסרטון?
עם טכניקת data-src, אזור הסרטון יופיע ריק עד שהעמוד מסיים להיטען, ואז נגן היוטיוב יופיע כרגיל. עם תבנית ה-Facade, תמונת תצוגה מקדימה מוצגת מיד, והנגן המלא נטען רק כשהמשתמש לוחץ על Play. שתי הגישות מביאות לסרטון פונקציונלי לחלוטין לאחר הטעינה.
מה ההבדל בין loading="lazy" לטכניקת data-src?
תכונת loading="lazy" היא תכונה מובנית בדפדפן שדוחה את טעינת ה-iframe עד שהוא קרוב לחלון התצוגה. טכניקת data-src מונעת מה-iframe להיטען בכלל עד שהעמוד סיים להיטען. לסרטונים מעל קו הקיפול, טכניקת data-src או תבנית Facade יעילה יותר. לסרטונים מתחת לקו הקיפול, loading="lazy" לבד עשוי להספיק.
האם טכניקה זו עובדת עם Vimeo או פלטפורמות וידאו אחרות?
כן. טכניקת data-src עובדת עם כל הטמעה מבוססת iframe, כולל Vimeo, Dailymotion ופלטפורמות וידאו אחרות. קוד ה-JavaScript מכוון לכל ה-iframes עם תכונת data-src ללא קשר לכתובת המקור. ספריות תבנית Facade, לעומת זאת, הן בדרך כלל ספציפיות לפלטפורמה.
כמה הטמעת יוטיוב משפיעה על מהירות העמוד?
הטמעת יוטיוב רגילה בודדת מוסיפה כ-800KB לעמוד וטוענת מספר סקריפטים מ-youtube.com. זה יכול להשפיע משמעותית על Largest Contentful Paint (LCP) ו-Interaction to Next Paint (INP). דחייה או שימוש ב-Facade יכולים להפחית השפעה ראשונית זו כמעט לאפס.
האם להשתמש בטכניקת data-src או בתבנית Facade?
תבנית ה-Facade היא הגישה המומלצת לביצועים הטובים ביותר. היא מציגה תמונת תצוגה מקדימה מיד וטוענת את נגן היוטיוב רק בלחיצה. טכניקת data-src פשוטה יותר ליישום ואינה דורשת ספריות נוספות. בחרו בתבנית Facade לביצועים מקסימליים ובטכניקת data-src לפשטות.
האם WP Rocket מטפל בדחיית יוטיוב באופן אוטומטי?
WP Rocket כולל תכונת "LazyLoad for iframes and videos" שמחליפה אוטומטית הטמעות יוטיוב בתמונת תצוגה מקדימה. כשמופעלת, היא עובדת בדומה לתבנית Facade ללא צורך בשינויי קוד ידניים. אם אתם משתמשים ב-WP Rocket, הפעילו אפשרות זו בקטע Media של הגדרות התוסף.

סיכום

עיכוב JavaScript לסרטוני יוטיוב חיוני לשמירה על ביצועי עמוד טובים. הגישה הפשוטה ביותר היא טכניקת data-src בשילוב עם loading="lazy", שדוחה את הטעינה עד שהעמוד מוכן.

לביצועים מקסימליים, מומלצת תבנית ה-Facade באמצעות ספריות כמו lite-youtube-embed, שטוענת רק תמונת תצוגה מקדימה סטטית עד שהמשתמש לוחץ על Play. בכל שיטה שתבחרו, ההשפעה על Core Web Vitals משמעותית – הפחתת משקל העמוד במאות קילובייטים ושחרור ה-Main Thread לרינדור מהיר יותר.

דיון ותגובות
7 תגובות  ]
  • איגור 28 אוגוסט 2018, 22:35

    עבד מעולה 🙂

  • ‫אליחי 16 ספטמבר 2018, 12:08

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

    • רועי יוסף 6 אוקטובר 2018, 21:36

      תודה על הטיפ אליחי 🙂

    • עידו 8 יולי 2019, 19:38

      משתמש בזה, כמה אפשרויות נוספות:

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

  • בני 12 יולי 2019, 0:05

    גרסת jQuery:

    jQuery(function($){
    	$(window).load(function(){
    		$('IFRAME[data-src]').each(function(index, elmFR) {
    			$(elmFR).attr('src', $(elmFR).attr('data-src'));
    		});		
    	})
    });

השאירו תגובה

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

Savvy WordPress Development official logo