Unpoly — это библиотека для прогрессивного улучшения веб-интерфейсов, позволяющая создавать динамические страницы без полной перезагрузки. Одной из ключевых возможностей является расширяемость через плагины, которые позволяют добавлять функциональность, интегрировать сторонние библиотеки и управлять событиями на более высоком уровне.
Плагин в Unpoly представляет собой объект с набором опций и методов, которые подключаются к жизненному циклу фреймворка. Основная цель плагина — реагировать на действия пользователя, модифицировать DOM и взаимодействовать с Unpoly API.
Плагин обычно объявляется через up.plugin:
up.plugin('имя_плагина', {
// Метаданные плагина
version: '1.0.0',
description: 'Описание функционала плагина',
// Метод инициализации
init() {
// Логика, выполняемая при загрузке плагина
},
// Методы, доступные извне
methods: {
customMethod() {
console.log('Вызов метода плагина');
}
}
});
Ключевые элементы:
up.plugin('имя_плагина').init — выполняется один раз при
загрузке плагина и может использоваться для регистрации событий,
настройки наблюдателей и других подготовительных действий.methods — набор функций,
которые могут быть вызваны извне, например, для обновления состояния
плагина или выполнения действий по требованию.Unpoly имеет сложный жизненный цикл событий, и плагины могут подключаться к различным этапам:
up:fragment:loaded — срабатывает после
загрузки нового фрагмента страницы. Плагин может использовать это
событие для повторной инициализации интерактивных элементов.up.on('up:fragment:loaded', function(event) {
console.log('Фрагмент загружен:', event.fragment);
});
up:fragment:revealed — событие, когда
фрагмент стал видимым для пользователя.up:request:beforeSend — позволяет
модифицировать параметры AJAX-запроса перед отправкой.up:request:success /
up:request:error — обработка успешного или
неудачного ответа от сервера.Плагины могут регистрировать слушатели через up.on
внутри init для интеграции с этими событиями.
Плагины часто требуют хранения собственного состояния. Unpoly предоставляет встроенные методы, но чаще используют обычные свойства объекта плагина:
up.plugin('counter', {
count: 0,
init() {
const button = document.querySelector('#increment');
button.addEventListener('click', () => {
this.count++;
console.log('Текущее значение:', this.count);
});
}
});
Состояние доступно в методах и событиях плагина через
this, что позволяет организовать централизованное
управление.
Unpoly поддерживает возможность расширения поведения элементов без изменения исходного кода. Например, можно автоматически инициализировать сторонние виджеты:
up.plugin('datepicker', {
init() {
up.on('up:fragment:loaded', function() {
document.querySelectorAll('input[data-datepicker]').forEach(input => {
new Flatpickr(input);
});
});
}
});
В этом примере плагин интегрирует Flatpickr с любой частью страницы, загруженной через Unpoly, сохраняя динамическую природу приложения.
Плагины могут принимать параметры конфигурации через объект при регистрации или глобальные настройки Unpoly:
up.plugin('logger', {
level: 'info',
init() {
up.on('up:request:beforeSend', (event) => {
if (this.level === 'debug') {
console.log('Отправка запроса', event.request.url);
}
});
}
});
Конфигурация позволяет создавать гибкие и повторно используемые плагины, которые можно подключать в разных частях приложения с различными настройками.
up.on для всех событий, чтобы плагины
оставались совместимыми с динамической подгрузкой фрагментов.Модуль уведомлений: создает всплывающие
сообщения при AJAX-ответах, автоматически очищает старые уведомления и
поддерживает кастомные уровни (success, error,
info).
Автокомплит поиска: подключается к API сервера, подгружает результаты при вводе, обновляет DOM и кэширует ответы для снижения нагрузки на сервер.
Менеджер вкладок: позволяет переключать вкладки, сохраняет активную вкладку при перезагрузке фрагментов и инициирует события при смене состояния.
Эти примеры демонстрируют, как плагины могут превращать Unpoly в полноценный фреймворк для интерактивных интерфейсов, обеспечивая масштабируемость и поддержку современных UX-паттернов.