Vue2项目中WebSocket实时通信实战:从工具封装到状态管理

vue2 封装 webSocket 开箱即用(或 uni.connectSocket) 开箱即用 封装 webSocket。 阅读详情

1. 为什么你的Vue2项目需要一个“活”的WebSocket?

最近在做一个后台管理系统,里面有个需求是要实时弹窗显示服务器的告警信息。一开始我图省事,直接写了个定时器,每隔5秒就发个HTTP请求去问后端:“老哥,有新的告警吗?” 结果没两天,后端同事就来找我了,说我这请求太频繁,服务器压力有点大。而且更尴尬的是,有时候告警都发生十几秒了,我这边才轮询到,用户看到的根本不是“实时”告警。

这其实就是典型的“用牛刀杀鸡,结果发现刀不够快”。HTTP协议本身是“请求-响应”模式,就像你打电话问朋友“在干嘛”,他回答你,然后电话就挂了。你想知道他的最新动态,只能再打过去。而WebSocket不一样,它更像你们俩开了一个持续的电话会议,一旦接通,任何一方都可以随时说话,信息是双向、实时流动的。对于聊天、实时通知、监控数据推送这种场景,WebSocket才是那把趁手的“瑞士军刀”。

在Vue2项目里,尤其是中大型项目,直接把 new WebSocket() 写在组件里是下下策。我见过不少新手朋友这么干,结果就是:

  1. 连接管理混乱:页面跳转时,忘记关闭旧连接,导致内存泄漏和后台一堆无用连接。
  2. 状态分散:数据收回来了,有的存在组件的 data 里,有的用 EventBus 乱发,后期维护像在走迷宫。
  3. 重连逻辑缺失:网络一波动,连接断了就再也连不上了,用户只能刷新页面。

所以,咱们今天要聊的,不是简单地调用几个WebSocket API,而是如何在Vue2的工程化环境下,系统化地解决实时通信问题。核心就两点:一是把WebSocket操作封装成一个可靠、易用的工具;二是把通信产生的数据,优雅地融入Vuex状态管理流。这样,无论你的项目是全局告警、在线协同编辑还是实时数据大屏,这套架构都能让你稳如老狗。

2. 第一步:打造你的专属WebSocket工具类

直接裸用 WebSocket API,就像开手动挡的车,虽然直接,但在复杂的城市路况(项目)里容易手忙脚乱。我们的目标是把它升级成“自动挡”,甚至带“自动驾驶辅助”。

2.1 基础连接封装:不止是 new WebSocket()

原始文章里给出了一个很基础的 websocket.js 工具函数,它解决了浏览器兼容性和Promise化的问题,这是个很好的起点。但在实战中,这远远不够。我们需要一个更健壮、功能更全面的类。

// utils/websocket.js
class MyWebSocket {
  constructor(url, options = {}) {
    // 核心配置
    this.url = url;
    this.ws = null;
    this.reconnectCount = 0; // 当前重连次数
    this.maxReconnectAttempts = options.maxReconnectAttempts || 5; // 最大重连次数
    this.reconnectInterval = options.reconnectInterval || 3000; // 重连间隔(ms)
    this.heartbeatInterval = options.heartbeatInterval || 30000; // 心跳间隔(ms)
    this.heartbeatTimer = null;
    this.reconnectTimer = null;

    // 事件回调映射
    this.eventHandlers = {
      open: [],
      message: [],
      error: [],
      close: []
    };

    this._init();
  }

  // 初始化连接
  _init() {
    if (!('WebSocket' in window)) {
      console.error('您的浏览器不支持 WebSocket!');
      return;
    }

    try {
      this.ws = new WebSocket(this.url);
      this._bindEvents();
    } catch (error) {
      console.error('WebSocket 连接创建失败:', error);
      this._handleError(error);
    }
  }

  // 绑定原生事件
  _bindEvents() {
    this.ws.onopen = (event) => {
      console.log('WebSocket 连接成功');
      this.reconnectCount = 0; // 连接成功,重置重连计数
      this._startHeartbeat(); // 开启心跳
      this._emit('open', event);
    };

    this.ws.onmessage = (event) => {
      // 这里可以统一处理消息,比如判断是否是心跳回应
      const data = event.data;
      if (data === 'pong') {
        console.log('收到服务器心跳回应');
        return; // 心跳包不向上传递
      }
      this._emit('message', event);
    };

    this.ws.onerror = (event) => {
      console.error('WebSocket 发生错误');
      this._emit('error', event);
    };

    this.ws.onclose = (event) => {
      console.warn(`WebSocket 连接关闭,代码: ${event.code}`);
      this._stopHeartbeat();
      this._emit('close', event);
      // 非正常关闭,尝试重连
      if (event.code !== 1000
Vue3中WebSocket实时通信实战指南 本文详细介绍了在Vue3项目中实现WebSocket实时通信的完整实战指南。通过封装健壮的useWebSocket自定义Hook,结合组合式API管理连接状态、消息收发、心跳检测与自动重连,并构建了一个完整的实时聊天应用示例,帮助开发者高效处理在线聊天、数据推送等实时场景。 阅读详情

相关推荐

Vue2项目中WebSocket实时通信的实战应用与优化

本文详细介绍了在Vue2项目中实现WebSocket实时通信的实战应用与优化策略。通过对比HTTP轮询,WebSocket在实时性、资源节省和双工通信方面具有显著优势。文章提供了从基础API解析到Vue2工程化封装的完整方案,包括全局告警弹窗的实现、性能优化技巧以及生产环境中的常见问题解决方案,帮助开发者高效构建实时通信功能。

weixin_29292431的博客 375

vue3+webSocket+pinia实现实时双向通信的思路

在现代 web 应用开发中,实时通信变得越来越重要。用户期望能够及时获取最新的数据,并且能够与服务器进行实时交互。Vue 3 作为一个流行的前端框架,提供了强大的响应式系统和组件化开发模式。WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,允许服务器主动向客户端推送数据,实现实时通信。Pinia 是 Vue 的状态管理库,用于集中管理应用的状态,使得状态的管理更加清晰和可维护。本文将介绍如何使用 Vue 3、WebSocket 和 Pinia 实现实时双向通信。Vue 3。

m0_54829066的博客 2430

Vue.js 3 + Pinia + WebSocket 封装断线重连:前端开发

在前端开发中,使用Vue.js 3和Pinia进行状态管理,并结合WebSocket实现实时通信是一种常见的做法。然而,由于网络不稳定或其他原因,WebSocket连接可能会断开。为了确保应用程序的可靠性,我们可以封装一个断线重连的机制,使应用能够自动重新连接到WebSocket服务器。本文将介绍如何在Vue.js 3项目中使用Pinia和WebSocket,以及如何封装断线重连功能。

api_git355的博客 1019

别再为Power BI瀑布图发愁了!用这个DAX公式+堆积柱状图,5分钟搞定现金流量表可视化

本文介绍了一种使用DAX公式和堆积柱状图快速实现Power BI现金流量表可视化的高效方法。通过详细的步骤和代码示例,帮助财务分析人员5分钟内完成专业级报表制作,解决传统瀑布图配置复杂、灵活性差的问题,显著提升工作效率。

weixin_28677005的博客 246

【项目实战】Qt6 录制屏幕、录制声音生成MP4、AVI、MA3等(完整源码,可直接编译使用)

本文将详细介绍如何利用Qt6多媒体模块中的QMediaCaptureSession、QMediaRecorder、QScreenCapture、QAudioInput、QMediaFormat等功能,实现对屏幕和声音的录制,并生成常见的媒体格式文件,如MP4、AVI、MA3等。我们将探讨如何利用这些功能来实现灵活的视频和音频参数设置,以满足不同需求下的录制和生成要求。我们将重点讨论如何配置视频和音频参数,包括分辨率、帧率、编解码器选择、音频采样率、声道设置等。

yegu001的博客 4939

find命令

命令是 Linux/Unix 系统中用于搜索文件和目录的强大工具,支持多种搜索条件组合,并能对搜索结果执行各种操作。以下是其详细说明、常用参数及示例: 搜索路径:指定起始目录(如 、 或 表示当前目录)。 查找条件:基于文件名、类型、大小、时间等属性过滤。 处理动作:对匹配结果执行操作(如打印、删除、执行命令等)。 常用参数及示例 1. 按名称查找 :区分大小写匹配文件名。 :不区分大小写匹配文件名。 2. 按文件类型查找 :指定文件类型。 文件类型: :普通文件 :目录 :符号链接

qiao2458的博客 1134

RK3588上从零部署Facenet人脸识别:PyTorch转ONNX再到RKNN的完整避坑指南

本文提供了在RK3588开发板上从零部署Facenet人脸识别模型的完整指南。详细介绍了从PyTorch模型导出、转换为ONNX格式,再通过RKNN-Toolkit2转换为RKNN格式的完整流程,并重点分享了环境配置、算子兼容性处理、量化调优及板端部署中的关键步骤与避坑经验。

river的博客 463

Zemax实战录——非序列模式下的微透镜阵列仿真与优化

本文详细介绍了在Zemax非序列模式下进行微透镜阵列仿真的完整流程与优化技巧。文章重点阐述了从序列模式切换到非序列模式的必要性,并逐步指导如何搭建光源、阵列与探测器的仿真环境。核心在于通过调整圆锥系数等关键参数优化像差,并增加光线数以提升仿真精度与均匀性,为光学设计提供可靠依据。

weixin_28339967的博客 512

国密GmSSL v2版本命令行方式生成国密sm2私钥、公钥、签名和验证签名

GmSSL是国密算法的工具库(主要包含SM2、SM3、SM4和国密SSL证书生成等功能),项目本身是OpenSSL的分支,但是截至文章发布为止,OpenSSL主分支的国密算法并不完善,目前并不支持签名和解签,所以国密算法这块还是需要使用GmSSL工具库。网上现在并没有v2版本的GmSSL可用的命令行文章,本章用于记录这些命令。本文原创自csdn博客,其他网站看到这篇文章都是盗,版,爬。虫。网站,支持原创,远离盗版。

eguid音视频方向博客,分享经过实践检验的硬核音视频技术。FFmpeg、openCV和JavaCV音视频和图像处理系列教程发布十周年,众多开发者的严格验证。欢迎关注,一起交流探索学习最新音视频和图像处理技术 4604

(持续更新中!)详解【计算机类&面试真题】军队文职考试 ——第二期(真题+解析)| 网络协议的三个核心要素;交互式系统中的非剥夺策略;中断和陷入的区别;可变分区管理中的硬件机制;数据库系统的优点

本篇博客将讨论军队文职面试(计算机类)的几个关键问题。我们将介绍网络协议的核心要素(帮助你理解网络通信的基本原理)、交互式系统中的非剥夺策略(解释为何这是一个优秀的策略以及其对用户体验、系统稳定性和可预测性的影响)、中断和陷入的区别(从引起原因、处理机制、权限级别和应用等方面进行阐述)、可变分区管理的硬件机制以及数据库系统与文件系统的优点比较。通过阅读本文,您将深入了解这些话题,为面试准备和实际应用提供有价值的知识。

追光者♂:记录、分享、总结、提升,现象级专栏《Python从入门到人工智能》作者,无惧黑暗,坚信曙光 1705

情感分析在金融领域的应用:舆情影响股价预测

我们都知道,股价的波动受到多种因素的影响,而大众的情绪和看法就是其中很重要的一部分。我们在日常生活中都有根据别人的评价来判断事物好坏的经验,在金融市场里,舆情就像是大众对某家公司的集体评价,它能反映出市场参与者的情绪和预期。学习这方面的知识,能帮助投资者更好地把握市场动态,做出更明智的投资决策,无论是个人投资者还是金融机构的分析师,都能从中受益。有一天,你看到某家知名企业被曝光了严重的产品质量问题,新闻铺天盖地,股民们也都在热议纷纷,负面情绪弥漫。这时,你会不会觉得这家公司的股价可能要下跌了呢?

AI 原生应用开发的博客 1145

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

上一篇: SpringBoot整合GBase数据库实战:从驱动包下载到JPA配置全流程
下一篇: Log4j高级配置实战:从基础属性到自定义Appender的全面指南
人间清醒863
博客等级 码龄3年 33粉丝 1544原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值