WebSocket客戶端庫:websocket-fruge365

在這里插入圖片描述

🚀 從零開始打造一個WebSocket客戶端庫:websocket-fruge365

📖 前言

在現代Web開發中,實時通信已經成為不可或缺的功能。無論是聊天應用、實時數據監控,還是在線協作工具,WebSocket都扮演著重要角色。然而,原生的WebSocket API使用起來相對復雜,缺乏自動重連、錯誤處理等實用功能。

今天,我將分享如何從零開始打造一個功能完善的WebSocket客戶端庫 —— websocket-fruge365

🎯 項目目標

在開始編碼之前,我們先明確這個庫要解決的問題:

  • ? 簡化API:提供更簡潔易用的接口
  • ? 自動重連:網絡斷開時自動嘗試重連
  • ? 錯誤處理:完善的錯誤處理機制
  • ? TypeScript支持:提供完整的類型定義
  • ? 跨平臺:同時支持瀏覽器和Node.js環境

🛠? 技術選型

  • 語言:JavaScript (ES6+)
  • 模塊系統:ES Modules
  • 類型定義:TypeScript Declaration Files
  • 包管理:npm
  • Node.js支持:ws庫

🏗? 核心架構設計

1. 狀態管理

let socket = null;
let handleMessage = null;
let handleErr = null;
let reconnectAttempts = 0;
let maxReconnectAttempts = 5;
let reconnectInterval = 3000;
let isManualClose = false;
let originalUrl = '';
let originalToken = null;

2. 核心連接函數

function initSocket(url, token = null) {if (typeof WebSocket === "undefined") {console.error("初始化失敗, 不支持使用WebSocket");return false;}const protocols = token ? [token] : undefined;try {socket = new WebSocket(url, protocols);} catch (error) {console.error('WebSocket連接創建失敗:', error);return false;}// 綁定事件處理器socket.onopen = socketOnOpen;socket.onmessage = socketOnMessage;socket.onerror = socketOnError;socket.onclose = socketOnClose;return true;
}

3. 自動重連機制

socket.onclose = (e) => {console.log('連接關閉', e.code, e.reason);if (!isManualClose && reconnectAttempts < maxReconnectAttempts) {setTimeout(() => {reconnectAttempts++;console.log(`嘗試重連 (${reconnectAttempts}/${maxReconnectAttempts})`);initSocket(originalUrl, originalToken);}, reconnectInterval);}
};

🔧 關鍵功能實現

1. 連接管理

export function connectSocket(url, options = {}) {if (!url) {console.error('WebSocket URL不能為空');return false;}const {token = null,onMessage = null,onError = null,maxReconnectAttempts: maxAttempts = 5,reconnectInterval: interval = 3000} = options;// 設置全局配置maxReconnectAttempts = maxAttempts;reconnectInterval = interval;if (onMessage) handleMessage = onMessage;if (onError) handleErr = onError;// 保存原始參數用于重連originalUrl = url;originalToken = token;return initSocket(url, token);
}

2. 消息發送

export function sendMessage(data) {if (!socket) {console.error('WebSocket未初始化');return false;}if (socket.readyState === WebSocket.OPEN) {try {const message = typeof data === 'string' ? data : JSON.stringify(data);socket.send(message);return true;} catch (error) {console.error('發送消息失敗:', error);return false;}} else {console.warn('WebSocket連接未就緒, 當前狀態:', socket.readyState);return false;}
}

3. 狀態檢查

export function getSocketState() {if (!socket) return 'CLOSED';switch (socket.readyState) {case WebSocket.CONNECTING: return 'CONNECTING';case WebSocket.OPEN: return 'OPEN';case WebSocket.CLOSING: return 'CLOSING';case WebSocket.CLOSED: return 'CLOSED';default: return 'UNKNOWN';}
}export function isConnected() {return socket && socket.readyState === WebSocket.OPEN;
}

📝 TypeScript類型定義

為了提供更好的開發體驗,我們添加了完整的TypeScript類型定義:

export interface WebSocketOptions {/** 可選的token參數 */token?: string;/** 獲取websocket傳過來的數據后的處理函數 */onMessage?: (event: MessageEvent) => void;/** websocket連接出錯后的處理函數 */onError?: (error: Event) => void;/** 最大重連次數,默認5次 */maxReconnectAttempts?: number;/** 重連間隔,默認3000ms */reconnectInterval?: number;
}export type SocketState = 'CONNECTING' | 'OPEN' | 'CLOSING' | 'CLOSED' | 'UNKNOWN';

🎨 使用示例

基本用法

import { connectSocket, sendMessage, closeSocket } from 'websocket-fruge365';// 連接WebSocket
connectSocket('ws://localhost:8080', {onMessage: (event) => {console.log('收到消息:', event.data);},onError: (error) => {console.error('連接錯誤:', error);}
});// 發送消息
sendMessage({ type: 'hello', message: 'Hello WebSocket!' });// 關閉連接
closeSocket();

Vue3中使用

<script setup>
import { connectSocket, sendMessage, closeSocket } from 'websocket-fruge365';
import { onMounted, onUnmounted } from 'vue';const initWebSocket = () => {connectSocket('ws://localhost:8080', {onMessage: (event) => {console.log('收到消息:', event.data);},onError: (error) => {console.error('連接錯誤:', error);}});// 等待連接建立后發送消息setTimeout(() => {sendMessage({ type: 'hello', message: 'Hello from Vue3!' });}, 1000);
}onMounted(() => {initWebSocket();
});onUnmounted(() => {closeSocket();
});
</script>

聊天應用示例

import { connectSocket, sendMessage, isConnected } from 'websocket-fruge365';class ChatClient {constructor(url, userId) {this.userId = userId;this.connect(url);}connect(url) {connectSocket(`${url}?userId=${this.userId}`, {onMessage: this.handleMessage.bind(this),onError: this.handleError.bind(this),maxReconnectAttempts: 5,reconnectInterval: 3000});}handleMessage(event) {const message = JSON.parse(event.data);console.log(`${message.user}: ${message.text}`);}sendChatMessage(text) {if (isConnected()) {sendMessage({type: 'chat',user: this.userId,text: text,timestamp: Date.now()});}}
}

📦 發布到npm

1. 準備package.json

{"name": "websocket-fruge365","version": "1.0.5","description": "一個簡單易用的WebSocket客戶端庫,支持自動重連、錯誤處理和消息管理","main": "index.js","module": "index.js","type": "module","files": ["index.js","socket.js","README.md","types.d.ts"],"keywords": ["websocket","socket","realtime","client","reconnect","javascript","browser","nodejs"],"author": "fruge365","license": "MIT"
}

2. 發布流程

# 登錄npm
npm login# 發布包
npm publish

🚀 項目亮點

1. 簡潔的API設計

  • 只需要一個函數調用即可建立連接
  • 參數通過options對象傳遞,清晰明了
  • 提供了常用的工具函數

2. 健壯的錯誤處理

  • 連接失敗時的自動重連
  • 詳細的錯誤日志輸出
  • 優雅的降級處理

3. 完善的開發體驗

  • 完整的TypeScript類型定義
  • 詳細的文檔和示例
  • 支持多種使用場景

4. 跨平臺兼容

  • 瀏覽器環境原生支持
  • Node.js環境通過ws庫支持
  • 統一的API接口

🔍 遇到的挑戰與解決方案

1. 重連時參數丟失問題

問題:初始連接失敗后,重連時token等參數會丟失。

解決方案:在連接時保存原始參數,重連時使用保存的參數。

// 保存原始參數用于重連
originalUrl = url;
originalToken = token;

2. Node.js環境兼容性

問題:Node.js環境沒有原生WebSocket支持。

解決方案:使用ws庫,并在文檔中說明使用方法。

// Node.js環境
global.WebSocket = require('ws');
import { connectSocket } from 'websocket-fruge365';

3. API設計的簡化

問題:最初的API設計過于復雜,有params參數等冗余設計。

解決方案:簡化API,移除不必要的參數,讓用戶直接在URL中包含查詢參數。

📈 性能優化

  1. 內存管理:及時清理事件監聽器和定時器
  2. 錯誤邊界:添加try-catch保護關鍵代碼
  3. 狀態檢查:發送消息前檢查連接狀態
  4. 參數驗證:對輸入參數進行有效性檢查

🔮 未來規劃

  • 添加心跳檢測機制
  • 支持消息隊列和批量發送
  • 添加連接池管理
  • 提供更多的配置選項
  • 添加單元測試覆蓋

📚 總結

通過這個項目,我學到了:

  1. API設計的重要性:簡潔易用的API是庫成功的關鍵
  2. 錯誤處理的必要性:完善的錯誤處理能大大提升用戶體驗
  3. 文檔的價值:好的文檔能讓用戶快速上手
  4. 類型定義的作用:TypeScript支持能提升開發效率
  5. 測試的重要性:充分的測試能保證代碼質量

🔗 相關鏈接

  • GitHub倉庫:https://github.com/fruge365/WebSocket
  • npm包:https://www.npmjs.com/package/websocket-fruge365
  • 作者博客:https://fruge365.blog.csdn.net/

🎉 結語

開發一個npm包是一個很好的學習過程,不僅能加深對技術的理解,還能為開源社區做出貢獻。希望這個WebSocket客戶端庫能幫助到更多的開發者,也歡迎大家提出建議和貢獻代碼!

如果這個項目對你有幫助,請給個 ? Star 支持一下!


關于作者

我是fruge365,一名熱愛技術的前端開發者。專注于Web開發、JavaScript、Vue.js等技術領域。

  • GitHub: https://github.com/fruge365
  • CSDN博客: https://fruge365.blog.csdn.net/

歡迎關注我的技術分享!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/95545.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/95545.shtml
英文地址,請注明出處:http://en.pswp.cn/web/95545.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

rocketmq批量執行跑批任務報錯

rocketmq批量執行跑批任務&#xff0c;報下面的錯誤&#xff0c;怎么處理一下呢&#xff1f;是修改配置還是修改代碼還是&#xff1f; org.apache.rocketmq.client.exception.MQBrokerException: CODE: 215 DESC: [FLOW]client has exhausted the send quota for the current …

大語言模型(LLM)簡介與應用分享

1. 什么是大語言模型&#xff08;LLM&#xff09; 大語言模型&#xff08;Large Language Model&#xff0c;簡稱 LLM&#xff09;是基于 深度學習 和 海量文本數據 訓練而成的人工智能模型。 采用 Transformer 架構參數規模巨大&#xff08;數十億到數千億&#xff09;能夠 理…

【算法筆記】選擇排序、插入排序、冒泡排序、二分查找問題

算法的筆記&#xff0c;直接上代碼&#xff0c;思路和問題這些&#xff0c;都在代碼注釋上面 1、工具類 為了生成測試代碼和比較器&#xff0c;專門寫了一個數組工具類&#xff0c;代碼如下&#xff1a; /*** 數組工具類*/ public class ArrUtil {/*** 生成隨機數組* 長度是[0,…

行業分享丨基于SimSolid的大型汽車連續沖壓模具剛度分析

*本文投稿自機械零部件制造業用戶 汽車連續模具的剛度直接決定了沖壓件質量&#xff08;尺寸精度、表面缺陷&#xff09;與模具壽命。傳統有限元分析&#xff08;FEA&#xff09;在面對大型復雜模具裝配體時&#xff0c;存在網格劃分困難、計算資源消耗大、周期長等瓶頸。本文以…

用AI生成的html頁面設計放到到Axure上實現再改造的方法

要將 AI 生成的 HTML 原型導入 Axure&#xff0c;該方法的核心邏輯是以 Figma 為 “中間橋梁”&#xff08;因 Axure 無法直接讀取 HTML&#xff0c;需通過 Figma 轉換格式&#xff09;&#xff0c;分 3 步即可完成&#xff0c;以下是詳細操作指南&#xff08;含每步目標、具體…

從入門到實戰:Linux sed命令全攻略,文本處理效率翻倍

從入門到實戰&#xff1a;Linux sed命令全攻略&#xff0c;文本處理效率翻倍 文章目錄從入門到實戰&#xff1a;Linux sed命令全攻略&#xff0c;文本處理效率翻倍一、認識sed&#xff1a;什么是流編輯器&#xff1f;二、吃透sed工作原理&#xff1a;為什么它能高效處理文本&am…

TIOBE 8月編程語言榜深度解析:Python占比突破26%,Perl成最大黑馬

根據TIOBE最新發布的2025年8月編程語言排行榜&#xff0c;一場靜默的技術變革正在上演&#xff1a;Python以26.14%的占比首次突破26%大關&#xff0c;連續12個月穩居榜首。這一數據不僅刷新了Python自身的歷史紀錄&#xff0c;更成為TIOBE指數自2001年創立以來的最高單語言占比…

從發現到恢復,看瑞數信息如何構建“抗毀重構”實戰路徑

在信息化社會&#xff0c;“韌性”“彈性”這些詞匯常被用來形容系統抵御和應對風險的能力&#xff0c;但對于身處關鍵基礎設施行業的運營者來說&#xff0c;這些概念往往過于抽象&#xff0c;難以直接指導實踐。 相比之下&#xff0c;“抗毀重構”更具畫面感。它不僅是一個管理…

深入理解 jemalloc:從內存分配機制到技術選型

在高性能服務&#xff08;如數據庫、緩存、JVM&#xff09;的底層優化中&#xff0c;內存分配效率直接影響系統整體性能。本文將從操作系統底層的malloc機制切入&#xff0c;詳解 jemalloc 的設計理念、開源應用場景、實戰案例&#xff0c;技術選型分析 一、操作系統底層的內存…

websoket使用記錄

1.項目使用記錄1.醫療項目中渲染回收柜溫濕度&#xff0c;需要實時更新2.回收柜安瓿回收和余液回收時&#xff0c;需要前端發送指令給回收柜&#xff0c;比如開門、關門等。還需要收到回收柜結果&#xff0c;比如回收的藥品信息等。我項目中用的是瀏覽器自帶的websoket&#xf…

DevOps篇之通過GitLab CI 流水線實現k8s集群中helm應用發布

一. 設計思路 構建一個 GitLab CI 流水線&#xff0c;并且要集成到 K8s 集群中的 Helm 應用發布流程。首先&#xff0c;需要了解 GitLab CI 的基本結構&#xff0c;比如.gitlab-ci.yml 文件的配置&#xff0c;包括 stages、jobs、變量設置等。然后&#xff0c;結合之前討論的 H…

詳盡 | Deeplabv3+結構理解

https://arxiv.org/pdf/1802.02611.pdf https://link.springer.com/chapter/10.1007/978-3-319-10578-9_23 目錄 Deeplabv3 Encoder部分 Decoder部分 補充摘要 SPP 空間金字塔池化層模塊 Dilated/Atrous Conv 空洞卷積 Deeplabv3 deeplab-v3是語義分割網絡&#xff0c;組…

【51單片機】【protues仿真】基于51單片機音樂盒(8首歌曲)系統

目錄 一、主要功能 二、使用步驟 三、硬件資源 四、軟件設計 五、實驗現象 一、主要功能 1、數碼管顯示當前歌曲序號 2、按鍵切換歌曲和播放暫停? 3、內置8首音樂 二、使用步驟 基于51單片機的音樂盒是一種能夠存儲和播放多首歌曲的電子設備&#xff0c;通過定時器產…

@ZooKeeper 詳細介紹部署與使用詳細指南

文章目錄 **ZooKeeper 詳細介紹、部署與使用** 1. 概述 & 核心介紹 1.1 什么是 ZooKeeper? 1.2 核心特性 1.3 核心概念 1.4 典型應用場景 2. 部署 (以 3 節點集群為例) 2.1 環境準備 2.2 安裝步驟 (在所有節點執行) 2.3 啟動與停止集群 2.4 防火墻配置 (如果開啟) 3. 基本…

騰訊Hunyuan-MT-7B翻譯模型完全指南:2025年開源AI翻譯的新標桿

&#x1f3af; 核心要點 (TL;DR) 突破性成就&#xff1a;騰訊混元MT-7B在WMT25全球翻譯競賽中獲得30/31項第一名雙模型架構&#xff1a;Hunyuan-MT-7B基礎翻譯模型 Hunyuan-MT-Chimera-7B集成優化模型廣泛語言支持&#xff1a;支持33種語言互譯&#xff0c;包括5種中國少數民…

Web 集群高可用全方案:Keepalived+LVS (DR) 負載均衡 + Apache 服務 + NFS 共享存儲搭建指南

文章目錄Keepalived LVS&#xff08;DR&#xff09; Apache NFS項目背景業務場景與核心需求傳統架構的痛點與局限技術方案的選型邏輯項目價值與預期目標項目實踐項目環境基礎配置配置 router配置免密登錄-可選配置 nfs配置 web配置 LVS-RS配置 HA 和 LVS-DS配置 ha1配置 ha2測…

Prometheus監控預警系統深度解析:架構、優劣、成本與競品

目錄 一、Prometheus是什么&#xff1f;核心定位與架構 二、競品分析&#xff08;Prometheus vs. Zabbix vs. Nagios vs. Commercial SaaS&#xff09; 三、部署成本分析 四、服務器資源消耗分析 五、給您的最終建議 一、Prometheus是什么&#xff1f;核心定位與架構 Prom…

Nginx反向代理及配置

Nginx反向代理 二級域名系統 顧名思義&#xff0c;我們有很多的這個不同的二級域名的用戶來訪問我們&#xff0c;比如說微博。它有一個主域名weibo.com。如果我叫一鳴,申請了一個微博&#xff0c;然后我就可以在微博這個主系統上申請一個二級域名來訪問我微博的主頁&#xff0…

嵌入式系統通信總線全景探秘:從板內到云端

引言 在嵌入式系統設計中&#xff0c;選擇合適的通信總線是決定系統性能、成本和可靠性的關鍵因素。從簡單的芯片間通信到復雜的工業網絡&#xff0c;不同的總線技術各司其職&#xff0c;形成了嵌入式世界的"交通網絡"。本文將深入探討五種經典且重要的通信技術&…

2022版Unity創建時沒有2D燈光(2D Light),沒有Global LIght2D怎么辦?

簡單來說就是你的渲染管線沒有升級到URP管線&#xff0c;所以才沒有這些2D燈光 如果你的創建燈光和我一樣&#xff0c;沒有紅線劃掉的部分&#xff0c;說明你和我的問題一樣&#xff0c;看下面的教程可以解決。 1. 確保Unity版本 確保你的Unity版本至少為2019.4或更高版本&…