Unpoly — это JavaScript-библиотека, которая упрощает создание динамических интерфейсов без необходимости полной перезагрузки страницы. Она использует AJAX для замены фрагментов HTML и поддерживает прогрессивное улучшение: если JavaScript отключен, стандартные ссылки и формы работают как обычно.
Ключевой принцип Unpoly заключается в обновлении конкретных блоков страницы вместо полной перезагрузки. Это позволяет сохранять состояние страницы, уменьшать задержку при навигации и улучшать пользовательский опыт.
Основной метод работы с Unpoly — это замена элементов через
up.replace(selector, url, options).
Пример:
up.replace('#content', '/posts/42', {
animation: 'fade',
focus: true
});
#content — CSS-селектор блока, который будет
заменён./posts/42 — URL, с которого будет загружен новый
HTML.animation — тип анимации при обновлении.focus — установка фокуса на первый интерактивный
элемент внутри нового блока.Unpoly автоматически обрабатывает кэширование, предотвращая лишние запросы, если контент уже загружен.
Формы с атрибутом up-target отправляются AJAX-запросом
без перезагрузки страницы:
<form up-target="#comments" action="/comments" method="post">
<textarea name="body"></textarea>
<button type="submit">Отправить</button>
</form>
up-target указывает, какой блок заменить после успешной
отправки формы.up-on("up:form:failed"), а для успешного завершения —
up-on("up:form:submitted").Unpoly позволяет обновлять URL без полной перезагрузки страницы через
up.history.replace(url) и
up.history.push(url).
push(url) добавляет новое состояние в историю браузера,
аналогично переходу по ссылке.replace(url) заменяет текущее состояние, что полезно
для обновления параметров без создания новой записи.Это облегчает работу с SPA-подобными интерфейсами, сохраняя привычное поведение кнопок “Назад” и “Вперед”.
Для контроля производительности и поведения динамических интерфейсов Unpoly предоставляет встроенные события и инструменты.
Unpoly генерирует ряд событий для отслеживания состояния страницы:
up:fragment:loaded — фрагмент загружен и вставлен в
DOM.up:fragment:replaced — блок полностью заменён.up:form:submitted — форма успешно отправлена.up:form:failed — ошибка при отправке формы.Пример использования для мониторинга времени загрузки фрагмента:
document.addEventListener('up:fragment:loaded', (event) => {
console.log('Фрагмент загружен:', event.target);
});
События содержат объект event, включающий информацию о
таргете, загруженном HTML, URL и
статусе запроса.
Можно измерять время загрузки фрагментов, отслеживать ошибки и строить статистику:
document.addEventListener('up:fragment:loading', (event) => {
event.detail.startTime = performance.now();
});
document.addEventListener('up:fragment:loaded', (event) => {
const duration = performance.now() - event.detail.startTime;
console.log(`Загрузка фрагмента заняла ${duration.toFixed(2)} мс`);
});
up:fragment:loading фиксирует момент начала
запроса.up:fragment:loaded фиксирует окончание и позволяет
рассчитать задержку.Unpoly поддерживает режим отладки через
up.debug.enable(). В консоли выводятся:
Для детального анализа можно добавлять кастомные обработчики событий, отправляющие данные в сторонние системы мониторинга, такие как Sentry или Google Analytics:
document.addEventListener('up:fragment:failed', (event) => {
sendErrorToMonitoringService({
url: event.detail.request.url,
status: event.detail.request.status
});
});
Отслеживаются следующие показатели:
time-to-interactive).Эти данные позволяют оптимизировать структуру страницы, минимизировать задержки и повышать стабильность интерфейса.
Unpoly легко интегрируется с системами аналитики через события жизненного цикла. Например, для Google Analytics можно отправлять события при загрузке каждого фрагмента:
document.addEventListener('up:fragment:loaded', (event) => {
gtag('event', 'fragment_loaded', {
'fragment_id': event.target.id,
'url': event.detail.request.url
});
});
Такой подход позволяет строить карты использования интерфейса, выявлять узкие места и планировать улучшения на основе реальных данных.
Ошибки AJAX-запросов фиксируются через
up:fragment:failed и up:form:failed. Для
каждой ошибки можно получить:
Эти данные критичны для мониторинга стабильности и позволяют выявлять проблемные места на стороне сервера или клиента.
Unpoly объединяет динамическую замену фрагментов, управление историей и события жизненного цикла, что делает его удобным инструментом для построения интерактивных интерфейсов с продуманной системой мониторинга и метрик.