Роутинг на клиенте

Основы клиентского роутинга

Клиентский роутинг позволяет управлять состоянием веб-приложения без перезагрузки страницы, используя изменения URL или хэша. В отличие от серверного роутинга, где каждый запрос обрабатывается на сервере, клиентский роутинг динамически загружает контент и обновляет DOM, обеспечивая плавный пользовательский опыт.

В Zepto.js нет встроенной системы роутинга, как в Angular или React, поэтому реализация опирается на работу с событием hashchange, управлением URL через location.hash и обработку переходов вручную.

Работа с хэшами

Хэш в URL начинается с символа # и используется для идентификации состояния приложения. Основные методы для работы с хэшами:

// Получение текущего хэша без #
var currentHash = window.location.hash.slice(1);

// Установка хэша
window.location.hash = 'home';

Изменение хэша не вызывает перезагрузку страницы, что делает его идеальным для клиентского роутинга.

Отслеживание изменений хэша

Zepto.js предоставляет событие hashchange, которое срабатывает при изменении хэша:

$(window).on('hashchange', function() {
    var hash = window.location.hash.slice(1);
    handleRoute(hash);
});

Функция handleRoute отвечает за переключение состояния приложения в зависимости от текущего хэша.

Определение маршрутов

Для упрощения работы с роутингом часто создают объект маршрутов:

var routes = {
    home: function() {
        $('#content').html('<h1>Главная страница</h1>');
    },
    about: function() {
        $('#content').html('<h1>О сайте</h1>');
    },
    contact: function() {
        $('#content').html('<h1>Контакты</h1>');
    }
};

Обработка маршрутов через объект позволяет легко добавлять новые страницы:

function handleRoute(route) {
    if(routes[route]) {
        routes[route]();
    } else {
        routes['home']();
    }
}

Инициализация роутинга

Для корректной работы роутинга нужно обработать текущий хэш при загрузке страницы:

$(function() {
    var initialHash = window.location.hash.slice(1) || 'home';
    handleRoute(initialHash);
});

Это гарантирует, что при прямом переходе на URL с хэшем отображается соответствующий контент.

Плавная навигация

Для управления переходами внутри приложения удобно использовать ссылки с хэшем:

<a href="#home">Главная</a>
<a href="#about">О сайте</a>
<a href="#contact">Контакты</a>

Zepto.js автоматически отлавливает изменения хэша через hashchange, поэтому дополнительные обработчики на клики не обязательны.

Дополнительные возможности

  1. Динамические маршруты — можно использовать параметры в хэше:
// Пример: #profile/123
$(window).on('hashchange', function() {
    var hash = window.location.hash.slice(1).split('/');
    var route = hash[0];
    var param = hash[1];
    if(route === 'profile') {
        $('#content').html('<h1>Профиль пользователя ' + param + '</h1>');
    }
});
  1. История переходов — можно использовать window.history для навигации без хэша:
// Добавление состояния в историю
window.history.pushState({page: 'home'}, 'Главная', '/home');

// Обработка события popstate
$(window).on('popstate', function(event) {
    var state = event.originalEvent.state;
    if(state) {
        handleRoute(state.page);
    }
});
  1. Анимации при смене контента — Zepto позволяет плавно скрывать и показывать элементы:
function fadeContent(html) {
    $('#content').fadeOut(200, function() {
        $(this).html(html).fadeIn(200);
    });
}

Практические рекомендации

  • Использовать единый объект маршрутов для упрощения поддержки.
  • Сохранять согласованность между хэшами и состоянием приложения.
  • Для сложных приложений сочетать хэш и pushState для улучшения SEO и контроля истории.
  • Минимизировать прямые манипуляции с DOM вне маршрутов, чтобы избежать рассинхронизации состояния.

Клиентский роутинг в Zepto.js является легковесным и гибким решением для SPA, позволяя управлять страницами через хэши, динамически обновлять контент и интегрировать анимации без громоздких библиотек.