世界を動かす技術を、日本語で。

WebSocket上のHTML: 最小限のJavaScriptで実現するリアルタイムSPA

2026年8月13日原文(en.andros.dev)

概要

  • SPA開発 の従来手法とHTML over WebSocketsの比較
  • HTML over WebSockets の仕組みと利点・欠点
  • 既存フレームワーク の状況と用途別の選択指針
  • SSEやHTTP との違いと使い分け
  • フロントエンド・バックエンド統合 による開発効率化

HTML over WebSocketsによるSPA構築の新しいアプローチ

  • SPA(Single-page Application) の伝統的構成はJavaScriptフレームワーク+API(JSON)+2つの独立コードベース
  • HTML over WebSockets では、サーバーが組み立て済みHTMLを送信、クライアントは配置のみ担当
  • レンダリングロジック はすべてバックエンド(単一言語)で完結、APIや契約不要
  • このパターンは hypermedia または HTML over the wire と呼ばれる
  • 通信方式 はアーキテクチャに大きな影響を与え、HTTP・SSE・WebSocketの3種類
    • HTTP:htmxやUnicornなど、リクエスト単位
    • SSE:Datastarなど、サーバーからクライアントへの一方向チャネル
    • WebSocket:Phoenix LiveViewやDjango LiveViewなど、双方向かつ常時接続

WebSocketsによるHTML over the wireの仕組み

  • Chris McCord (Phoenix開発者)がElixirConf 2019でLiveViewを発表し話題に
  • クライアント側のJavaScriptは レンダリング担当ではなく、WebSocketチャネルの維持やHTML配置 が役割
  • サーバーは JSONではなくHTML を生成し、そのまま送信
  • WebSocket を使うことで、常時接続・リアルタイムな双方向通信・サーバーからのプッシュが可能
  • 従来のSPA(API+JSON+レンダリング)との比較
    • 従来:HTTPリクエスト→JSON受信→クライアントでHTML生成
    • WebSocket版:WebSocket経由でリクエスト→HTML受信→クライアントで配置のみ

HTML over WebSocketsのメリット

  • レンダリングエンジン1つ で完結、複雑性削減
  • API不要、契約や中間データ構造も不要
  • 状態管理はサーバー側、各クライアントごとに状態を保持
  • DBへ直接接続、JSONやGraphQLの中継なし
  • リアルタイム性 が高く、ポーリング不要
  • サーバーからのブロードキャスト (全クライアント同時更新)が容易
  • 低レイテンシ・低トラフィック、TCPハンドシェイクやHTTPヘッダの繰り返しが不要
  • 最小限のJavaScript でSPA構築、重いフレームワーク不要
  • SEOにも一定対応、初回ロードのHTMLはインデックス化可能
  • XSS耐性、サーバー側でHTMLエスケープ済み

HTML over WebSocketsのデメリット

  • サーバーリソース増大、各クライアントごとにWebSocketと状態を保持
  • 水平スケール時 は状態共有(例:Django Channels+ASGI+Redis)が必要
  • 大量同時接続時 にリソース設計が重要
  • 高レイテンシ環境 では「即時」感が損なわれる
  • オフライン非対応、接続断時は利用不可
  • 学習コスト、WebSocketサーバーやLiveViewパターンの理解が必要

主要フレームワークと現状

  • Elixir :Phoenix LiveView(WebSocket、成熟・1.x系)
  • Ruby :Hotwire(HTTP+WebSocket/SSE)、Live/Lively(WebSocket、ニッチ)
  • Python/Django :Django LiveView、Reactor、djust(全てWebSocket)、django-unicorn(HTTP/AJAX)、Tetra(AJAX+WebSocket)
  • C#/.NET :Blazor(WebSocket/SignalR)
  • PHP/Laravel :Livewire 3+Reverb(WebSocket、2024年リリース)
  • Agnostic(JS) :htmx(HTTP+WS/SSE拡張)、Datastar(SSE)

SSEやHTTPとの使い分け

  • WebSocket :双方向・低レイテンシが必要な場合(チャット・協働編集・ゲーム等)

  • SSE :サーバーからの一方向プッシュのみで十分な場合(ライブフィード・通知・ダッシュボード等)

  • HTTP :リクエスト/レスポンス単位で十分な場合やシンプルなWebアプリ

    • SSEの特徴
      • 一方向通信のみ、クライアントからの送信は別HTTPリクエストが必要
      • テキストのみ(バイナリ非対応)
      • 高頻度の双方向や重いやりとりには不向き
      • htmxやDatastarなど、SSE利用のフレームワークも存在

まとめと指針

  • HTML over WebSockets は万能解ではないが、用途によっては非常に有効
  • 要件ごとに最適な通信方式 (WebSocket, SSE, HTTP)を選択
  • HTMLを直接送るアーキテクチャ で、APIや契約、フロントエンドの複雑性を大幅削減
  • トレンドや流行のフレームワーク よりも、問題に適した堅実な設計が重要

参考資料

  • Phoenix LiveView公式ドキュメント
  • Phoenix LiveView 1.0リリース記事
  • Hotwire公式サイト
  • htmxドキュメント
  • Turbo Handbook
  • idiomorph(DOMモーフィングライブラリ)
  • Datastar(SSE型ハイパーメディアフレームワーク)
  • MDN: Using server-sent events
  • Laravel Reverb(2024年リリース)

Hackerたちの意見

簡単なルール:双方向で低遅延の通信が必要なら(チャット、コラボレーション、ゲーム)、WebSocketを使うべき。サーバーからのプッシュだけなら、SSEの方が簡単で運用コストも安いよ。大抵のアプリはSSEとHTTPリクエストを作るための組み込みコード(Fetch)を使えばいい。WebSocketを使って自分でクライアントサイドのJSをいじる必要はない。遅延は同じだし、現代のブラウザはオープンな単一のTCP接続上でHTTPリクエストを多重化してるからね。もしクライアントが1秒間にたくさんリクエストを送るなら、各リクエストでフルヘッダーやクッキーを送らない方が有利かもしれないけど、ユーザーのクリックやタッチに応じてリクエストを送る場合は関係ないよ。十分に複雑なSPAは、Fetchの半分をアドホックで、非公式に指定された、バグだらけで遅い実装を含んでる。

遅延は同じだし、現代のブラウザはオープンな単一のTCP接続上でHTTPリクエストを多重化してる。私の経験ではこれは真実じゃない。まず、クライアントサイドで制御できないプラットフォームの実装の詳細に依存してるから。次に、リクエストごとに新しい接続を開かなくても、HTTPスタック全体を通過することになるから、非常にシンプルなWebSocketプロトコルよりも複雑なんだ。HTTP1の世界では、内容を取得するための長さとマスクが必要で、あまり明確でないパーサーを通ることになる。もしHTTP2やHTTP3を確実に使えるなら、遅延は近くなるかもしれないけど、両者の複雑さを考えると、普通のHTTP1で交渉された持続的なWebSocketが一番遅延が少ないと思う。

十分に複雑なSPAは、Fetchの半分をアドホックで、非公式に指定された、バグだらけで遅い実装を含んでる。別の意味では良いアドバイスだけど、この部分はコメントから外してもよかったかも :D 「十分に複雑なSPA」がどれだけ低コードプロジェクトで適当に作られてるかを過小評価してるよ。彼らのメンテナは、あなたが何を話してるのか全然わからないから。

WebTransportについて触れてないのが、この記事に対してすごく疑問を感じる。2026年だし、全てのブラウザがサポートしてるし、双方向でWebSocketよりも低遅延なんだから。

うん、100%そうだね。SSE版は頭が痛くならないし、簡単にスケールできるよ。

ファンアウトプロキシを使わない限り、SSEにはWebSocketに対する利点はないよ。

ただSSEを使えばいい それでユーザーがあなたのウェブサイトをいくつかのタブで開くと、すべてが壊れちゃう。SSE接続が多すぎると、そのオリジンへの普通のHTTPリクエストがブロックされるからね。すべてのタブに共有ワーカーを使えば回避できるけど、その場合はシンプルさの利点を失うことになる。

SSE大好き。でも、実際には制限があるんだ。まだ言われてないけど、バイナリデータを送れないのが一つの制限だね。

この投稿へのいい反応 https://yagni.club/3mstlyuxe5s26

WebSocketよりSSEを選ぶことに対する、しっかりした反論だね。

すごくいい記事だね。TFAよりも説得力がある。シェアしてくれてありがとう!

くそっ

Hacker Newsで議論の続きを見る