AJAX / SPA

presentation

Created by Rinat Gaynulin

Что же такое AJAX?

AJAX - это НЕ футбольный клуб.

ajax-fc
AJAX – это акроним, раскрывающийся как Asynchronous JavaScript And XML и означающий асинхронный JavaScript и XML. Это набор методов веб-разработки, которые позволяют веб-приложениям работать асинхронно — обрабатывать любые запросы к серверу в фоновом режиме.

Давайте рассмотрим каждый термин отдельно и разберём, что такое AJAX.

view

В состав AJAX входят следующие компоненты:

  • JavaScript – основной ингредиент AJAX, реализующий функциональность на стороне клиента. В функциях JavaScript для манипулирования отдельными частями документа задействуется объектная модель документа (DOM).
  • Объект XMLHttpRequest (встроенный в браузер) позволяет из JavaScript организовать асинхронный доступ к серверу, благодаря чему пользователь имеет возможность продолжать работу с документом, в то время как она выполняет некоторые действия. Под доступом к серверу подразумеваются простые запросы HTTP на выполнение сценариев, размещенный на сервере.
  • Серверные сценарии, необходимые для обслуживания запросов поступающих из JavaScript со стороны клиента. Эти сценарии, как правило, возвращают результаты своей работы в формате XML.

Немного истории

Впервые термин AJAX был публично использован 18 февраля 2005 года в статье Джесси Джеймса Гарретта (Jesse James Garrett) «Новый подход к веб-приложениям». Гарретт придумал термин, когда ему пришлось как-то назвать новый набор технологий, предлагаемый им клиенту.

Однако в той или иной форме многие технологии были доступны и использовались гораздо раньше, например в подходе «Remote Scripting», предложенном компанией Microsoft в 1998 году, или с использованием HTML-элемента IFRAME, появившегося в Internet Explorer 3 в 1996 году.

XMLHttpRequest не был web-стандартом до 2006 года, не смотря на то что он был уже реализован во многих браузерах.

AJAX стал особенно популярен после использования его компанией Google в сервисах Gmail, Google Maps и Google Suggest.

gmail gmaps gsuggest

Альтернативные технологии:

  • Java-апплеты, позднее технология JavaFX
  • Технология Silverlight корпорации Microsoft
  • Протокол WebSocket

Классическая модель веб-приложения:

  1. Пользователь заходит на веб-страницу и нажимает на какой-нибудь её элемент
  2. Браузер формирует и отправляет запрос серверу
  3. В ответ сервер генерирует совершенно новую веб-страницу и отправляет её браузеру и т. д., после чего браузер полностью перезагружает всю страницу


traditional

При использовании AJAX:

  1. Пользователь заходит на веб-страницу и нажимает на какой-нибудь её элемент
  2. Скрипт (на языке Javascript) определяет, какая информация необходима для обновления страницы
  3. Браузер отправляет соответствующий запрос на сервер
  4. Сервер возвращает только ту часть документа, на которую пришёл запрос
  5. Скрипт вносит изменения с учётом полученной информации


traditional

Немного практических примеров:

ajax-demo
ajax-demo

Преимущества использования AJAX:

  • Экономия трафика. Передаются данные только конкретной части страницы, что существенно снижает трафик
  • Уменьшение нагрузки на сервер. Нет надобности обновлять страницу целиком, уходит конкретный запрос.
  • Быстрая работа самого сервиса. Поскольку работа происходит с конкретным блоком, то и результат его работы можно увидеть намного быстрее.
  • Простота проекта. AJAX часто используют для работы с программным кодом и с большой масштабностью проекта.
  • Разнообразие в использовании. Действие AJAX подразумевает под собой не только работу с формами. Например, в поиске Google вы можете видеть подборку поисковых фраз после ввода уже первых букв Вашего запроса.

Обмен данными


ajax in background

Пример кода

          
            // 1. Создаём новый объект XMLHttpRequest
            let xhr = new XMLHttpRequest();

            // 2. Конфигурируем его(устанавливаем соединение):
                  // GET-запрос на URL 'http://domain/service'
            xhr.open('GET', 'http://domain/service');

            // 3. вызывает функцию при смене состояния
            xhr.onreadystatechange = function() {

              // завершился ли запрос?
              if (xhr.readyState !== 4) return;

              if (xhr.status === 200) {
                // Запрос завершен. Здесь можно обрабатывать результат
                console.log(xhr.responseText);
              }
              else {
                // Если код ответа сервера не 200, то это ошибка
                console.log('HTTP error', xhr.status, xhr.statusText);
              }
            };

            // 4. Отсылаем запрос
            xhr.send();
          
        

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

Методы объекта XMLHttpRequest

  • abort() — отмена текущего запроса к серверу.
  • getAllResponseHeaders() — получить все заголовки ответа от сервера.
  • getResponseHeader(«имя_заголовка») — получить указаный заголовок.
  • open(«тип_запроса»,«URL»,«асинхронный»,«имя_пользователя»,«пароль») — инициализация запроса к серверу, указание метода запроса. Тип запроса и URL — обязательные параметры. Третий аргумент — булево значение. Обычно всегда указывается true или не указывается вообще (по умолчанию — true). Четвертый и пятый аргументы используются для аутентификации (это очень небезопасно, хранить данные об аутентификации в скрипте, так как скрипт может посмотреть любой пользователь).
  • send(«содержимое») — это последний этап создания http запроса. С помощью него также можно передать тело запроса т.е. данные от браузера к серверу. Можно не чего не передавать или прямо указать null.
  • setRequestHeader(«имя_заголовка»,«значение») — это метод для указания передаваемых заголовков, здесь мы можем указать что данные идут в url либо закрытым способом, либо хотим получить данные от сервера в json формате.

Свойства объекта XMLHttpRequest

  • onreadystatechange — одно из самых главных свойств объекта XMLHttpRequest. С помощью этого свойства задаётся обработчик, который вызывается всякий раз при смене статуса объекта.
  • readyState — число, обозначающее статус объекта.
  • responseText — представление ответа сервера в виде обычного текста (строки).
  • responseXML — объект документа, совместимый с DOM, полученного от сервера.
  • status — состояние ответа от сервера.
  • statusText — текстовое представление состояния ответа от сервера.

Cвойство readyState:

readystate

P.S. Именно опираясь на состояние готовности объекта можно представить посетителю информацию о том, на какой стадии находится процесс обмена данными с сервером и, возможно, оповестить его об этом визуально.

Пример кусочка кода из реального проекта

primer

Пример ответа сервера

response

Что же такое SPA и как оно сзязано с AJAX?

SPA (single page application) – это веб-приложение, работающее на одной странице. Оно подгружает все необходимые javascript и css файлы при первой загрузке страницы, а затем все общение между клиентом и сервером сводится к минимуму. Т.е. при таком подходе большая часть работы сайта производится на стороне клиента, а если нужно получить данные с сервера, то это обычно делается с помощью JSON.

Такой способ создания сайтов появился относительно недавно, с приходом HTML5, но уже активно набирает обороты. В принципе, здесь нет ничего удивительного, ведь такое веб-приложение будет работать намного быстрее обычных сайтов, да и разработка не займет много времени. Благо, что сейчас уже есть куча фреймворков, которые позволяют создавать очень сложные сайты такого типа достаточно просто и быстро. На данный момент лучшим фреймворком считается React. У него больше плюсов, чем у конкурентов, а также он прост в изучении и использовании.

spa spa

Всем спасибо за внимание!

tony