Umbrella JS — это компактная и модульная библиотека для работы с DOM, упрощающая манипуляции элементами, событиями и AJAX. Одной из ключевых особенностей библиотеки является поддержка плагинов, позволяющая расширять функционал без изменения ядра. Архитектура плагинов построена таким образом, чтобы интеграция была простой, масштабируемой и не нарушала работу существующих методов библиотеки.
Плагины в Umbrella JS — это функции, которые добавляются к прототипу
$ и становятся доступными для всех экземпляров объекта
Umbrella. Основная идея заключается в том, что любой набор операций над
выбранными элементами можно оформить как метод, доступный через цепочку
вызовов:
u('div').pluginMethod();
При этом pluginMethod — это пользовательский или
сторонний плагин, реализованный вне ядра библиотеки. Плагины работают
напрямую с коллекцией элементов, представленной объектом Umbrella.
Umbrella JS предоставляет стандартный способ добавления новых методов
через функцию u.fn:
u.fn.newPlugin = function() {
this.each(el => {
// действия с каждым элементом el
});
return this;
};
Ключевые моменты:
this внутри функции плагина — объект
Umbrella, содержащий выбранные элементы.each позволяет итеративно
обрабатывать каждый элемент коллекции.this обеспечивает поддержку
цепочек вызовов (chainable API), аналогично встроенным методам
библиотеки.Эффективный плагин должен содержать следующие элементы:
u.fn.colorize = function(options) {
const settings = Object.assign({ color: 'red' }, options);
this.each(el => {
el.style.color = settings.color;
});
return this;
};
Плагины Umbrella JS используют внутренние методы библиотеки для работы с DOM:
each — итерация по коллекции
элементов.on / off — привязка и
удаление событий.attr / css /
html — управление атрибутами и стилями.Пример плагина для добавления обработчика клика с подсветкой элемента:
u.fn.highlightOnClick = function(color) {
this.on('click', el => {
el.style.backgroundColor = color || 'yellow';
});
return this;
};
this), чтобы сохранить возможность цепочки
вызовов.1. Плагин для анимации появления элементов:
u.fn.fadeIn = function(duration = 400) {
this.each(el => {
el.style.opacity = 0;
el.style.display = '';
let last = +new Date();
const tick = () => {
el.style.opacity = +el.style.opacity + (new Date() - last) / duration;
last = +new Date();
if (+el.style.opacity < 1) {
requestAnimationFrame(tick);
}
};
tick();
});
return this;
};
2. Плагин для переключения классов:
u.fn.toggleClass = function(className) {
this.each(el => {
if (el.classList.contains(className)) {
el.classList.remove(className);
} else {
el.classList.add(className);
}
});
return this;
};
Эти плагины демонстрируют принцип чистого кода и переиспользуемости, характерный для архитектуры Umbrella JS.
Для более сложных плагинов можно предусмотреть подключение зависимостей. Например, плагин, который использует сторонние библиотеки, должен проверять их наличие:
u.fn.tooltip = function() {
if (typeof tippy === 'undefined') {
throw new Error('Tippy.js не подключен');
}
this.each(el => tippy(el));
return this;
};
Такой подход обеспечивает стабильность работы и предотвращает поломку цепочек вызовов.
Umbrella JS не запрещает хранение данных внутри элементов с помощью
метода data:
u.fn.storeValue = function(key, value) {
this.each(el => u(el).data(key, value));
return this;
};
Это позволяет плагинам хранить собственное состояние без вмешательства в DOM напрямую, сохраняя чистоту архитектуры.
Архитектура плагинов Umbrella JS обеспечивает лёгкость расширения, строгую модульность и высокую совместимость с ядром, позволяя создавать как простые, так и сложные инструменты для работы с DOM.