Unpoly — это лёгкая JavaScript-библиотека для создания быстрого и отзывчивого пользовательского интерфейса без полной перезагрузки страниц. Она использует прогрессивное обновление фрагментов HTML, позволяя динамически загружать контент и изменять его без нарушения состояния страницы. Важной особенностью является возможность расширения функциональности, которая реализуется через хуки, кастомные события и расширяемую архитектуру компонентов.
Unpoly предоставляет хуки, которые позволяют вмешиваться в процесс загрузки, отображения и замены фрагментов HTML. Основные категории:
up:click — срабатывает при клике на элемент,
обрабатываемый Unpoly.up:request — перед отправкой AJAX-запроса.up:response — после получения ответа от сервера, до
замены контента.up:fragment:loaded — после вставки нового фрагмента в
DOM.up:layer:opened — при открытии слоя (layer) или
модального окна.Пример использования:
up.on('up:fragment:loaded', function(event) {
const fragment = event.fragment;
console.log('Фрагмент загружен:', fragment);
});
С помощью хуков можно реализовать валидацию форм перед отправкой, анимацию при обновлении контента и логирование пользовательских действий.
Unpoly поддерживает кастомные события, что позволяет расширять стандартное поведение и создавать собственные точки интеграции. События могут быть инициированы как на конкретных фрагментах, так и глобально.
// Создание кастомного события
const fragment = up.fragment('#comments');
up.emit(fragment, 'comments:updated', { count: 42 });
// Подписка на событие
up.on('comments:updated', function(event) {
console.log('Количество комментариев:', event.detail.count);
});
Использование кастомных событий особенно полезно при построении модульной архитектуры, когда один компонент должен уведомлять другие без прямой зависимости.
Unpoly предоставляет API для слоёв (layers) — изолированных частей интерфейса, которые можно открывать поверх основного контента. Слои позволяют создавать всплывающие модальные окна, динамически подгружать формы и компоненты.
up.layer.open('/users/123/edit', {
layer: 'modal',
title: 'Редактирование пользователя',
size: 'large'
});
Параметры слоёв:
layer — идентификатор слоя.title — заголовок окна.size — размеры (small,
medium, large).cache — кэширование фрагмента.animation — тип анимации при открытии/закрытии.Слои взаимодействуют с хуками и кастомными событиями, что позволяет полностью контролировать процесс загрузки, валидации и закрытия.
По умолчанию Unpoly использует встроенные AJAX-запросы для загрузки контента. Поведение можно переопределить, подключив собственные обработчики запросов или используя адаптеры.
Пример: изменение метода запроса для определённых ссылок.
up.on('up:request', function(event) {
if (event.target.matches('.api-link')) {
event.request.method = 'POST';
event.request.headers['X-Custom-Header'] = 'value';
}
});
Также можно использовать глобальные перехватчики для обработки ошибок:
up.on('up:response', function(event) {
if (!event.response.ok) {
console.error('Ошибка при загрузке фрагмента:', event.response.status);
}
});
Unpoly позволяет фильтровать или изменять HTML перед
вставкой. Для этого используется
up:fragment:insert:
up.on('up:fragment:insert', function(event) {
const fragment = event.fragment;
fragment.querySelectorAll('img').forEach(img => {
img.alt = 'Автоматически добавлено';
});
});
Это даёт возможность автоматически модифицировать содержимое, добавлять атрибуты, обрабатывать изображения или внедрять сторонние виджеты.
Unpoly легко интегрируется с jQuery, React, Vue и другими библиотеками:
up:fragment:loaded.Пример интеграции с React:
up.on('up:fragment:loaded', function(event) {
const container = event.fragment.querySelector('.react-root');
if (container) {
ReactDOM.render(<App />, container);
}
});
Unpoly поддерживает расширения через плагины, что позволяет инкапсулировать повторяющиеся функции и подключать их к различным проектам. Плагины обычно реализуются как набор хуков и кастомных событий:
(function() {
up.on('up:fragment:loaded', function(event) {
const fragment = event.fragment;
fragment.querySelectorAll('.tooltip').forEach(el => {
tippy(el); // инициализация всплывающих подсказок
});
});
})();
Такая архитектура обеспечивает модульность и переиспользуемость, позволяя подключать функциональные блоки без изменения ядра Unpoly.
Unpoly предоставляет конфигурационные параметры, которые расширяют возможности библиотеки:
up.fragmentCache — управление кэшированием
фрагментов.up.animation — типы анимаций для всех фрагментов.up.submitForm — глобальная настройка отправки форм
(AJAX или обычная).up.fragmentCache.enabled = true;
up.animation.default = 'fade';
up.submitForm({ method: 'POST' });
Комбинирование этих параметров с хуками и кастомными событиями позволяет создавать сложные интерфейсы с минимальным количеством кода и полной интеграцией динамических функций.
Расширение функциональности Unpoly строится на хуках, кастомных событиях, слоях и плагинах, что позволяет адаптировать библиотеку под любые задачи. Эти инструменты обеспечивают динамическую подгрузку контента, интеграцию с внешними библиотеками, модульность и контроль за поведением интерфейса на всех уровнях. Правильное использование этих возможностей позволяет создавать быстрые, отзывчивые и легко поддерживаемые веб-приложения.