Website development
JavaScript
Client optimization
jQuery
August 2018 7

Вариант миграции с JQuery на чистый Javascript

Библиотека JQuery была создана в 2006 году для восполнения недостающей функциональности Javascript. С тех пор последний достаточно продвинулся в своем развитии, чтобы разработчики могли обходиться без JQuery, основная проблема которой — производительность.



На Хабре было несколько статей с объективными замерами «тормознутости» JQuery на селекторных запросах.
// jQuery 2.0
var c = $("#comments .comment");
4,649 ms
// jQuery 2.0 
var c = $(".comment");
3,437 ms
// native querySelectorAll
var c = document.querySelectorAll("#comments .comment");
1,362 ms
// native querySelectorAll
var c = document.querySelectorAll(".comment");
1,168 ms
// native getElementById / getElementsByClassName
var n = document.getElementById("comments"); 
var c = n.getElementsByClassName("comment");
107 ms
// native getElementsByClassName
var c = document.getElementsByClassName("comment");
75 ms
(запуск в цикле по 10000 раз)

В сети достаточно много хороших описаний аналогов JQuery функций на чистом Javascript-e — например, вот здесь.

Но самая мощь JQuery — в лаконичности и красоте ее выражений. Даже психологически тяжело переписывать существующий код, меняя элегантные $() на многострочные конструкции.

Попробуем, насколько возможно, оставить язык JQuery, [частично] заменив ее саму. Для этого нам нужно только или переопределить $() функцию, или заменить (что лучше) на свою — пусть это будет $jqr(). Она также будет возвращать объект, но уже «нативный» и не обремененный ненужными нам JQuery функциями.

Пример кода:

<html>
    <body>
        <p id="message"></p>
    </body>
</html>

JQuery код:

$("#message").html("Hello world!");

Меняется на:


$jqr("#message").html("Hello world!");


// JQuery Replacement
function $jqr(sel) {
    return new JQR(sel);
}

class JQR {
    constructor(sel) {
        this.sel = sel;
        this.elements = document.querySelectorAll(sel);
    }

    html(str) {
        for (var i = 0; i < this.elements.length; i++) {
            this.elements[i].innerHTML = str;
        }
    }
}

В конструкторе класса желательно парсить sel, чтобы более эффективно применять querySelectorAll(), getElementsByClassName() и getElementById().

Таким образом мы можем реализовывать в классе JQR только нужные нам функции, не выходя за рамки стандартного Javascript-а и не сильно трогая существующий код.

Необязательно даже полностью избавляться от JQuery — частичная оптимизация уже даст результат.
-5
5.8k 27
Comments 78
Top of the day