0Pricing
Vue Academy · レッスン

useSubscriptionによるリアルタイム購読

WebSocketリンクの設定、useSubscription()、購読データのリアクティブ状態への統合

「useSubscriptionによるリアルタイム購読」はCoddyKit上の無料Vue Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはVue Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Vue Academyコースには全4レッスンが含まれています。

サブスクリプションによるリアルタイム通信

GraphQL のサブスクリプションは、永続的な接続を通じてサーバーからクライアントへデータをプッシュします。クエリが一度だけデータを取得するのに対し、サブスクリプションは更新をストリーム配信します。チャット、ライブフィード、通知に最適です。

WebSocket トランスポート

サブスクリプションには長時間維持される接続が必要なため、HTTP ではなく WebSocket を使用します。graphql-wsライブラリは、GraphQLWsLinkを通じて最新のプロトコルを提供します。

npm install graphql-ws

WebSocket リンクを作成する

graphql-wsクライアントを、wss://のサブスクリプションエンドポイントを指すGraphQLWsLinkでラップします。

import { GraphQLWsLink } from '@apollo/client/link/subscriptions'
import { createClient } from 'graphql-ws'

const wsLink = new GraphQLWsLink(createClient({
  url: 'wss://api.example.com/graphql'
}))

トランスポートの問題

クエリとミューテーションは引き続き HTTP で送信し、サブスクリプションは WebSocket で送信する必要があります。すべてに同じリンクを使うことはできないため、操作の種類ごとにトラフィックをsplitする必要があります。

リンクを分割する

split関数は各操作をルーティングします。解析済みの操作定義に基づき、サブスクリプションは WebSocket リンクへ、それ以外は HTTP リンクへ送ります。

import { split, HttpLink } from '@apollo/client/core'
import { getMainDefinition } from '@apollo/client/utilities'

const httpLink = new HttpLink({ uri: '/graphql' })

const link = split(
  ({ query }) => {
    const def = getMainDefinition(query)
    return def.kind === 'OperationDefinition' && def.operation === 'subscription'
  },
  wsLink,
  httpLink
)

分割したリンクをクライアントに組み込む

単純なuriの代わりに、結合したlinkを Apollo クライアントに渡します。これでクライアントは各操作のルーティング方法を認識できます。

const apolloClient = new ApolloClient({
  link,
  cache: new InMemoryCache()
})

useSubscription の基本

useSubscriptionコンポーザブルはストリームを開き、リアクティブな状態を返します。useQueryと同様に、result、loading、errorを提供します。

import { useSubscription } from '@vue/apollo-composable'
import { gql } from '@apollo/client/core'

const { result } = useSubscription(gql(
  'subscription { messageAdded { id text } }'
))

プッシュごとの処理

onResultフックを使うと、プッシュされたイベントが届くたびに処理できます。ストリーミングデータを扱う自然な場所です。

const { onResult } = useSubscription(MESSAGE_ADDED)
onResult((res) => {
  console.log('New message', res.data.messageAdded)
})

リアクティブな配列に追加する

よく使われるパターンは、ローカルのリアクティブな配列を保持し、新しいイベントが届くたびに追加する方法です。これにより、テンプレートに増え続けるライブリストが表示されます。

const messages = ref([])
const { onResult } = useSubscription(MESSAGE_ADDED)
onResult((res) => {
  messages.value.push(res.data.messageAdded)
})

サブスクリプションの変数

サブスクリプションにはクエリと同じように変数を渡せます。たとえば、1 つのチャットルームのメッセージだけを購読できます。

useSubscription(
  gql('subscription($room: ID!) { messageAdded(room: $room) { text } }'),
  { room: 'general' }
)

サブスクリプションとポーリング

ポーリングはタイマーに従ってクエリを再取得します。一方、サブスクリプションは何かが変わったときだけデータをプッシュします。真のリアルタイムデータにはサブスクリプションの方が効率的ですが、ほぼリアルタイムで十分な場合はポーリングの方が簡単です。

理解度チェック

サブスクリプションについての知識を確認しましょう。

まとめ

リアルタイムサブスクリプションについて学びました。

  • サブスクリプションは、GraphQLWsLink(graphql-ws)を介して WebSocket でデータをプッシュします。
  • split() を使って、サブスクリプションは WS 経由で、クエリとミューテーションは HTTP 経由で送信します。
  • useSubscription はリアクティブな result を返し、プッシュごとに onResult を実行できます。
  • プッシュされたイベントをリアクティブな配列に追加すると、ライブリストを作成できます。

よくある質問

「useSubscriptionによるリアルタイム購読」レッスンは無料ですか?

はい。「useSubscriptionによるリアルタイム購読」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Vue Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Vue Academyコースには全4レッスンが含まれています。

「useSubscriptionによるリアルタイム購読」で何を学びますか?

WebSocketリンクの設定、useSubscription()、購読データのリアクティブ状態への統合 ブラウザで直接実行するハンズオンコードでVue Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Vue Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのVue Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「useSubscriptionによるリアルタイム購読」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このVue Academyレッスンでコードを書いて実行できますか?

はい。すべてのVue Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Vue 3でのApollo Client設定
  2. データ取得のためのuseQuery
  3. データ変更のためのuseMutation
  4. useSubscriptionによるリアルタイム購読
← Vue Academyに戻る