Производительность jQuery. Практические советы.

В этой статье рассматривается ряд практических советов по производительности jQuery и javascript. Многие советы основаны на презентации jQuery Anti-Patterns for Performance (автор Paul Irish).

Кешируйте length при обращении в цикле

В цикле for не обращайтесь каждый раз к свойству массива length, лучше сохранить его в переменную перед началом цикла.

var myLength = myArray.length;

for (var i = 0; i < myLength; i++) {
    // do stuff
}

Добавляйте новый контент вне цикла

Работа с DOM очень сильно сказывается на производительности, поэтому если вы добавляете много элементов к DOM, то лучше сделать это сразу за один вызов.

// плохой код
$.each(myArray, function(i, item) {
   var newListItem = '<li>' + item + '</li>';
   $('#ballers').append(newListItem);
});
// лучше сделать так:
var frag = document.createDocumentFragment();

$.each(myArray, function(i, item) {
    var newListItem = '<li>' + item + '</li>';
    frag.appendChild(newListItem);
});
$('#ballers')[0].appendChild(frag);
// или так:
var myHtml = '';

$.each(myArray, function(i, item) {
    html += '<li>' + item + '</li>';
});
$('#ballers').html(myHtml);

Будьте осторожны с анонимными функциями

Очень частое использование анонимных функций может вызвать проблемы. Их сложно отлаживать, поддерживать, тестировать или повторно использовать. Лучше давать имена вашим объектам, обработчикам и callback функциям.

// плохо
$(document).ready(function() {
    $('#magic').click(function(e) {
        $('#yayeffects').slideUp(function() {
            // ...
        });
    });

    $('#happiness').load(url + ' #unicorns', function() {
        // ...
    });
});
// лучше
var PI = {
    onReady : function() {
        $('#magic').click(PI.candyMtn);
        $('#happiness').load(PI.url + ' #unicorns', PI.unicornCb);
    },

    candyMtn : function(e) {
        $('#yayeffects').slideUp(PI.slideCb);
    },

    slideCb : function() { ... },
  
    unicornCb : function() { ... }
};

$(document).ready(PI.onReady);

Оптимизация селекторов

Оптимизация селекторов является менее важной задачей, чем это было раньше, поскольку большинство браузеров реализует метод document.querySelectorAll() и проблема выборки от jQuery переходит к браузерам. Однако есть несколько советов, которые следует иметь в виду.

Выборки по ID

Всегда хорошо начинать описание селектора с ID.

// работает быстро
$('#container div.robotarm');

// работает супер-быстро
$('#container').find('div.robotarm');

Подход, в котором используется $.fn.find, работает быстрее, – выборки только по ID обрабатываются с помощью метода document.getElementById(), который работает очень быстро – поскольку это native метод браузера.

Читайте также: