Unpoly — это библиотека для постепенной загрузки и обновления фрагментов страницы без полной перезагрузки. Основная идея оптимизации запросов заключается в минимизации объёма данных, передаваемых между клиентом и сервером, и уменьшении числа перерисовок DOM, что повышает отзывчивость интерфейса и снижает нагрузку на сервер.
Unpoly работает через целевые фрагменты
(up-target) и селекторы. Запрос можно ограничить только
нужной областью страницы, избегая полной перезагрузки.
Пример:
<div id="messages" up-target="true">
<!-- Сообщения будут обновляться частично -->
</div>
<a href="/messages?page=2" up-target="#messages">Следующая страница</a>
В этом случае сервер возвращает только HTML для
#messages, а Unpoly автоматически заменяет содержимое блока
без затрагивания остальной страницы.
Ключевой момент: сервер не должен возвращать весь шаблон страницы, а только нужный фрагмент. Это существенно уменьшает объём передаваемых данных и ускоряет рендеринг.
Unpoly поддерживает предзагрузку
(up-preload) фрагментов, что позволяет подготавливать
контент до того, как пользователь кликнет по ссылке.
<a href="/user/42" up-target="#profile" up-preload>Показать профиль</a>
up-preload инициирует GET-запрос заранее.up-cache для хранения содержимого
и повторного использования без нового запроса.Пример кеширования:
<div id="notifications" up-target="true" up-cache="true"></div>
Ключевой момент: кеширование должно учитывать
динамическую природу данных. Для быстро меняющихся блоков стоит
ограничивать время жизни кеша или использовать стратегию
up-refresh.
Часто запросы могут дублироваться из-за событий, вызванных пользователем или анимацией. Unpoly позволяет отменять предыдущие запросы, чтобы не перегружать сервер.
up.link('.search-link', { mode: 'replace', target: '#results' });
При многократном клике на .search-link предыдущий запрос
автоматически отменяется, а DOM обновляется только последним
результатом.
Рекомендации:
mode: 'replace' или
mode: 'INSERT' для контроля перерисовки DOM.up.request.abort() при программных вызовах,
если старый запрос уже не нужен.Unpoly поддерживает зависимые фрагменты через
up-target и up-on-load.
Пример:
<div id="user-details" up-target="true" up-on-load="loadPosts">
<!-- Сначала загружаются детали, затем вызывается функция loadPosts -->
</div>
function loadPosts() {
up.reload('#user-posts');
}
Ключевой момент: последовательная загрузка уменьшает пиковую нагрузку на сервер и ускоряет отображение главного контента.
Unpoly предоставляет удобные методы для работы с формами без полной перезагрузки:
<form up-target="#results" up-submit>
<input type="text" name="query">
<button type="submit">Поиск</button>
</form>
up-submit отправляет форму асинхронно.Для фильтров:
<select name="category" up-target="#results" up-change>
<option val ue="all">Все</option>
<option value="books">Книги</option>
</select>
up-change инициирует запрос при изменении
значения.#results.Ключевой момент: каждая форма и фильтр должны работать на конкретный фрагмент, чтобы избежать лишних запросов и перерисовки всей страницы.
Unpoly генерирует ряд событий, которые помогают управлять оптимизацией:
up:request — до отправки запроса, позволяет изменить
параметры или отменить его.up:response — после получения ответа, позволяет
обработать данные перед обновлением DOM.up:fragment:loaded — после вставки фрагмента, подходит
для инициализации скриптов.Пример отмены лишнего запроса:
document.addEventListener('up:request', function(event) {
if (event.target.matches('#results') && event.detail.url.includes('redundant')) {
event.preventDefault(); // блокируем ненужный запрос
}
});
Для снижения объёма передаваемых данных важно:
up-cache для повторного использования
уже загруженного контента.Пример JSON-запроса:
up.request('/api/data', { method: 'GET' })
.then(response => renderData(response.json, '#data-container'));
Сочетание этих подходов позволяет строить быстрые, отзывчивые интерфейсы, снижая нагрузку на сервер и ускоряя работу с динамическим контентом.