Unpoly — это библиотека для частичного обновления страниц без перезагрузки браузера. Одним из ключевых аспектов работы с Unpoly является правильная организация редиректов. В традиционных веб-приложениях редирект выполняется через стандартные HTTP-статусы (301, 302), но в Unpoly механика отличается из-за асинхронной природы загрузки контента.
Когда запрос инициируется через Unpoly, сервер может вернуть:
HTTP-редирект (3xx) — стандартный способ, который браузер обычно обрабатывает автоматически. В контексте Unpoly такие редиректы перехватываются библиотекой и преобразуются в внутренние переходы:
Location.302 Found), так и
постоянные (301 Moved Permanently) редиректы.Ответ с JavaScript-редиректом — сервер может
вернуть страницу, содержащую скрипт, который выполняет
up.redirect(url) или up.visit(url). Это
позволяет программно контролировать направление перехода на уровне
клиента.
up.redirectМетод up.redirect(url, options) выполняет
перенаправление на указанную страницу с поддержкой следующих
возможностей:
url — строка с адресом
назначения.
options — объект настроек, где
ключевыми являются:
target — CSS-селектор контейнера, в который будет
загружен новый контент.history — логика работы с историей браузера
(push, replace, none).cache — управление кэшированием контента
(true/false).Пример использования:
up.redirect('/users', {
target: '#main-content',
history: 'push'
});
Этот код заменяет содержимое контейнера #main-content на
содержимое /users и добавляет новый элемент в историю
браузера, сохраняя возможность навигации кнопкой «назад».
Типичный сценарий — отправка формы с последующим редиректом. В Unpoly это реализуется через:
up-target у формы:<form action="/users" method="post" up-target="#main-content">
<input type="text" name="name">
<button type="submit">Создать</button>
</form>
Если сервер отвечает редиректом (3xx), Unpoly автоматически загружает
целевой URL в контейнер #main-content. Это позволяет
избегать полной перезагрузки страницы после успешной отправки формы.
redirect_url:{
"redirect_url": "/users/123"
}
В этом случае клиентский код может обрабатывать объект и вызвать
up.redirect(response.redirect_url) для асинхронного
перехода.
Unpoly предоставляет глобальные и локальные настройки редиректов:
Глобальные события:
up:redirect — вызывается перед выполнением редиректа.
Можно отменить переход, вернув false.up:redirected — срабатывает после успешного переноса
контента.Пример обработки события:
up.on('up:redirect', function(event) {
if(event.url.includes('/admin')) {
console.log('Редирект на административный раздел');
}
});
up.submit(formElement, {
redirect: {
history: 'replace',
cache: false
}
});
Эта конфигурация позволяет контролировать сохранение истории и использование кэша при конкретной отправке формы.
При редиректе в Unpoly можно указать, что загружать нужно не всю страницу, а конкретный фрагмент:
up.redirect('/dashboard', {
target: '#dashboard-panel'
});
В этом случае сервер должен возвращать HTML, который содержит контейнер с соответствующим селектором. Если контейнер не найден, Unpoly автоматически поднимет ошибку и не обновит страницу. Такой подход экономит ресурсы и позволяет плавно обновлять интерфейс.
Unpoly корректно обрабатывает все эти статусы, превращая их в асинхронные переходы без перезагрузки страницы.
up.log для отслеживания всех запросов и
редиректов.Location или поле redirect_url в JSON.up:redirect и
up:redirected для логирования и контроля переходов.Редиректы могут быть условными, например:
if(user.role === 'admin') {
up.redirect('/admin/dashboard', { target: '#main-content' });
} else {
up.redirect('/home', { target: '#main-content' });
}
Такой подход позволяет динамически выбирать направление перехода в зависимости от состояния приложения, без перезагрузки всей страницы.
Правильное использование редиректов в Unpoly обеспечивает:
Эти механизмы создают основу для современных интерактивных приложений с минимальной нагрузкой на сервер и клиент.