24.01.2014

Оптимизация кода на jQuery. Часть I.

О чем это всё?

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

С чего начинается
оптимизация кода?

Рассмотрим пример

			<script>
			   $el.show();
			</script>
		

Расставляем таймеры

			<script>
			   console.time("jquery.fn.show");
			   $el.show();
			   console.timeEnd("jquery.fn.show");
			</script>
		

Профилируем

			<script>
			   console.profile();
			   $el.show();
			   console.profileEnd();
			</script>
		
Первый: 0.993ms, 12 calls
Второй: 0.073ms, 11 calls

12 — это win!

Почему так происхоит?

Почему так происхоит?

Так как jQuery рассчитан на «все случаи жизни» то, чтобы отобразить элементы, ему нужно понять, какой display выставить. Для этого, внутри себя он вызывает функцию showHide(elements, true) которая пытается определить display элемента:
			var display = jQuery._data( elem, "olddisplay" );
			if ( elem.style.display === "" && isHidden( elem ) ) {
			    display = css_defaultDisplay(elem.nodeName);
			    jQuery._data( elem, "olddisplay", display );
			}
		

Почему так происхоит?

Первый вызов:

Что можно сделать?

Что можно сделать?

  1. Скрываем элементы только через style="display: none"
			jQuery.fn.display = function (value){
			  var i = this.length, el;
			  value = typeof value === "string" ? value
			            : (value ? "" : "none");
			  while( i-- ){
			    el = this[i];
			    el.style && (el.style.display = value);
			  }
			  return this;
			};
		

jQuery.fn.display: используем

			<script>
			   console.profile();
			   $el.display(true);
			   console.profileEnd();
			</script>
		

data-аттрибуты

data-аттрибуты

Если вы хотите работать именно с data-аттрибутами, лучше отказаться от $el.data("name").

jQuery.fn.dataset (gist)

			jQuery.fn.dataset = function (data, value){
			    // Реализация на основе dataset
			    // и getAttribute
			};
		

Что ещё?

Ещё

  • $.fn.html → $.fn.innerHTML
  • Использовать быстрый $.event.fix.js
  • $.fn.addClass/removeClass — заменяем на classList реализацию
  • Подменяем $.fn.find на querySelectorAll для простых селекторов

The End

Помимо увелечения производительности кода, вы сокращаете кол-во вызов, уменьшая «шум» при профилировании, а так же при запуске debugger.

github.com/RubaXa
@ibnRubaXa