Node.js 原生 WebSocket:無需套件的即時通訊方案
在 Node.js 中實現即時通訊(如聊天室、金融走勢圖)時,開發者長期以來都依賴 socket.io 或著名的 ws 套件。然而,隨著 Node.js 持續對齊瀏覽器 Web 標準,從 Node.js 21.0.0 開始,官方正式引入了實驗性的原生 WebSocket 支援。
這意味著現在你可以使用與瀏覽器端完全一致的 API,在 Node.js 中建立 WebSocket 用戶端連線。
為什麼需要原生 WebSocket API?
- API 一致性:同一套前端 WebSocket 邏輯可以近乎無損地搬移到 Node.js 環境執行。
- 減少包體積:在開發輕量級的爬蟲或監控腳本時,不再需要額外安裝外部依賴。
- 效能優勢:基於 Node.js 內建的 Undici 引擎實作,具有極佳的網路處理效能。
實戰開發:建立一個 WebSocket 客戶端
目前原生的 WebSocket 主要是作為「客戶端」使用。你可以連接到任何現有的 WebSocket 伺服器(如幣安的時價 API 或你自己的後端)。
1. 啟動實驗性功能
在使用原生 WebSocket 時,目前需要加上 --experimental-websocket 旗標:
node --experimental-websocket index.js
2. 連線與事件監聽
// 注意:在 v22 某些版本後,WebSocket 已被放入全域變體,不需 require
const ws = new WebSocket('wss://echo.websocket.org');
// 當連線開啟時
ws.onopen = () => {
console.log('與伺服器連線成功!');
ws.send('你好!這是一條來自 Node.js 原生 API 的訊息。');
};
// 當收到訊息時
ws.onmessage = (event) => {
console.log('收到伺服器回覆:', event.data);
};
// 當連線關閉時
ws.onclose = () => {
console.log('連線已關閉');
};
// 處理錯誤
ws.onerror = (error) => {
console.error('發生錯誤:', error);
};
與第三方套件的區別
| 特性 | 原生 WebSocket (Experimental) | ws 套件 | Socket.io |
|---|---|---|---|
| 標準符合度 | 完全符合 Web 標準 | 專為 Node 環境設計 | 自定義協定 |
| 伺服器端支援 | 目前僅限客戶端 | 支援 Server & Client | 支援完整生態 |
| 安裝 | 內建 (無需安裝) | 需要 npm install | 需要 npm install |
| 斷線重連 | 需手動實作 | 需手動/外掛 | 內建支援 |
實務建議:何時該使用原生 API?
- 推薦使用:開發測試腳本、輕量化爬蟲、或是你已經在前端有一套成熟的 WebSocket 代碼想在後端復用時。
- 暫時規避:需要建立大型 WebSocket 「伺服器」(Server) 時,目前
ws或socket.io依然是更穩健且功能齊全的選擇。
小細節:原生 WebSocket 回傳的數據預設會根據伺服器端傳來的格式自動轉化為字串或
ArrayBuffer。這與 Web 標準是一致的,在處理二進位數據 (Binary) 時非常方便。總結
- 原生 WebSocket(實驗性)讓 Node.js 更接近現代瀏覽器的開發體驗。
- 它提供了高效、標準、零依賴的客戶端連線方案。
- 雖然還未達到
socket.io的功能豐富度,但對於標準的通訊需求來說已經綽綽有餘。