Node.js 原生 WebSocket:無需套件的即時通訊方案

在 Node.js 中實現即時通訊(如聊天室、金融走勢圖)時,開發者長期以來都依賴 socket.io 或著名的 ws 套件。然而,隨著 Node.js 持續對齊瀏覽器 Web 標準,從 Node.js 21.0.0 開始,官方正式引入了實驗性的原生 WebSocket 支援。

這意味著現在你可以使用與瀏覽器端完全一致的 API,在 Node.js 中建立 WebSocket 用戶端連線。

為什麼需要原生 WebSocket API?

  1. API 一致性:同一套前端 WebSocket 邏輯可以近乎無損地搬移到 Node.js 環境執行。
  2. 減少包體積:在開發輕量級的爬蟲或監控腳本時,不再需要額外安裝外部依賴。
  3. 效能優勢:基於 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) 時,目前 wssocket.io 依然是更穩健且功能齊全的選擇。
小細節:原生 WebSocket 回傳的數據預設會根據伺服器端傳來的格式自動轉化為字串或 ArrayBuffer。這與 Web 標準是一致的,在處理二進位數據 (Binary) 時非常方便。

總結

  1. 原生 WebSocket(實驗性)讓 Node.js 更接近現代瀏覽器的開發體驗。
  2. 它提供了高效、標準、零依賴的客戶端連線方案。
  3. 雖然還未達到 socket.io 的功能豐富度,但對於標準的通訊需求來說已經綽綽有餘。