Server-side rendering (SSR) представляет собой технику рендеринга HTML на сервере перед отправкой пользователю. Это обеспечивает быстрый первый рендер, улучшает SEO и делает контент доступным для пользователей, даже если клиентская JavaScript-загрузка задерживается. При использовании ally.js важно понимать, как SSR влияет на доступность компонентов и управление фокусом.
Hydration — процесс «оживления» HTML, сгенерированного на сервере, подключением полноценной клиентской логики. Для библиотек работы с доступностью это критично: состояния фокуса, слушатели событий и атрибуты ARIA должны корректно синхронизироваться между сервером и клиентом.
ally.js предоставляет функции для работы с фокусом и доступностью, которые можно использовать как на сервере, так и на клиенте. Основные подходы:
import ally from 'ally.js';
// Инициализация на клиенте после hydration
document.addEventListener('DOMContentLoaded', () => {
ally.query.focusable();
});
При SSR важно помнить, что DOM на сервере не
существует, поэтому вызовы методов, которые напрямую
взаимодействуют с document или window, должны
выполняться только на клиенте после hydration.
if (typeof window !== 'undefined') {
// Безопасная инициализация ally.js на клиенте
ally.query.focusable();
}
При SSR часто возникает проблема с потерей фокуса после гидратации, так как элементы, созданные на сервере, не содержат слушателей событий или динамических атрибутов ARIA. ally.js предоставляет инструменты для восстановления этих состояний.
Пример восстановления фокуса:
const initialFocus = document.querySelector('[data-initial-focus]');
if (initialFocus) {
ally.focus(initialFocus);
}
Для динамических компонентов, таких как модальные окна или вкладки,
важно использовать функции ally.query.focusable() и
ally.style.focus() после полной гидратации, чтобы корректно
обработать все доступные интерактивные элементы.
ally.js позволяет создавать контексты фокуса через
ally.maintain.focus():
const modal = document.querySelector('.modal');
const stopMaintainingFocus = ally.maintain.focus({
context: modal,
ignoreOutside: true
});
// После закрытия модального окна
stopMaintainingFocus();
При SSR эти контексты не могут быть активны на сервере. Их следует инициализировать исключительно на клиенте после hydration, чтобы избежать ошибок и неправильной работы фокуса.
SSR позволяет отдать пользователю предварительно заполненные атрибуты ARIA, но при hydration ally.js может динамически их обновлять:
aria-hidden — скрытие/показ контента.aria-disabled — временная блокировка интерактивного
элемента.aria-expanded — контроль раскрытых элементов.Для корректной работы:
const dropdown = document.querySelector('.dropdown');
ally.aria.setAttribute(dropdown, 'aria-expanded', 'true');
Важно вызывать эти методы после того, как DOM полностью гидратирован.
В SSR приложения часто используют фреймворки с виртуальным DOM. При изменениях структуры страницы после гидратации:
refresh.focusable() для
обновления списка фокусируемых элементов.const observer = new MutationObserver(() => {
ally.query.focusable();
});
observer.observe(document.body, { childList: true, subtree: true });
Это гарантирует, что новые интерактивные элементы сразу будут доступны для навигации с клавиатуры.
ally.maintain.focus() только после гидратации.document или window должны быть обернуты
проверкой наличия клиента.ally.query.focusable() или MutationObserver.useEffect после гидратации.mounted для работы с
ally.js.onMount.Это позволяет корректно интегрировать доступность с server-side rendered компонентами, избегая ошибок фокуса и недоступности элементов.