ホームページ ウェブフロントエンド jsチュートリアル JavaScript と Bun を使用した WebSocket

JavaScript と Bun を使用した WebSocket

Dec 03, 2024 am 06:00 AM

最新のリアルタイム Web アプリケーションを構築する場合、クライアントとサーバー間の効率的でシームレスな通信を確保することが重要です。従来の HTTP リクエスト (ポーリングで使用されるリクエストなど) はステートレスで一方向です。クライアントは (fetch または axios を使用して) サーバーにリクエストを送信し、サーバーは接続が閉じる前に応答します。クライアントが新しいデータを必要とする場合、一定の間隔で新しいリクエストを繰り返し送信する必要があるため、不必要な遅延が発生し、クライアントとサーバーの両方の負荷が増加します。

たとえば、ライブ チャット アプリや株価トラッカーを構築している場合、取得する新しいデータがない場合でも、ポーリングではクライアントが 1 秒ごとに更新をリクエストする必要があります。ここは WebSocket が輝くところです。


WebSocket のアプローチ

WebSocket は、クライアントとサーバーの間に永続的な双方向通信チャネルを提供します。接続が確立されると、サーバーは新しいリクエストを待つことなく、即座に更新をクライアントにプッシュできます。これにより、WebSocket は次のようなリアルタイム更新が不可欠なシナリオに最適になります。

  • ライブ チャット アプリケーションでチャット メッセージを送信します。
  • 通知や更新情報を複数のユーザーに同時にブロードキャストします。
  • 株価、スポーツのスコア、試合状況などのリアルタイム データをストリーミングします。

クライアント側で Vanilla JavaScript を使用し、サーバー側で Bun ランタイムを使用すると、WebSocket の実装が簡単かつ効率的になります。例:

  • クライアントはサーバーにメッセージを送信でき、サーバーはそのメッセージを接続されている他のクライアントに即座にブロードキャストできます。
  • 永続的な接続では、ポーリングとは異なり、接続を再確立する繰り返しのオーバーヘッドが発生しません。

このシナリオでは、WebSocket は従来のポーリング方法よりも待ち時間が短く、サーバー負荷が軽減され、よりスムーズなユーザー エクスペリエンスを提供します。


WebSocket プロジェクトの構築

ステップ 1: Bun プロジェクトのセットアップ

まず、Bun がインストールされていることを確認します。次に、新しい Bun プロジェクトを作成し、新しい空のディレクトリを作成し、新しいディレクトリに入り、bun init コマンドでプロジェクトを初期化します。

mkdir websocket-demo
cd websocket-demo
bun init
ログイン後にコピー
ログイン後にコピー

bun init コマンドは、package.json ファイル、「hello world」index.ts ファイル、.gitignore ファイル、typescript 設定用の tsconfig.json ファイル、および README.md ファイルを作成します。

これで、JavaScript コードの作成を開始できます。スクリプト全体をお見せします。次に、関連するすべての部分を調べます。 Index.ts ファイルを編集できます:

console.log("? Hello via Bun! ?");
const server = Bun.serve({
  port: 8080, // defaults to $BUN_PORT, $PORT, $NODE_PORT otherwise 3000
  fetch(req, server) {
    const url = new URL(req.url);
    if (url.pathname === "/") return new Response(Bun.file("./index.html"));
    if (url.pathname === "/surprise") return new Response("?");

    if (url.pathname === "/chat") {
      if (server.upgrade(req)) {
        return; // do not return a Response
      }
      return new Response("Upgrade failed", { status: 400 });
    }

    return new Response("404!");
  },
  websocket: {
    message(ws, message) {
      console.log("✉️ A new Websocket Message is received: " + message);
      ws.send("✉️ I received a message from you:  " + message);
    }, // a message is received
    open(ws) {
      console.log("? A new Websocket Connection");
      ws.send("? Welcome baby");
    }, // a socket is opened
    close(ws, code, message) {
      console.log("⏹️ A Websocket Connection is CLOSED");
    }, // a socket is closed
    drain(ws) {
      console.log("DRAIN EVENT");
    }, // the socket is ready to receive more data
  },
});
console.log(`? Server (HTTP and WebSocket) is launched ${server.url.origin}`);

ログイン後にコピー
ログイン後にコピー

Bun を使用した基本的な WebSocket サーバーのコードの文書化

以下は提供されたコードの内訳であり、各部分とその機能について説明しています。


サーバーの初期化

mkdir websocket-demo
cd websocket-demo
bun init
ログイン後にコピー
ログイン後にコピー

Bun.serve メソッドは、HTTP リクエストと WebSocket リクエストの両方を処理できるサーバーを初期化します。

  • port: 8080: サーバーがリッスンするポートを指定します。デフォルトは一般的な環境変数、または指定されていない場合は 3000 です。この例では、ポートは 8080 にハードコードされています。より柔軟な方法を提供したい場合は、ポート行を削除し、Bun がポートを管理できるようにする必要があります。したがって、export BUN_PORT=4321; 経由でスクリプトを実行できます。バンランインデックス.ts

HTTPリクエストの処理

console.log("? Hello via Bun! ?");
const server = Bun.serve({
  port: 8080, // defaults to $BUN_PORT, $PORT, $NODE_PORT otherwise 3000
  fetch(req, server) {
    const url = new URL(req.url);
    if (url.pathname === "/") return new Response(Bun.file("./index.html"));
    if (url.pathname === "/surprise") return new Response("?");

    if (url.pathname === "/chat") {
      if (server.upgrade(req)) {
        return; // do not return a Response
      }
      return new Response("Upgrade failed", { status: 400 });
    }

    return new Response("404!");
  },
  websocket: {
    message(ws, message) {
      console.log("✉️ A new Websocket Message is received: " + message);
      ws.send("✉️ I received a message from you:  " + message);
    }, // a message is received
    open(ws) {
      console.log("? A new Websocket Connection");
      ws.send("? Welcome baby");
    }, // a socket is opened
    close(ws, code, message) {
      console.log("⏹️ A Websocket Connection is CLOSED");
    }, // a socket is closed
    drain(ws) {
      console.log("DRAIN EVENT");
    }, // the socket is ready to receive more data
  },
});
console.log(`? Server (HTTP and WebSocket) is launched ${server.url.origin}`);

ログイン後にコピー
ログイン後にコピー
  • fetch(req,server): 受信した HTTP リクエストを処理します。
  • ルート パス /: は、index.html ファイルを提供します。
  • /surprise パス: 楽しいサプライズ絵文字応答を返します ?.
  • /chat パス: 接続を WebSocket 接続に「アップグレード」しようとします。アップグレードが失敗すると、エラー 400 応答が返されます。

WebSocketハンドラー

WebSocket キーは、WebSocket 接続を管理するためのイベント ハンドラーを定義します。

?接続オープン (オープン)

const server = Bun.serve({
  port: 8080, // defaults to $BUN_PORT, $PORT, $NODE_PORT otherwise 3000
  ...
});
ログイン後にコピー

クライアントが WebSocket 接続を確立するとトリガーされます。

  • ws.send(...): 接続を要求したクライアントにウェルカム メッセージを送信します。

✉️ メッセージを受信する(メッセージ)

fetch(req, server) {
  const url = new URL(req.url);

  if (url.pathname === "/") 
    return new Response(Bun.file("./index.html"));

  if (url.pathname === "/surprise") 
    return new Response("?");

  if (url.pathname === "/chat") {
    if (server.upgrade(req)) {
      return; // do not return a Response
    }
    return new Response("Upgrade failed", { status: 400 });
  }

  return new Response("404!");
}
ログイン後にコピー

サーバーがクライアントからメッセージを受信するとトリガーされます。

  • ws.send(...): 受信したメッセージを確認とともにエコーバックします。

⏹️ 接続を閉じる (閉じる)

open(ws) {
  console.log("? A new Websocket Connection");
  ws.send("? Welcome baby");
}
ログイン後にコピー

WebSocket 接続が閉じられるとトリガーされます。

パラメータ:

  • code: 接続を閉じるための理由コード。
  • メッセージ: 閉鎖に関する追加の詳細。

?排水イベント(排水)

message(ws, message) {
  console.log("✉️ A new Websocket Message is received: " + message);
  ws.send("✉️ I received a message from you: " + message);
}
ログイン後にコピー

ドレイン イベントは、WebSocket が一時的に圧倒された後、さらに多くのデータを受け入れる準備ができたときにトリガーされます。


サーバーの起動をログに記録する

close(ws, code, message) {
  console.log("⏹️ A Websocket Connection is CLOSED");
}
ログイン後にコピー

サーバーが実行されると、サーバーの URL をコンソールに記録します。


仕組みについての要約

  1. HTTP リクエスト: 標準の HTTP リクエストを処理します (ファイルの提供やステータスの応答など)。
  2. WebSocket アップグレード: クライアントが /chat に接続するときに、HTTP 接続を WebSocket 接続にアップグレードします。
  3. リアルタイム通信: WebSocket イベント (オープン、メッセージ、クローズ、ドレイン) を使用して、サーバーとクライアント間の永続的な通信を処理します。

サーバーの実行

index.ts ファイルを取得したら、bun run でサーバーを起動できます。

drain(ws) {
  console.log("DRAIN EVENT");
}
ログイン後にコピー

サーバーは準備ができており、稼働中です。これで、クライアントを実装できます。

WebSocket with JavaScript and Bun

次のステップ

WebSocket を処理するためのスクリプトの構造を理解しました。次の手順は次のとおりです。

  • WebSocket クライアントの HTML の実装;
  • 1 つのクライアントから接続されているすべてのクライアントにメッセージを転送するための ブロードキャスト ロジックを実装します。

以上がJavaScript と Bun を使用した WebSocketの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Python vs. JavaScript:学習曲線と使いやすさ Python vs. JavaScript:学習曲線と使いやすさ Apr 16, 2025 am 12:12 AM

Pythonは、スムーズな学習曲線と簡潔な構文を備えた初心者により適しています。 JavaScriptは、急な学習曲線と柔軟な構文を備えたフロントエンド開発に適しています。 1。Python構文は直感的で、データサイエンスやバックエンド開発に適しています。 2。JavaScriptは柔軟で、フロントエンドおよびサーバー側のプログラミングで広く使用されています。

JavaScriptとWeb:コア機能とユースケース JavaScriptとWeb:コア機能とユースケース Apr 18, 2025 am 12:19 AM

Web開発におけるJavaScriptの主な用途には、クライアントの相互作用、フォーム検証、非同期通信が含まれます。 1)DOM操作による動的なコンテンツの更新とユーザーインタラクション。 2)ユーザーエクスペリエンスを改善するためにデータを提出する前に、クライアントの検証が実行されます。 3)サーバーとのリフレッシュレス通信は、AJAXテクノロジーを通じて達成されます。

JavaScript in Action:実際の例とプロジェクト JavaScript in Action:実際の例とプロジェクト Apr 19, 2025 am 12:13 AM

現実世界でのJavaScriptのアプリケーションには、フロントエンドとバックエンドの開発が含まれます。 1)DOM操作とイベント処理を含むTODOリストアプリケーションを構築して、フロントエンドアプリケーションを表示します。 2)node.jsを介してRestfulapiを構築し、バックエンドアプリケーションをデモンストレーションします。

JavaScriptエンジンの理解:実装の詳細 JavaScriptエンジンの理解:実装の詳細 Apr 17, 2025 am 12:05 AM

JavaScriptエンジンが内部的にどのように機能するかを理解することは、開発者にとってより効率的なコードの作成とパフォーマンスのボトルネックと最適化戦略の理解に役立つためです。 1)エンジンのワークフローには、3つの段階が含まれます。解析、コンパイル、実行。 2)実行プロセス中、エンジンはインラインキャッシュや非表示クラスなどの動的最適化を実行します。 3)ベストプラクティスには、グローバル変数の避け、ループの最適化、constとletsの使用、閉鎖の過度の使用の回避が含まれます。

Python vs. JavaScript:コミュニティ、ライブラリ、リソース Python vs. JavaScript:コミュニティ、ライブラリ、リソース Apr 15, 2025 am 12:16 AM

PythonとJavaScriptには、コミュニティ、ライブラリ、リソースの観点から、独自の利点と短所があります。 1)Pythonコミュニティはフレンドリーで初心者に適していますが、フロントエンドの開発リソースはJavaScriptほど豊富ではありません。 2)Pythonはデータサイエンスおよび機械学習ライブラリで強力ですが、JavaScriptはフロントエンド開発ライブラリとフレームワークで優れています。 3)どちらも豊富な学習リソースを持っていますが、Pythonは公式文書から始めるのに適していますが、JavaScriptはMDNWebDocsにより優れています。選択は、プロジェクトのニーズと個人的な関心に基づいている必要があります。

Python vs. JavaScript:開発環境とツール Python vs. JavaScript:開発環境とツール Apr 26, 2025 am 12:09 AM

開発環境におけるPythonとJavaScriptの両方の選択が重要です。 1)Pythonの開発環境には、Pycharm、Jupyternotebook、Anacondaが含まれます。これらは、データサイエンスと迅速なプロトタイピングに適しています。 2)JavaScriptの開発環境には、フロントエンドおよびバックエンド開発に適したnode.js、vscode、およびwebpackが含まれます。プロジェクトのニーズに応じて適切なツールを選択すると、開発効率とプロジェクトの成功率が向上する可能性があります。

JavaScript通訳者とコンパイラにおけるC/Cの役割 JavaScript通訳者とコンパイラにおけるC/Cの役割 Apr 20, 2025 am 12:01 AM

CとCは、主に通訳者とJITコンパイラを実装するために使用されるJavaScriptエンジンで重要な役割を果たします。 1)cは、JavaScriptソースコードを解析し、抽象的な構文ツリーを生成するために使用されます。 2)Cは、Bytecodeの生成と実行を担当します。 3)Cは、JITコンパイラを実装し、実行時にホットスポットコードを最適化およびコンパイルし、JavaScriptの実行効率を大幅に改善します。

Webサイトからアプリまで:JavaScriptの多様なアプリケーション Webサイトからアプリまで:JavaScriptの多様なアプリケーション Apr 22, 2025 am 12:02 AM

JavaScriptは、Webサイト、モバイルアプリケーション、デスクトップアプリケーション、サーバー側のプログラミングで広く使用されています。 1)Webサイト開発では、JavaScriptはHTMLおよびCSSと一緒にDOMを運用して、JQueryやReactなどのフレームワークをサポートします。 2)ReactNativeおよびIonicを通じて、JavaScriptはクロスプラットフォームモバイルアプリケーションを開発するために使用されます。 3)電子フレームワークにより、JavaScriptはデスクトップアプリケーションを構築できます。 4)node.jsを使用すると、JavaScriptがサーバー側で実行され、高い並行リクエストをサポートします。

See all articles