Unpoly — это библиотека JavaScript, предназначенная для создания динамических веб-приложений с частичной перезагрузкой страниц. В основе её работы лежат асинхронные запросы и замена фрагментов DOM, что позволяет поддерживать плавную работу интерфейса без полной перезагрузки.
Unpoly использует AJAX-запросы через fetch API, скрыто обрабатывая большинство сетевых операций. Настройка сети в Unpoly включает:
Базовый URL и префиксы По умолчанию Unpoly использует относительные пути, но для крупных приложений часто требуется указать базовый URL:
up.network.configure({
urlPrefix: '/api/'
});
Параметр urlPrefix добавляет префикс ко всем запросам,
что упрощает работу с REST-эндпоинтами.
Заголовки по умолчанию Для передачи токенов авторизации, CSRF-токенов или других данных можно использовать глобальные заголовки:
up.network.configure({
headers: {
'X-CSRF-Token': document.querySelector('meta[name="csrf-token"]').content,
'Authorization': 'Bearer ' + token
}
});
Важно: эти заголовки будут автоматически добавляться ко всем сетевым вызовам Unpoly.
Методы HTTP и их настройка Unpoly поддерживает стандартные методы: GET, POST, PUT, PATCH, DELETE. Метод указывается при инициализации запроса или через атрибуты элементов:
<a href="/users/1" up-target="#user-details" up-method="PUT">Обновить пользователя</a>
При использовании JavaScript API метод указывается так:
up.ajax('/users/1', { method: 'PATCH', data: { name: 'Иван' } });Unpoly кэширует содержимое фрагментов для ускорения навигации:
Кэширование фрагментов: по умолчанию фрагменты сохраняются в памяти и могут быть повторно использованы при возврате к предыдущему состоянию.
Отключение кэша: для динамического контента можно отключить кэш:
up.ajax('/dashboard', { cache: false });Настройка TTL (time-to-live): можно задать максимальное время хранения кэшированного фрагмента:
up.network.configure({ cacheTTL: 30000 }); // 30 секундUnpoly предоставляет удобные хуки для управления ошибками:
Пример обработки ошибок:
up.on('up:request:error', function(event) {
console.error('Ошибка запроса:', event.response.status, event.response.statusText);
alert('Не удалось загрузить данные. Попробуйте позже.');
});
Для долгих операций полезно задавать таймаут:
up.ajax('/reports/generate', {
timeout: 10000 // 10 секунд
});
Отменить запрос можно через возвращаемый объект:
let request = up.ajax('/slow-endpoint');
request.abort();
Unpoly позволяет перехватывать и модифицировать запросы перед их отправкой:
up.on('up:request:before', function(event) {
if (!userIsLoggedIn()) {
event.preventDefault(); // отменяет запрос
}
});
Можно изменять URL, данные или заголовки прямо перед отправкой:
up.on('up:request:before', function(event) {
event.request.url = '/api' + event.request.url;
event.request.headers['X-Debug'] = 'true';
});
Unpoly хорошо сочетается с библиотеками для авторизации, аналитики и
логирования. Например, можно использовать fetch-промисы для
расширенного контроля:
up.network.configure({
fetch: function(request) {
console.log('Отправка запроса на', request.url);
return fetch(request);
}
});
Это позволяет добавлять глобальные таймеры, логирование и кастомные обработки ошибок на уровне всей сети.
JSON: передача данных через up.ajax
с опцией dataType: 'json' автоматически парсит ответ:
up.ajax('/api/users', { dataType: 'json' }).then(function(response) {
console.log(response.data);
});HTML-фрагменты: для обновления частей страницы
достаточно указать up-target:
<a href="/users/42" up-target="#profile">Посмотреть профиль</a>
В ответ сервер может отправить только HTML-фрагмент без полной страницы, а Unpoly автоматически обновит указанный элемент.
Эта система конфигурации позволяет строить отзывчивые и безопасные веб-приложения, минимизируя полные перезагрузки страниц и обеспечивая плавную работу интерфейса. Unpoly сочетает простоту синтаксиса с гибкой настройкой сетевых операций, делая его мощным инструментом для современных SPA-подобных приложений.