Цель написания этой статьи, с одной стороны, познакомить с написанной мной модульной DOM-библиотекой domq.js, с другой стороны, я надеюсь, что у всех есть правильное понимание jQuery, даже если jQuery постепенно вышла из исторической стадии, его API будет существовать в другой форме.
Гитхаб:github.com/nzbin/domq
Документация:С юга на Bin.git books.IO/Dom Please-API/US…
jquery не умирает
От отказа GitHub от jQuery до объявления об удалении jQuery из Bootstrap 5 кажется, что эра наконец подходит к концу.
Зачем нам отказываться от jQuery? Причины не более чем следующие: нет необходимости в совместимости с браузером, собственный поиск в DOM уже очень удобен, есть лучшие альтернативы для запросов AJAX и так далее.
На мой взгляд, самый большой недостаток jQuery в том, что его нельзя внедрить в модули, напрямую импортировать всю библиотеку нецелесообразно, ведь слишком много функций бесполезны. Но манипулирование DOM с помощью jQuery по-прежнему необходимо. Многие люди сомневаются в моей точке зрения. На самом деле при использовании фреймворка MVVM операций с DOM действительно очень мало. Но мы не всегда можем выполнять некоторые функции CRUD. Некоторые манипуляции с DOM по-прежнему необходимы для сложных бизнес-требований.
Если jQuery может отделить функциональные модули, связанные с манипулированием DOM, все еще может быть много места для использования.
туземное господство
В обычных проектах все больше и больше людей предпочитают использовать собственный JS для управления объектами, например, для получения атрибутов элементов, ширины и высоты, позиционирования и так далее.
Еще несколько лет назад на github было много статей о том, как заменить jQuery на нативный JS, напримерYouDontNeedJQuery,YouMightNotNeedjQueryЖдать. Насколько я понимаю, чистые операции JS действительно просты, но не очень элегантны, а более сложные операции часто обращаются к MDN.
// jQuery
$('.my #awesome selector');
// JS
document.querySelectorAll('.my #awesome selector');
// jQuery
$(el).hide();
// JS
el.style.display = 'none';
// jQuery
$(el).after(htmlString);
// JS
el.insertAdjacentHTML('afterend', htmlString);
Выше приведено сравнение jQuery и нативного JS в микромире.Результат очевиден, API jQuery более лаконичен. Кроме того, использование API jQuery также очень единообразно. Напротив, использование API нативного JS более разнообразно, включая назначение и передачу параметров. Кроме того, имена API нативного JS длинные и их неудобно запоминать. В этом также смысл рождения многих библиотек JS.
Многие плагины обычно имеютutils
файл, в основном будет выполнять простую инкапсуляцию собственного метода и предоставлять некоторые инструментальные методы.
Сильные и слабые стороны Зепто
Zepto — дальновидная библиотека, почему я пришел к такому выводу? Zepto дополнительно абстрагирует нативные методы и упрощает их использование. Как я уже сказал выше, поскольку API jQuery прост и удобен в использовании, и мы лучше знакомы с ним, почему бы нам не объединить jQuery с собственным JS? Удивительно, но авторы Zepto уже сделали это еще в 2010 году. Большинство API-интерфейсов jQuery реализованы с помощью собственного JS, и коэффициент замены близок к 90%.По крайней мере, в плагинах, которые я написал, почти все API-интерфейсы jQuery могут быть заменены. И Zepto не используется вслепуюdocument.querySelector
метод, но используйте его выборочно в зависимости от производительностиdocument.getElementById
так же какdocument.querySelector
Ждать.
Но есть у Zepto и очевидные недостатки.Ведь это все-таки продукт прошлой эпохи.Во-первых, он не может загружаться по требованию.Сейчас мы охотнее внедряем какие-то методы в соответствии с собственными потребностями при написании проектов,а не импорт всей библиотеки.Хотя Zepto не большой, но все же вызывает некоторое отвращение как обсессивно-компульсивное расстройство. Кроме того, в самой Zepto есть некоторые ошибки, такие какscrollTop
,scrollLeft
метод. См. исходный код для других различий.
// Zepto
scrollTop: function(value) {
if (!this.length) return
var hasScrollTop = 'scrollTop' in this[0]
if (value === undefined) return hasScrollTop ? this[0].scrollTop : this[0].pageYOffset
return this.each(hasScrollTop ?
function() { this.scrollTop = value } :
function() { this.scrollTo(this.scrollX, value) })
}
document
Элемент не может получить правильное значение, я поднял вопрос об этой проблеме, но ответа нет, Zepto в настоящее время практически не обслуживается. Правильный способ следующий:
// Domq
function scrollTop(value) {
if (!this.length) return
var hasScrollTop = 'scrollTop' in this[0]
if (value === undefined) return hasScrollTop
? this[0].scrollTop
: isWindow(this[0])
? this[0].pageYOffset
: this[0].defaultView.pageYOffset;
return this.each(hasScrollTop ?
function () { this.scrollTop = value } :
function () { this.scrollTo(this.scrollX, value) })
}
Миссия Домка
Существует множество библиотек для работы с DOM в виде jQuery, таких какbonzo,$dom, но когда я рефакторил плагин jQuery, я обнаружил, что нет возможности напрямую заменить jQuery этими библиотеками, только Zepto относительно совершенен, но я не хочу вводить дополнительные бесполезные методы.
В конце концов я решил обновить Zepto, чтобы он больше соответствовал текущим привычкам использования. Чтобы сказать немного больше, я лично считаю, что основные функции Zepto немного запутаны, а в пространстве имен есть и то, и другое.zepto
, а также$
,Z
, это кажется очень запутанным, а основная функция domq заключается только вD
Это пространство имен, форма и функция почти такие же, как основные функции jQuery, и их можно рассматривать как мини-версию jQuery.
// Zepto 核心方法
var Zepto = (function() {
var zepto = {};
...
zepto.Z = function(dom, selector) {
return new Z(dom, selector)
}
...
$ = function(selector, context) {
return zepto.init(selector, context)
}
...
})()
// Domq 核心方法
var D = function (selector, context) {
return new D.fn.init(selector, context);
}
D.fn = D.prototype = {
...
init: function(){
...
}
...
}
Конечно, самое главное в Domq — загружать его по запросу, монтировать методы по мере необходимости и минимизировать ненужный код. Способ его использования очень прост, но нужно создать отдельный файл и перемонтировать нужные методы вD
Пространство имен, это очень полезно при написании плагинов.
import {
D,
isArray,
addClass
} from 'domq.js/src/domq.modular';
// 静态方法
const methods = {
isArray
}
// 原型方法
const fnMethods = {
addClass
}
D.extend(methods);
D.fn.extend(fnMethods);
Кроме того, некоторые инструментальные методы часто используются при выполнении проектов.В настоящее время это может быть лучшим способом представить эти методы с помощью инструментальной библиотеки. У Domq также есть несколько общих методов инструментов, но их нужно немного доработать.
D.type()
D.contains()
D.camelCase()
D.isFunction()
D.isWindow()
D.isEmptyObject()
D.isPlainObject()
D.isNumeric()
D.isArray()
D.inArray()
...
В Domq не так много нового, так что вводить особо нечего, он уже есть в плагине.PhotoViewerИ его можно использовать в реальных проектах, вы можете скачать и использовать.
Суммировать
Это хорошая эпоха и плохая эпоха Конец jQuery действительно удивителен, но нам не нужно отказываться от способа использования jQuery из-за конца jQuery. Как упоминалось ранее, манипулирование DOM с помощью jQuery по-прежнему остается лучшим, на мой взгляд, поэтому вам не нужен jQuery, но вам нужна библиотека DOM.
Гитхаб:github.com/nzbin/domq