Zepto.js — это минималистичная библиотека для работы с DOM, AJAX и анимациями в браузере. Основной принцип Zepto — компактность, модульность и использование цепочек методов, аналогичных jQuery. Рассмотрим ключевые элементы структуры исходного кода библиотеки.
Центральным элементом является функция Zepto,
реализующая поиск элементов и создание обертки над ними. Она имеет
следующую структуру:
var Zepto = (function() {
// Внутренние вспомогательные функции
// Основная функция $()
return $;
})();
Особенности:
$.$, которая и становится
интерфейсом взаимодействия с DOM.$Функция $ является ядром библиотеки:
function $(selector, context) {
return Zepto.init(selector, context);
}
selector — CSS-селектор или
HTML-строка; context — DOM-элемент или документ, в котором
выполняется поиск.Zepto.init.Zepto.initИнициализация включает проверку типа входных данных и преобразование результата в массивоподобный объект:
Zepto.init = function(selector, context) {
var dom;
if (!selector) return Zepto.Z();
else if (typeof selector == 'string') {
selector = selector.trim();
if (selector[0] === '<' && fragmentRE.test(selector))
dom = Zepto.fragment(selector, RegExp.$1, context);
else
dom = $(context).find(selector);
}
else if (isFunction(selector)) return $(document).ready(selector);
else if (selector.nodeType) dom = [selector];
return Zepto.Z(dom, selector);
};
Ключевые моменты:
ready при передаче функции.Zepto.Z для обеспечения цепочек
методов.Zepto.ZОбъект Zepto.Z отвечает за методы работы с
элементами:
Zepto.Z = function(dom, selector) {
dom = dom || [];
dom.__proto__ = $.fn;
dom.selector = selector || '';
return dom;
};
$.fn.selector: хранит исходный
селектор для возможности повторного использования.$.fn$.fn — это объект прототипа, содержащий методы
библиотеки:
$.fn = {
forEach: [].forEach,
map: [].map,
slice: [].slice,
ready: function(callback) { ... },
each: function(callback) { ... },
css: function(property, value) { ... },
attr: function(name, value) { ... },
addClass: function(name) { ... },
removeClass: function(name) { ... }
};
Особенности:
$('.item').addClass('active').css('color', 'red').each и map используют массивные
функции JavaScript для обхода элементов.Zepto включает модуль AJAX, структурированный через функции
$.ajax, $.get, $.post:
$.ajax = function(options) {
var xhr = new XMLHttpRequest();
xhr.open(options.type || 'GET', options.url, true);
xhr.onreadystatecha nge = function() {
if (xhr.readyState == 4) {
if (xhr.status >= 200 && xhr.status < 300)
options.success && options.success(xhr.responseText, xhr);
else
options.error && options.error(xhr);
}
};
xhr.send(options.data || null);
};
success и
error.Методы работы с событиями используют делегирование и поддержку стандартного DOM API:
$.fn.on = function(event, selector, callback) {
return this.each(function() {
this.addEventListener(event, function(e) {
if (!selector || e.target.matches(selector))
callback.call(e.target, e);
});
});
};
selector.В исходном коде Zepto присутствует множество утилит:
isFunction, isArray,
isPlainObject — проверка типов.camelize, dasherize — преобразование
CSS-свойств.each, map, filter — функции
обхода массивов и объектов.Эти функции находятся в замыкании и доступны только внутренним методам Zepto, что уменьшает вероятность конфликтов с глобальным пространством имен.
Zepto построен модульно:
Основные приёмы оптимизации:
$ — интерфейс для
работы с DOM.Zepto.init — обработка
селекторов и HTML-фрагментов.Zepto.Z — добавление
методов через прототип $.fn.Эта структура обеспечивает баланс между компактностью кода, производительностью и функциональной полнотой библиотеки.