Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】How to Set Up WebSocket Communication Between a Chrome Extension and a Node.js Server

2025年10月05日に「Dev.to」が公開したITニュース「How to Set Up WebSocket Communication Between a Chrome Extension and a Node.js Server」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

サーバーがWeb UIをリアルタイム制御する技術を紹介する。HTTPの限界を克服し、WebSocketでNode.jsサーバーとChrome拡張機能が常時接続。拡張機能のバックグラウンドスクリプトでUIを動的に更新する具体的な方法を解説する。

ITニュース解説

この解説では、ブラウザの拡張機能とサーバーがリアルタイムで連携し、サーバー側からブラウザの表示内容(UI)を動的に変更するシステム構築について説明する。従来のウェブ通信の課題から始め、それを解決するWebSocket技術、そして実際のシステムアーキテクチャと実装について解説する。

まず、従来のウェブ通信の主流であるHTTPについて理解する必要がある。HTTPは、クライアント(例えばウェブブラウザ)がサーバーにリクエストを送信し、サーバーがそれに応答すると接続が終了するという、一方向かつ短期的な通信モデルを採用している。これは、ウェブページの内容やAPIデータを取得するといった一般的な用途には十分だが、サーバーが能動的に、かつリアルタイムでクライアントの状態を更新したり、UIを制御したりする場面では不向きだ。例えば、ユーザーの環境に応じてブラウザの明るさやコントラストを自動調整するシステムを考えた場合、サーバーが「ユーザーの画面が明るすぎるから暗くしたい」と判断しても、クライアントから何らかのリクエストがない限り、サーバー側からアクションを起こすことができない。

このようなHTTPの限界を克服するために登場するのがWebSocketである。WebSocketは、一度接続が確立されると、その接続が永続的に維持される「全二重通信プロトコル」である。初期の「ハンドシェイク」と呼ばれる接続確立プロセスを経てしまえば、クライアントとサーバーの双方が、いつでも自由にデータを送受信できるようになる。HTTPが「リクエスト-レスポンス」という一連の流れで接続が切れるのに対し、WebSocketは接続が継続し、双方向でデータをやり取りできるため、チャットアプリケーションや株価のリアルタイム更新、オンラインゲームなど、リアルタイム性が求められる用途に非常に適している。この特性により、サーバーが「フォントサイズを大きくする」といった命令を、クライアントのリクエストを待つことなく即座に送信し、クライアントのUIを直接制御することが可能になる。

このシステムは、サーバーがクライアントのUIを動的に変更する「サーバー駆動型UI」を目指して設計された。バックエンドにはNode.jsを使い、通信プロトコルとしてWebSocket(wsライブラリ)を、クライアント側にはTypeScriptで開発されたChrome拡張機能を利用している。特にChrome拡張機能において、WebSocket接続を管理する場所の選択が重要となる。Chrome拡張機能には主に三つのコンポーネントがある。一つ目は「ポップアップ」で、拡張機能のアイコンをクリックしたときに表示される一時的なUIウィンドウだ。二つ目は「コンテンツスクリプト」で、ウェブページ内に直接埋め込まれ、そのページのDOM(表示内容)を操作する。これらはウェブページの更新やUIの閉じ方によってライフサイクルが終了してしまうため、永続的なWebSocket接続を維持するには適さない。

そこで採用されたのが、拡張機能のバックグラウンドで常に実行される「バックグラウンドスクリプト(background.ts)」である。このスクリプトは拡張機能のライフサイクルを通じて永続的に稼働するため、WebSocketのような持続的な接続を安定して管理できる。さらに、Chrome拡張機能には厳格なコンテンツセキュリティポリシー(CSP)の制限があり、ウェブページとは異なる特殊な環境で動作する。バックグラウンドスクリプトは、これらの制約の中でもサーバーとのWebSocket接続を安全に維持し、サーバーからのメッセージをポップアップやコンテンツスクリプトに中継する役割を果たすことができるため、最も安定した選択肢となる。

実際のシステム実装では、バックエンドのNode.jsサーバーはwsライブラリを使用してWebSocketサーバーを起動する。サーバーはクライアントからの接続を受け付けると、「クライアントが接続しました」というログを出力し、メッセージを受信すると、それをコンソールに表示して同じ内容をクライアントに送り返すという「エコーサーバー」として動作する。クライアント側であるChrome拡張機能のbackground.tsでは、WebSocketオブジェクトを用いてサーバーに接続を試みる。接続が成功すると「WebSocket接続しました」とログに表示し、サーバーに接続メッセージを送信する。サーバーからのメッセージを受信すると、それをコンソールに表示し、必要に応じてポップアップなど他の拡張機能コンポーネントへメッセージを中継する。もし接続が切断された場合は、自動的に3秒後に再接続を試みるロジックも組み込まれており、安定した通信を維持するための工夫がなされている。

基本的な接続が確認された後、このシステムに動的なダークモード制御機能が追加された。これは、サーバーが5秒ごとにランダムなダークモード設定(明るさ、コントラスト、グレースケール、セピアの度合いなど)を生成し、JSON形式のデータとしてWebSocketを通じてクライアントに送信する機能だ。クライアント側のbackground.tsは、このJSONデータを受信すると、データの内容を解析し、UPDATE_FILTERという種類のメッセージであれば、そのペイロード(具体的な設定値)に基づいて拡張機能のダークモード設定を更新する。そして、現在開いている全てのブラウザタブに対して、新しいダークモードスタイルを即座に適用する。これにより、ユーザーのブラウザの表示がサーバーの指示によってリアルタイムに変化し、サーバー駆動型UIの概念が具体的に動作する様子を体験できる。

このプロジェクトは、Node.jsバックエンドとChrome拡張機能クライアント間のWebSocket通信を用いたリアルタイムUI適応に関する貴重な実験となった。主要な学びとしては、サーバーが能動的にクライアントを制御する「サーバー駆動型UI」を実現するには、HTTPのような単方向のリクエスト-レスポンスモデルでは不十分であり、WebSocketが提供する双方向かつイベントベースの永続的通信が不可欠であるという点だ。また、Chrome拡張機能の環境において、安定した永続的接続を管理するためには、バックグラウンドスクリプトが最も適切な場所であることも確認された。この経験は、将来的にサーバーが単にデータに応答するだけでなく、ユーザーの状況や環境に応じてクライアントの体験を積極的に調整・最適化する、適応型で文脈認識的なブラウザシステムを構築するための重要な基盤となるだろう。

関連コンテンツ

関連ITニュース