【Vue.js】SSE(Server-Sent Events)でリアルタイム通知を表示する方法

【Vue.js】SSE(Server-Sent Events)でリアルタイム通知を表示する方法 Vue.js

リアルタイム性が求められる通知やモニタリング系のWebアプリにおいて、クライアントからサーバーへ一方通行で継続的にデータを送信できるSSE(Server-Sent Events)は、実装がシンプルかつ高パフォーマンスな選択肢です。この記事では、Vue.jsでSSEを使ってリアルタイム通知を表示する方法を解説します。

SSEとは

SSEは、HTTP接続を通じてサーバーからクライアントに継続的にデータを送信する仕組みであり、次のような特徴があります:

  • クライアントからのリクエストは最初の1回のみ
  • WebSocketより簡易でHTTPベース
  • ブラウザ標準API EventSource を使用

バックエンド(例:Node.js / Express)側のSSEエンドポイント

const express = require('express')
const app = express()

app.get('/events', (req, res) => {
  res.setHeader('Content-Type', 'text/event-stream')
  res.setHeader('Cache-Control', 'no-cache')
  res.setHeader('Connection', 'keep-alive')

  const sendEvent = () => {
    const timestamp = new Date().toLocaleTimeString()
    res.write(`data: 通知を受信しました(${timestamp})\n\n`)
  }

  const interval = setInterval(sendEvent, 5000)

  req.on('close', () => {
    clearInterval(interval)
    res.end()
  })
})

app.listen(3000, () => {
  console.log('SSEサーバー起動中 http://localhost:3000/events')
})

Vue側でEventSourceを使って接続

<template>
  <div>
    <h2>リアルタイム通知</h2>
    <ul>
      <li v-for="(msg, index) in messages" :key="index">{{ msg }}</li>
    </ul>
  </div>
</template>

<script setup>
import { ref, onMounted, onUnmounted } from 'vue'

const messages = ref([])
let eventSource = null

onMounted(() => {
  eventSource = new EventSource('http://localhost:3000/events')

  eventSource.onmessage = (event) => {
    messages.value.unshift(event.data)
  }

  eventSource.onerror = () => {
    console.error('SSE 接続エラー')
    eventSource.close()
  }
})

onUnmounted(() => {
  if (eventSource) eventSource.close()
})
</script>

実行結果の例

5秒おきにサーバーから送信された通知が一覧としてVueコンポーネントに追加され、リアルタイムで画面が更新されます。

SSEのメリットと注意点

  • HTTP/1.1で動作し、WebSocketほどの初期設定が不要
  • 双方向通信は不可(クライアント → サーバー通信が必要なら別途実装)
  • プロキシ環境や古いブラウザ(IE)での対応に注意

まとめ

Vue.jsとSSEを組み合わせれば、簡単にリアルタイム通知機能を実現できます。シンプルな構成でサーバーからの継続的な情報配信が可能なため、ダッシュボードや監視ツール、チャット通知などさまざまな用途に活用できます。WebSocketほどの柔軟性が不要なケースでは、まずはSSEから導入を検討してみましょう。