Если вы только сейчас настраиваетесь, обязательно прочтите Часть 1, Часть 2 и Часть 3. Не стесняйтесь просматривать полный исходный код и играть в игру!

Если вы прочитали первые несколько частей этой серии, теперь вы должны иметь твердое представление о шагах, необходимых для создания приложения с отслеживанием состояния и реагирования с использованием Vue и Vuex. У вас также должен быть сервер Flask с поддержкой веб-сокетов, готовый начать общение с клиентом в режиме реального времени с помощью Flask-SocketIO. Нам просто не хватает одного элемента - ткани, с помощью которой можно подключить Vue к нашему серверу.

Настроить SocketIO-клиент так же просто, как инициализировать соединение, настроить прослушиватель и создать событие. Для начала приема сообщений не требуется генерировать событие - потребитель может просто подключиться и прослушать, чтобы начать использовать веб-сокет, пока сервер генерирует события. Однако для нашего клиента типично отправлять сообщения на наш сервер, и именно здесь в игру вступает передача событий. Если мы попытаемся сравнить это с моделью RESTful, генерируемое событие будет похоже на GET или POST, а событие, потребляемое слушателем, может быть похоже на наш ответ. Конечно, эти две системы нельзя сравнивать напрямую, поскольку веб-сокеты позволяют нашему серверу отправлять сообщения нашему клиенту, а наш клиент может отправлять сообщение на сервер без ответа. Веб-сокеты - отличная альтернатива REST в определенных обстоятельствах, но REST по-прежнему имеет свое место в стандартной модели ресурсов.

Vue + Vuex ❤ SocketIO

Заставить Vue или Javascript в целом общаться с нашим сервером Flask-SocketIO так же просто, как импортировать клиент SocketIO JS и настроить наше соединение. В стандартном проекте Vue нам нужно будет настроить этого клиента для одного из событий жизненного цикла, такого как created, а затем настроить некоторые прослушиватели и эмиттеры. К счастью, существует плагин Vue Vue-Socket.IO, который помогает упростить этот процесс. Эта библиотека добавляет для нас хуки жизненного цикла для регистрации слушателей и поддерживает интеграцию с Vuex для передачи наших сообщений сокета прямо в наш централизованный диспетчер состояний. Для начала нам нужно установить этот пакет.

npm install vue-socket.io --save

В файле main.js импортируйте клиент Socket.IO и настройте плагин с помощью URL-адреса подключения и нашего хранилища Vuex.

В этом примере URL-адрес подключения будет использовать тот же хост, что и window. Поэтому, если мы запускаем сервер разработки на http://localhost:8080, наш клиент попытается подключиться к этому хосту. Поскольку мы передаем нашу переменную хранилища Vuex инициализатору плагина, Vue-SocketIO вонзится в наше хранилище и разрешит динамические прослушиватели на основе имен мутаций. Мы скоро рассмотрим это подробнее.

Использование в компонентах Vue

Когда мы запустили Vue.use(VueSocketio, `//${window.location.host}`, store), произошло одно важное событие - плагин расширил цепочку прототипов Vue и сделал свой объект сокета глобально доступным. Это позволяет нам легко генерировать события из любого места в нашем проекте Vue, вызывая this.$socket.emit. В следующем примере это демонстрируется с помощью кнопки, которая отправляет сообщение.

Как видите, для отправки сообщения нашему серверу потребовалась только одна дополнительная строка благодаря экземпляру глобального сокета.

Получение сообщений

Теперь, когда наш клиент может разговаривать с нашим сервером, мы также хотим, чтобы он прослушивал входящие сообщения. Как и в нашем стандартном примере веб-сокета, нам просто нужно настроить прослушиватель с нашим клиентом SocketIO. Давайте возьмем за основу приведенный выше пример и послушаем ответ сервера на том же канале.

Во-первых, мы должны инициализировать слушателя - это делается в ловушке жизненного цикла created, поэтому, как только наш компонент будет создан, он начнет прослушивание. Затем мы нажимаем на объекте this.$options.sockets функцию обратного вызова. Этот sockets объект отслеживает всех наших слушателей. Под капотом Vue-SocketIO считывает все значения в этом объекте и регистрирует слушателей. Точно так же, когда слушатель удаляется, он отменяет регистрацию слушателя.

Добавление Vuex в микс

Такая настройка слушателей отлично подходит для простого проекта или разовых слушателей. Однако что, если мы хотим использовать эти данные в нескольких компонентах? Типичный ответ - «Использовать Vuex», но чтобы использовать Vuex, нам нужно настроить слушателей и использовать мутации и действия для хранения данных, верно? Неправильный. Vue-SocketIO упрощает интеграцию ответов сокетов с центральным состоянием.

Поскольку мы передали нашу переменную хранилища инициализатору плагина, Vue-SocketIO легко обрабатывает события сокетов и может автоматизировать хранение данных во Vuex.

Зарегистрировать слушателя с помощью Vuex так же просто, как добавить мутацию с префиксом SOCKET_. Текст после этого префикса - это название нашего канала, который мы хотим слушать. Чтобы преобразовать слушателя из нашего предыдущего примера, который слушал канал hello_world, мы просто создаем мутацию с именем SOCKET_HELLO_WORLD. Ответ нашего сервера на наше сообщение теперь может быть передан другим нашим компонентам!

Заключение

Любое приложение, которое требует обмена данными между клиентом и сервером в реальном времени, может быть повышено с помощью веб-сокетов. SocketIO упрощает этот процесс и предоставляет дополнительные функции по сравнению с необработанными веб-сокетами. Интеграция его в приложение Vue может показаться сложной и обескураживающей, но она упрощена благодаря Vue-SocketIO, который позволяет нам легко подключить наш сервер к нашему хранилищу Vuex всего с помощью пары строк кода.

Спасибо, что прочитали, и, надеюсь, вы сможете применить эту серию к своим собственным проектам и создать приложение в реальном времени с помощью Vue!

Поддерживать нас

  • Дайте этому посту несколько аплодисментов 👏👏👏👏
  • Оставьте отзыв в комментариях к этому посту
  • Присоединяйтесь к нашему каналу Slack
  • Следуйте за нами в Facebook, Twitter, Reddit.