Как AJAX трансформировал веб: от живого поиска до одностраничных приложений

14

Аббревиатура AJAX (Asynchronous Javascript And XML) звучит громоздко, но она описывает простую концепцию: обновление частей веб-страницы без перезагрузки всей страницы целиком.

Раньше, если вам нужны были новые данные, приходилось ждать. Вы нажимали на ссылку. Экран замирал. Страница становилась белой. Затем всё загружалось заново.

AJAX изменил это правило. Он позволил браузерам общаться с серверами в фоновом режиме. Вы могли ввести поисковый запрос и мгновенно увидеть результаты. Никакой перезагрузки. Никакого белого экрана. Только данные.

Это не было новым изобретением. Это было сочетание существующих инструментов, использованных новым способом.

Основные технологии асинхронного веб-дизайна

AJAX — это не одна технология. Это рабочий процесс. Он опирается на координацию стандартных веб-технологий.

В основе лежит объект XMLHttpRequest. Это встроенная функция JavaScript. Она позволяет клиентским скриптам инициировать HTTP-запросы (например, GET или POST) к серверу. Браузер отправляет запрос и не ждет ответа, прежде чем продолжать отрисовку страницы. Это и есть «асинхронная» часть.

Когда сервер отвечает, JavaScript получает данные. Он анализирует их. Он обновляет модель документа (DOM). Пользователь видит изменения, ни разу не покинув страницу.

«AJAX выделяется архитектурой, в которой клиентский код управляет получением данных, их интерпретацией и адаптацией отображения в реальном времени, без общей перезагрузки или потери интерактивности.»

Долгое время эти данные поступали в формате XML. Отсюда и название. XML избыточен. Он тяжеловесен.

Позже на смену пришел JSON (JavaScript Object Notation). JSON легче. Его проще обрабатывать JavaScript. Современные фреймворки, такие как jQuery и API fetch, сделали управление этими запросами еще проще. Но основной принцип остается неизменным: разделить пользовательский интерфейс и коммуникацию с сервером.

Почему совместимость с браузерами раньше имела значение

В начале эпохи это было сложно.

Не все браузеры поддерживали XMLHttpRequest. Или они реализовывали его по-разному.

Internet Explorer 5 и выше со временем догнал конкурентов. За ним последовал Mozilla Firefox. Safari и Chrome присоединились к этому процессу позже. Сегодня каждый современный браузер поддерживает эти функции нативно.

Это сближение позволило разработчикам создавать сложные взаимодействия, которые работали везде. Раньше приходилось писать «костыли», чтобы заставить код работать в Firefox, но не в IE. Или наоборот.

Сегодня фокус сместился на логику, а не на хаки совместимости.

Реальные приложения, определяющие пользовательский опыт

Вы использовали AJAX тысячи раз. Вероятно, вы даже не задумываетесь об этом.

Возьмем Gmail. Когда вы открываете почтовый ящик, вы не перезагружаете страницу, чтобы прочитать новое письмо. Клиентская часть загружает последние сообщения в фоновом режиме. Вы можете перетаскивать, удалять или архивать письма. Страница остается на месте. Данные обновляются.

Windows Live Hotmail сделал нечто подобное еще в ранние дни. Google Maps использует эту технологию постоянно. Вы перемещаете карту. Браузер запрашивает новые фрагменты карты. Они появляются мгновенно. Вы не ждете полной загрузки страницы.

LiveSearch — классический пример. Когда вы вводите ключевые слова, поисковая система запрашивает сервер. Результаты выпадают списком. Вы нажимаете на один из них. Страница прокручивается к результату. Все это происходит через вызовы AJAX.

Сфер применения бесконечное множество.

  • Динамические секции комментариев
  • Формы с автосохранением
  • Биржевые тикеры в реальном времени
  • Бесконечная лента новостей

Эти функции создают ощущение «одностраничного приложения» (SPA). Сайт ведет себя больше как настольное приложение. Он отзывчив. Он кажется живым.

Сдвиг в сторону одностраничных приложений (SPA)

AJAX проложил путь к SPA.

На традиционном веб-сайте каждый клик означает загрузку новой страницы. Браузер отбрасывает старый DOM и строит новый.

В SPA начальная страница загружается один раз. JavaScript обрабатывает всю последующую навигацию. Он динамически меняет контент. URL может измениться, но страница не перезагружается.

Это требует более сложного клиентского кода. Нужно управлять состоянием. Нужно обрабатывать маршрутизацию. Но пользовательский опыт превосходит традиционный.

Социальные сети полагаются на это. Когда вы публикуете обновление статуса, лента обновляется. Загружается ваше фото профиля. Появляются уведомления. Ни один из этих процессов не требует полной перезагрузки.

Наследие асинхронного обмена данными

Аббревиатура AJAX немного устарела. Разработчики редко используют этот термин сегодня. Мы просто называем это «веб-разработкой».

Но технология живет. XMLHttpRequest в значительной степени заменен API fetch. JSON стал стандартным форматом данных.

Влияние технологии невозможно отрицать. Она повысила ожидания пользователей. Теперь мы ожидаем мгновенной обратной связи. Мы ожидаем плавных переходов. Мы ожидаем, что веб-приложения будут ощущаться как нативное программное обеспечение.

Если сайт перезагружается каждый раз, когда вы нажимаете кнопку, он кажется сломанным. Он кажется устаревшим.

AJAX доказал, что веб может быть больше, чем просто статические документы. Он может стать платформой для сложных, интерактивных приложений.

Эволюция на этом не остановилась. Фреймворки, такие как React, Angular и Vue, построили свои решения на этих основах. Они автоматизируют обновление DOM. Они управляют состоянием.

Но основная идея остается прежней.

Общайтесь с сервером в фоновом режиме. Обновляйте экран. Двигайте пользователя дальше.

Мы все еще совершенствуем этот подход. Бесконечная прокрутка. Совместная работа в реальном времени. Предварительный просмотр в реальном времени. Возможности остаются в значительной степени неиспользованными.

Что будет дальше? Вероятно, меньше кликов. Больше потоковой передачи. Больше мгновенности.

Страница остается. Данные движутся.

AJAX — это не магия. Это компромисс.

Вы получаете скорость. Вы получаете плавные интерфейсы. Но вы также получаете головную боль.

Самая большая проблема заключается не в коде. Это безопасность. А именно — Политика одинакового происхождения (Same Origin Policy, SOP). По умолчанию браузеры блокируют запросы AJAX. Они взаимодействуют только с доменом, на котором находится пользователь в данный момент. Это предотвращает кражу данных с сайта вашего банка вредоносным скриптом с evil.com. Это жёсткий барьер.

Но разработчикам нужно было пробить эту стену.

На сцену выходит CORS (Cross-Origin Resource Sharing). Это механизм, позволяющий различным доменам взаимодействовать друг с другом. Вы настраиваете его на сервере. Если вы сделаете это неправильно, вы подвергнете данные риску. Если сделаете правильно, вы обеспечите работу современных распределённых приложений. Планка высокая. Конфигурация должна быть строгой.

Затем идёт вопрос истории браузера.

Когда вы обновляете страницу без перезагрузки, URL не меняется. Или меняется, но пользователь этого не замечает. Нажмите «Назад». Ничего не происходит. Или, что ещё хуже, страница перезагружается и теряет всё состояние. Это нарушает ментальную модель пользователя.

Это нужно исправить.

Явно управляйте стеком истории. Используйте HTML5 History API. Добавляйте состояния. Слушайте события popstate. Это утомительно. Это необходимо. До этого люди использовали хэшбэнги (#! ). Это работало. Но это было некрасиво.

Доступность (accessibility) — ещё одна ловушка.

Динамический контент не всегда оповещает программы чтения с экрана. Если вы заменяете текст через AJAX, вспомогательные технологии могут этого не заметить. Вам нужно обновлять атрибуты ARIA. Вам нужно вызывать события. В противном случае вы создаёте сайт, который работает только для пользователей мыши.

Ландшафт меняется.

fetch вытесняет сырые запросы XHR. Он использует промисы. Он чище. Он современнее. WebSockets добавляют двунаправленную связь в реальном времени. Вам больше не нужно опрашивать сервер. Вы получаете обновления в режиме push.

Но AJAX остаётся фундаментом.

Он ввёл этот паттерн. Асинхронный. Модульный. Неблокирующий.

Облачные технологии ушли вперёд. Мобильные устройства захватили рынок. Прогрессивные веб-приложения (PWA) потребовали возможности работы офлайн и высокой скорости. Все они опираются на эти базовые принципы.

Мёртв ли AJAX? Нет.

Он просто стал слоем, лежащим в основе более новых инструментов. Машинным отделением.

Разработчики по-прежнему оптимизируют его. Они по-прежнему заботятся об управлении состоянием, которое он заставил нас решить. Инновации в проектировании интерфейсов? Они построены на этом историческом фундаменте.

Мы постоянно улучшаем пользовательский опыт. Цель остаётся прежней.

Быстро. Отзывчиво. Незаметно.

Но ставки сейчас выше. Безопасность стала строже. Пользователи ожидают поведения, похожего на нативное. И код должен быть доступен для всех.

Это постоянный баланс. Процесс, который вы никогда по-настоящему не завершаете.