Unpoly — это JavaScript-библиотека, которая реализует концепцию прогрессивного улучшения (progressive enhancement) для веб-приложений. Основная идея заключается в том, чтобы страницы загружались как обычные HTML-документы, а динамическое поведение подключалось только при наличии JavaScript, не нарушая при этом базовую функциональность.
Библиотека управляет асинхронной подгрузкой фрагментов страницы, обновлением контента и навигацией без полной перезагрузки, сохраняя при этом историю браузера и состояние форм.
Unpoly использует селекторы CSS для таргетинга элементов, что позволяет обновлять только определённые части страницы. Это делает взаимодействие более плавным и отзывчивым, сокращает объём передаваемых данных и повышает UX.
up.linkМетод up.link(element) инициирует загрузку указанного
элемента как ссылки с обработкой Unpoly. Обычно используется для кнопок
и ссылок, чтобы перехватывать их стандартное поведение.
up.link('#my-link', { target: '#content' });
#my-link — элемент-ссылка, на который навешивается
обработчик.target — CSS-селектор блока, который будет обновлён
ответом сервера.up.renderПозволяет программно обновлять фрагмент страницы. Можно передавать HTML-код, URL или jQuery-объект.
up.render('#content', '/users/list');
/users/list через AJAX.#content.Особенности:
replace,
before, after, append,
prepend.up.requestИспользуется для выполнения AJAX-запросов с обработкой событий
Unpoly. Возвращает объект Promise, что облегчает работу с
асинхронным кодом.
up.request('/users/create', {
method: 'POST',
body: new FormData(document.querySelector('#user-form'))
}).then(response => {
up.render('#user-list', response);
});
Преимущества up.request:
up:request,
up:success, up:fail).Unpoly интегрируется с историей браузера через pushState
и replaceState. Это позволяет реализовать плавную
навигацию без полной перезагрузки страницы и обеспечивает
работу кнопок «назад» и «вперед».
target — CSS-селектор, который будет
обновлён при переходе.fallback — действие, если целевой блок
не найден (например, полная перезагрузка страницы).focus — управление фокусом после
обновления, чтобы поддерживать доступность.Пример навигации с целевым блоком:
<a href="/profile" up-target="#main">Профиль</a>
up-target="#main" — обновляет только элемент
#main.Unpoly автоматически подхватывает формы с атрибутом
up-target. Это позволяет отправлять формы через AJAX,
обновляя только нужный фрагмент страницы.
<form action="/users" method="post" up-target="#user-list">
<input type="text" name="name">
<button type="submit">Добавить</button>
</form>
Особенности:
Unpoly предоставляет богатый набор событий для управления процессом загрузки и рендеринга:
up:click — перехват клика на
ссылке.up:form:submit — перед отправкой
формы.up:request — при начале
AJAX-запроса.up:success — при успешном получении
ответа.up:fail — при ошибке запроса.up:fragment:loaded — после вставки
нового контента.Пример использования событий:
document.addEventListener('up:success', event => {
console.log('Фрагмент загружен', event.target);
});
Unpoly поддерживает встроенные анимации при вставке контента.
Доступны эффекты: fade, slide,
reveal.
up.render('#content', '/users/list', { animation: 'fade' });
fade — плавное появление нового контента.slide — скользящее обновление.reveal — раскрытие блока сверху вниз.Unpoly позволяет глобально настраивать поведение:
up.fragment.config.animation = 'fade';
up.link.config.method = 'GET';
up.form.config.submit = 'replace';
up.fragment.config — глобальные параметры для
фрагментов.up.link.config — стандартное поведение ссылок.up.form.config — управление формами.Unpoly обеспечивает гибкую архитектуру для динамических приложений, сочетая простоту прогрессивного улучшения с возможностями современных SPA. Она позволяет минимизировать JavaScript в клиентском коде, делая приложения быстрыми и отзывчивыми.