確保客戶端和伺服器之間高效、無縫的通訊是建立現代即時 Web 應用程式的關鍵。傳統的 HTTP 請求(如輪詢中使用的請求)是無狀態且單向的。客戶端向伺服器發出請求(例如,使用 fetch 或 axios),伺服器在連線關閉之前做出回應。如果客戶端需要新鮮數據,則必須定期重複發送新請求,從而造成不必要的延遲並增加客戶端和伺服器的負載。
例如,如果您正在建立即時聊天應用程式或股票價格追蹤器,則輪詢將要求客戶端每秒左右請求更新一次,即使沒有新資料可供取得。這就是 WebSockets 的閃光點。
WebSockets 在客戶端和伺服器之間提供持久的雙向通訊通道。連接建立後,伺服器可以立即將更新推送到客戶端,而無需等待新的請求。這使得 WebSockets 非常適合需要即時更新的場景,例如:
在客戶端使用 Vanilla JavaScript,在伺服器端使用 Bun 運行時,使得 WebSocket 的實作變得簡單且有效率。例如:
在這種情況下,WebSocket 比傳統的輪詢方法提供更低的延遲、減少的伺服器負載以及更流暢的使用者體驗。
首先,確保 Bun 已安裝。然後新建一個Bun項目,新建一個空目錄,進入新目錄,透過bun init指令初始化項目:
mkdir websocket-demo cd websocket-demo bun init
bun init 指令將建立 package.json 檔案、「hello world」index.ts 檔案、.gitignore 檔案、用於打字稿配置的 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}`);
以下是所提供程式碼的細分,解釋了每個部分及其功能。
mkdir websocket-demo cd websocket-demo bun init
Bun.serve 方法初始化一個能夠處理 HTTP 和 WebSocket 請求的伺服器。
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}`);
websocket 鍵定義事件處理程序來管理 WebSocket 連線。
const server = Bun.serve({ port: 8080, // defaults to $BUN_PORT, $PORT, $NODE_PORT otherwise 3000 ... });
客戶端建立 WebSocket 連線時觸發。
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!"); }
伺服器收到客戶端訊息時觸發。
open(ws) { console.log("? A new Websocket Connection"); ws.send("? Welcome baby"); }
WebSocket 連線關閉時觸發。
參數:
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 記錄到控制台。
一旦你有了index.ts文件,你就可以透過bun run啟動伺服器:
drain(ws) { console.log("DRAIN EVENT"); }
伺服器已準備就緒並已啟動並正在運行。現在,我們可以實現客戶端了。
現在我們了解了處理 WebSocket 的腳本的結構,接下來的步驟是:
以上是使用 JavaScript 和 Bun 的 WebSocket的詳細內容。更多資訊請關注PHP中文網其他相關文章!