Vue3中WebSocket实时通信实战指南

基于 Vue3 和 WebSocket 实现的简单网页聊天应用 一个基于Vue3和WebSocket的简易网络聊天室项目,包括服务端和客户端部分。项目地址。 阅读详情

1. 为什么你的Vue3项目需要WebSocket?

如果你正在用Vue3开发一个需要“即时感”的应用,比如在线聊天室、实时数据大屏、协同编辑文档,或者一个股票行情推送页面,那你肯定对传统的HTTP请求那种“一问一答”的模式感到头疼。用户发个消息,得等页面刷新或者手动点一下才能看到回复;数据更新了,用户不操作页面就永远看不到最新状态。这种体验,在今天看来已经有点“复古”了。

我刚开始做前端那会儿,为了实现一个简单的消息提醒,用的都是“轮询”(Polling)——就是让前端每隔几秒就发个请求去问问服务器:“有我的新消息吗?” 这种方法简单粗暴,但问题一大堆:浪费流量、增加服务器压力、消息还有延迟。后来接触到了WebSocket,感觉就像从绿皮火车换成了高铁,体验完全不一样了。

简单来说,WebSocket是一种在单个TCP连接上进行全双工通信的协议。你可以把它想象成在你和服务器之间拉了一根“专线电话”。电话一旦接通(连接建立),你们双方都可以随时说话(发送数据),也可以随时听到对方说话(接收数据),不需要反复地挂断再重拨。这对于需要服务器主动“推”数据给客户端的场景,简直是量身定做。

在Vue3里玩转WebSocket,特别是结合其强大的组合式API(Composition API),能让我们的代码组织得更加清晰、模块化,状态管理也更方便。接下来,我就带你从零开始,手把手搭建一个基于Vue3和原生WebSocket的实时聊天应用,把连接、收发消息、断线重连这些核心环节都摸透。

2. 环境准备与项目搭建

2.1 创建一个干净的Vue3项目

工欲善其事,必先利其器。我们首先需要一个Vue3项目作为舞台。这里我推荐使用Vite,它的启动速度和热更新体验都非常棒,能让我们更专注于逻辑开发。

打开你的终端,执行以下命令:

npm create vue@latest vue3-websocket-chat

执行后,命令行会交互式地让你选择一些配置。为了保持项目简洁,我们暂时不需要那么多高级功能,按照下面这样选择即可:

✔ Project name: … vue3-websocket-chat
✔ Add TypeScript? … No
✔ Add JSX Support? … No
✔ Add Vue Router for Single Page Application development? … No
✔ Add Pinia for state management? … No
✔ Add Vitest for Unit Testing? … No
✔ Add an End-to-End Testing Solution? › No
✔ Add ESLint for code quality? … No

选择完成后,进入项目目录并安装依赖:

cd vue3-websocket-chat
npm install

现在,你可以运行 npm run dev 来启动开发服务器。通常Vite会在 http://localhost:5173 启动你的应用。看到欢迎页面,说明项目骨架已经搭好了。

2.2 理解原生WebSocket API

在引入任何第三方库之前,我们先得搞清楚“地基”是什么。浏览器原生提供了 WebSocket 对象,使用起来其实非常直观。它的核心生命周期就几步:创建连接、监听事件、发送消息、关闭连接。

一个最最基础的用法长这样:

// 1. 创建连接,参数是服务器的WebSocket地址,以 ws:// 或 wss:// (加密) 开头
const socket = new WebSocket('ws://你的服务器地址');

// 2. 监听连接打开事件
socket.onopen = function(event) {
  console.log('连接已建立', event);
  // 连接成功后,可以在这里发送第一条消息
  socket.send('Hello Server!');
};

// 3. 监听收到消息事件
socket.onmessage = function(event) {
  console.log('收到服务器消息:', event.data);
  // 通常数据是字符串,也可能是Blob或ArrayBuffer
};

// 4. 监听连接关闭事件
socket.onclose = function(event) {
  console.log('连接已关闭', event.code, event.reason);
};

// 5. 监听错误事件
socket.onerror = function(error) {
  console.error('WebSocket错误:', error);
};

// 主动发送消息
socket.send('这是一条文本消息');

// 主动关闭连接
socket.close(1000, '工作完成,正常关闭');

原生API虽然简单,但在实际项目中直接这样用会有点散乱,状态管理和错误处理都不太方便。接下来,我们就用Vue3的组合式API,把这些逻辑优雅地封装起来,让它变得可复用、好维护。

3. 在Vue3中封装一个健壮的WebSocket Hook

直接在每个组件里写一堆 onopen、onmessage 回调,代码会很快变得难以维护。Vue3的组合式API给了我们完美的解决方案:自定义Hook。我们可以把WebSocket的所有逻辑,包括连接、收发、重连,都封装到一个独立的、可复用的函数里。

3.1 创建 useWebSocket 基础版

我在 src/composables 目录下创建一个 useWebSocket.js 文件(如果你喜欢TypeScript,也可以用 .ts)。这个Hook将是我们整个实时功能的核心。

// src/composables/useWebSocket.js
import { ref, onUnmounted } from 'vue';

export default function useWebSocket(url) {
  // 响应式数据:连接状态、收到的消息列表、错误信息
  const socket = ref(null);
  const isConnected = ref(false);
  const messages = ref([]);
  const error = ref(null);

  // 建立连接
  const connect = () => {
    try {
      // 如果已存在连接,先关闭
      if (socket.value && socket.value.readyState === WebSocket.OPEN) {
        socket.value.close();
      }

      // 创建新的WebSocket实例
      const ws = new WebSocket(url);
      socket.value = ws;

      ws.onopen = () => {
        console.log('WebSocket连接成功');
        isConnected.value = true;
        error.value = null;
        // 可以在这里触发一个自定义事件,通知组件连接成功
      };

      ws.onmessage = (event) => {
        console.log('收到消息:', event.data);
        // 将新消息添加到列表头部,这样最新的消息显示在最上面
        messages.value.unshift({
          data: event.data,
          time: new Date().toLocaleTimeString(),
          type: 'received'
        });
      };

      ws.onerror = (err) => {
        console.error('WebSocket错误:', err);
        error.value = '连接发生错误';
        isConnected.value = false;
      };

      ws.onclose = (event) => {
        console.log('连接关闭', event.code, event.reason);
        isConnected.value = false;
        // 如果不是正常关闭(code 1000),可以尝试自动重连
        if (event.code !== 1000) {
          console.warn('连接异常关闭,3秒后尝试重连...');
         
(精华2020年5月21日更新) vue实战篇 实时通信websocket的封装结合vue的使用 import webSocket from '../webSocket.js'; export default { isIosAndroid() { var u = navigator.userAgent; var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > -1, //android终端 isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/) 阅读详情

相关推荐

Laravel与WebSocket实时通信实战指南

WebSocket作为HTML5标准协议,通过单一TCP连接实现全双工通信,解决了HTTP协议在实时场景下的效率瓶颈。其工作原理是在握手阶段升级HTTP连接为持久化的WebSocket通道,使服务器能主动推送数据到客户端,避免了传统轮询的资源浪费。在PHP生态中,Laravel框架结合Swoole扩展和Laravels加速器,为开发者提供了高性能的WebSocket解决方案。这种技术组合特别适合电商订单跟踪、在线协同编辑、金融行情推送等需要低延迟通信的场景。通过Laravel广播系统和Pusher协议的深度

cuizhu0832的博客 599

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

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

m0_54829066的博客 2431

使用 Vue 3 和 Spring Boot 构建 WebSocket 应用的完整指南

为确保通信的安全性,建议使用 WSS(WebSocket Secure)。对于频繁的小数据量传输,批量发送可以减少网络开销;创建一个新的 Spring Boot 项目,选择 Web、WebSocket 和 Thymeleaf(可选)依赖项。选择 Vue 3 版本和其他必要的特性(如 TypeScript、Router 等),根据提示完成设置。现在,你应该可以在浏览器中访问 Vue 应用程序,并通过 WebSocket 实现实时通信。虽然 Vue 本身不需要额外的 WebSocket 库,但你可以选择安装。

横竖撇折点 676

WebSocket实时通信:35个技术细节,从零搭建高性能Go+前端系统!

文章重点推荐Go语言+前端框架的技术组合,详细分析了Go的goroutine并发模型和gorilla/websocket库在高并发场景下的优势。同时提供了前端集成方案选型建议,涵盖原生API与第三方库的对比,以及Vue/React等框架的适配方案。

Pengyh的博客 1634

基于Laravel的WebSocket实时通信开发实战

Laravel以其优雅的语法和强大的生态系统成为PHP领域最受欢迎的全栈框架之一。其核心架构围绕服务容器服务提供者和门面模式构建,实现了高度解耦与可扩展性。通过服务容器,Laravel管理类的依赖注入与实例生命周期;服务提供者负责将组件注册到容器中,实现模块化加载;而门面则为复杂子系统提供了简洁静态接口。// 示例:通过门面调用缓存服务路由系统支持RESTful风格定义,并结合中间件实现请求过滤与权限控制:// 认证通过后处理消息});

weixin_33068055的博客 1319

AVM环视算法实战:从3D碗型投影到多场景模式切换的实现与优化

本文深入探讨了AVM环视算法在3D碗型投影和多场景模式切换中的实现与优化。通过分析3D碗型投影的核心原理和动态视角调节技术,展示了如何实现从超广角模式到转向模式的无缝切换。文章还分享了性能优化实战经验,包括实时性提升和图像拼接质量优化,为开发者提供了宝贵的AVM系统开发指南。

weixin_42573113的博客 168

HarmonyOS ArkTS开发实战:用Axios封装一个通用的网络请求工具类(附完整代码)

本文详细介绍了如何在HarmonyOS ArkTS开发中利用Axios封装一个通用的网络请求工具类,涵盖架构设计、核心模块实现、UI状态联动及高级功能扩展。通过单例控制器、拦截器链配置和Token自动刷新机制,提升网络请求的稳定性和可维护性,适用于各类HarmonyOS应用开发场景。

weixin_30772105的博客 491

中科蓝讯Downloader配置实战:从软硬开关机到ANC降噪的完整指南

本文提供了中科蓝讯Downloader工具的详细配置实战指南。内容涵盖从基础的软硬开关机选择与配置,到核心的EQ音效调试、触摸按键与入耳检测优化,以及高阶的ANC降噪与电源管理设置。旨在帮助开发者快速掌握关键配置项,高效完成蓝牙耳机产品的功能调试与优化。

s4t5u6v7的博客 508

工业组态软件Intouch(单机版)入门{第一篇}

通俗来讲Intouch就是一个能将PLC里的信号显示在画面上的软件。

weixin_41571357的博客 1万+

JAVA进阶面试题:如何设计一个高并发系统?

如何设计一个高并发系统? 面试官心理分析 说实话,如果面试官问你这个题目,那么你必须要使出全身吃奶劲了。为啥?因为你没看到现在很多公司招聘的 JD 里都是说啥,有高并发就经验者优先。 如果你确实有真才实学,在互联网公司里干过高并发系统,那你确实拿 offer 基本如探囊取物,没啥问题。面试官也绝对不会这样来问你,否则他就是蠢。 假设你在某知名电商公司干过高并发系统,用户上亿,一天流量几十亿,高峰期并发量上万,甚至是十万。那么人家一定会仔细盘问你的系统架构,你们系统啥架构?怎么部署的?部署了多少台机器

uuop155的博客 1019

STM32+4G模块+MQTT协议:从零构建稳定可靠的物联网通讯链路

本文详细介绍了如何利用STM32、4G模块和MQTT协议构建稳定可靠的物联网通讯链路。通过硬件选型、AT指令配置和MQTT连接实战,帮助开发者实现低功耗、高可靠性的数据传输,特别适合户外和移动场景应用。

weixin_29191081的博客 334

完整功能-《网络安全创新实践》:设计并实现一种基于Npcap的网络嗅探器(直接能运行cpp的MFC代码+实验报告)

《网络安全创新实践》:设计并实现一种基于Npcap的网络嗅探器。(直接能跑的MFC)监听所有数据包,以及监听指定IP地址的数据包;(2)能够显示完整的IP数据包首部信息,例如:版本、首部长度、数据包长度、数据包类型(协议字段)、TTL、源IP地址、目的IP地址等;(3)能够显示完整的TCP报文段信息,例如:源端口、目的端口、序号、确认号、数据部分等;(4)能够自动检测SQL注入攻击等Web攻击行为;(5)能够将监听到的数据包信息保存到文件中,以及从文件中读取并显示数据包信息;(6)具有图形化操作界面。

weixin_46531010的博客 660

世界职业院校技能大赛财经赛道项目参考逐字稿五

世界职业院校技能大赛财经赛道项目参考逐字稿五

我是网络安全兼技能大赛工程师,专注网络安全技术学习与技能大赛实战!持续分享最新的技术文章,帮你少走弯路,一起在技术赛道上进步~ 129

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

上一篇: 深入解析BERT模型:从Attention机制到Transformer Encoder的实战应用
下一篇: 【版本适配指南】DevEco Studio 与 HarmonyOS API 版本兼容性全解析
echo99
博客等级 码龄18年 40粉丝 1171原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值