וורדפרס ואתרי אינטרנט

owl-158414_960_720
דורג 5 מתוך 5

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

lazy loading טעינה איטית

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

השיטה אומרת ככה בטעינה הראשונית לא להשים ב src של התמונה את הקישור האמיתי אלא בשדה נוסף שנקרא לו data-src

דוגמא :

<img src="blank.gif" class="lazy" data-src="/images/full-size.jpg" width="240" height="152">

ולאחר טעינת הדף להחליף את הקישור בקישור האמיתי.

/* lazyload.js (c) Lorenzo Giuliani
 * MIT License (http://www.opensource.org/licenses/mit-license.html)
 *
 * expects a list of:  
 * `<img src="blank.gif" data-src="my_image.png" width="600" height="400" class="lazy">`
 */

!function(window){
  var $q = function(q, res){
        if (document.querySelectorAll) {
          res = document.querySelectorAll(q);
        } else {
          var d=document
            , a=d.styleSheets[0] || d.createStyleSheet();
          a.addRule(q,'f:b');
          for(var l=d.all,b=0,c=[],f=l.length;b<f;b++)
            l[b].currentStyle.f && c.push(l[b]);

          a.removeRule(0);
          res = c;
        }
        return res;
      }
    , addEventListener = function(evt, fn){
        window.addEventListener
          ? this.addEventListener(evt, fn, false)
          : (window.attachEvent)
            ? this.attachEvent('on' + evt, fn)
            : this['on' + evt] = fn;
      }
    , _has = function(obj, key) {
        return Object.prototype.hasOwnProperty.call(obj, key);
      }
    ;

  function loadImage (el, fn) {
    var img = new Image()
      , src = el.getAttribute('data-src');
    img.onload = function() {
      if (!! el.parent)
        el.parent.replaceChild(img, el)
      else
        el.src = src;

      fn? fn() : null;
    }
    img.src = src;
  }

  function elementInViewport(el) {
    var rect = el.getBoundingClientRect()

    return (
       rect.top    >= 0
    && rect.left   >= 0
    && rect.top <= (window.innerHeight || document.documentElement.clientHeight)
    )
  }

    var images = new Array()
      , query = $q('img.lazy')
      , processScroll = function(){
          for (var i = 0; i < images.length; i++) {
            if (elementInViewport(images[i])) {
              loadImage(images[i], function () {
                images.splice(i, i);
              });
            }
          };
        }
      ;
    // Array.prototype.slice.call is not callable under our lovely IE8 
    for (var i = 0; i < query.length; i++) {
      images.push(query[i]);
    };

    processScroll();
    addEventListener('scroll',processScroll);

}(this);​

 

יש סקריפטים בשביל זה :

http://www.appelsiini.net/projects/lazyload

הסבר :

https://css-tricks.com/snippets/javascript/lazy-loading-images/

פלאגין של וורדפרס שעושה את זה :

https://wordpress.org/plugins/lazy-load/

 

שאלה שהרבה פעמים חוזרת על עצמה….

האם כאשר נשים אלמנט ב display:none זה ישפר את מהירות טעינת האתר?

תשובה : לא. עדיין התמונה תיטען, אולי זה יעזור ברינדור אבל זה זניח.

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

מנוע הHTML מפרסס את הHTML שבמסמך ובונה את הDOM. לאחר מכן נכנס מנוע הJS לפעולה ומפרסס את קוד הJS שבמסמך. בסוף נכנס מנוע הCSS, מפרסס את קוד CSS שבמסמך, ומרנדר אותו על המסך. במילים אחרות, מנוע הCSS עובר על כל הגדרות הCSS שקיימות במסמך, משייך כל הגדרה לאלמנט המתאים במסמך, ועושה עוד דברים אחרים. בסוף התהליך המנוע מחשב איפה למקם כל אלמנט על המסך ומצייר אותו במיקום הנבחר (מרנדר).

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

עכשיו בוא ניקח את השאלה שלך וניישם על דוגמא קיצונית: נעשה display: none; על אלמנט הbody, כך שלמעשה אנחנו נסתיר את גוף המסמך.

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

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

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

ניתן לבדוק את מהירות טעינת האתר ע"י כלי של גוגל

https://developers.google.com/speed/pagespeed/insights/

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

תפריט נגישות