162 lines
4.0 KiB
Markdown
162 lines
4.0 KiB
Markdown
|
|
# 客服系统Socket连接优化说明
|
|||
|
|
|
|||
|
|
## 优化概述
|
|||
|
|
|
|||
|
|
本次优化采用**简洁的路由控制方案**,实现Socket连接的智能管理:
|
|||
|
|
- **进入页面**:在`mounted`生命周期中自动建立Socket连接
|
|||
|
|
- **离开页面**:在`beforeRouteLeave`路由守卫中立即断开所有Socket连接
|
|||
|
|
|
|||
|
|
## 核心功能
|
|||
|
|
|
|||
|
|
### 🎯 简洁实现
|
|||
|
|
- **页面加载时**:自动建立Socket连接
|
|||
|
|
- **路由离开时**:立即断开所有Socket连接
|
|||
|
|
- **组件销毁时**:全面清理资源
|
|||
|
|
|
|||
|
|
## 技术实现
|
|||
|
|
|
|||
|
|
### 核心生命周期
|
|||
|
|
|
|||
|
|
#### `mounted` - 建立连接
|
|||
|
|
```javascript
|
|||
|
|
async mounted() {
|
|||
|
|
// 获取聊天室列表
|
|||
|
|
await this.fetchRoomList();
|
|||
|
|
|
|||
|
|
// 设置事件监听器
|
|||
|
|
// ...其他初始化代码
|
|||
|
|
|
|||
|
|
// 添加存储变化监听
|
|||
|
|
window.addEventListener("storage", this.handleStorageChange);
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### `beforeRouteLeave` - 断开连接
|
|||
|
|
```javascript
|
|||
|
|
beforeRouteLeave(to, from, next) {
|
|||
|
|
console.log("🚪 离开客服页面,断开Socket连接");
|
|||
|
|
this.disconnectWebSocket();
|
|||
|
|
next();
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### `beforeDestroy` - 清理资源
|
|||
|
|
```javascript
|
|||
|
|
beforeDestroy() {
|
|||
|
|
console.log("🧹 组件销毁,清理资源");
|
|||
|
|
|
|||
|
|
// 断开Socket连接
|
|||
|
|
this.disconnectWebSocket();
|
|||
|
|
|
|||
|
|
// 清理定时器
|
|||
|
|
// 移除事件监听
|
|||
|
|
// ...
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 使用场景
|
|||
|
|
|
|||
|
|
### 1. 页面跳转 🚪
|
|||
|
|
- 用户从任何页面进入客服页面:自动建立连接
|
|||
|
|
- 用户从客服页面跳转到其他页面:立即断开连接
|
|||
|
|
|
|||
|
|
### 2. 浏览器操作 🔄
|
|||
|
|
- 刷新页面:重新建立连接
|
|||
|
|
- 关闭标签页:自动断开连接
|
|||
|
|
|
|||
|
|
### 3. 多窗口管理 🪟
|
|||
|
|
- 每个窗口独立管理自己的连接
|
|||
|
|
- 不会相互干扰
|
|||
|
|
|
|||
|
|
## 性能优势
|
|||
|
|
|
|||
|
|
### 1. **简洁高效** ⚡
|
|||
|
|
- 代码量最少,逻辑最清晰
|
|||
|
|
- 没有复杂的页面可见性检测
|
|||
|
|
- 没有多余的活动时间监测
|
|||
|
|
|
|||
|
|
### 2. **资源节省** 💾
|
|||
|
|
- 确保离开页面时立即断开连接
|
|||
|
|
- 避免僵尸连接占用服务器资源
|
|||
|
|
- 减少不必要的网络活动
|
|||
|
|
|
|||
|
|
### 3. **稳定可靠** 🛡️
|
|||
|
|
- 路由级别的控制更加可靠
|
|||
|
|
- 避免了复杂逻辑带来的潜在bug
|
|||
|
|
- 易于维护和调试
|
|||
|
|
|
|||
|
|
## 关键代码
|
|||
|
|
|
|||
|
|
### Socket连接管理
|
|||
|
|
```javascript
|
|||
|
|
// 建立连接(在 created 中调用)
|
|||
|
|
this.initWebSocket();
|
|||
|
|
|
|||
|
|
// 断开连接(在路由守卫中调用)
|
|||
|
|
this.disconnectWebSocket();
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 路由守卫
|
|||
|
|
```javascript
|
|||
|
|
beforeRouteLeave(to, from, next) {
|
|||
|
|
console.log("🚪 离开客服页面,断开Socket连接");
|
|||
|
|
this.disconnectWebSocket();
|
|||
|
|
next();
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 调试监控
|
|||
|
|
|
|||
|
|
### 控制台日志
|
|||
|
|
```
|
|||
|
|
🚪 离开客服页面,断开Socket连接
|
|||
|
|
🧹 组件销毁,清理资源
|
|||
|
|
🎉 [客服系统] WebSocket 连接成功
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 连接状态
|
|||
|
|
- `isWebSocketConnected`: WebSocket连接状态
|
|||
|
|
- `connectionStatus`: 应用层连接状态
|
|||
|
|
|
|||
|
|
## 优化亮点
|
|||
|
|
|
|||
|
|
### 1. **极简设计** ✨
|
|||
|
|
- 移除了复杂的页面可见性检测
|
|||
|
|
- 移除了用户活动时间监测
|
|||
|
|
- 移除了多余的重连逻辑
|
|||
|
|
|
|||
|
|
### 2. **路由驱动** 🛣️
|
|||
|
|
- 利用Vue Router的生命周期
|
|||
|
|
- 在路由层面控制连接状态
|
|||
|
|
- 更符合SPA应用的设计理念
|
|||
|
|
|
|||
|
|
### 3. **资源清理** 🧹
|
|||
|
|
- 完善的组件销毁清理逻辑
|
|||
|
|
- 确保没有内存泄漏
|
|||
|
|
- 移除所有事件监听器
|
|||
|
|
|
|||
|
|
## 对比优势
|
|||
|
|
|
|||
|
|
| 特性 | 复杂方案 | 简洁方案 ✅ |
|
|||
|
|
|------|---------|------------|
|
|||
|
|
| 代码量 | 大量额外代码 | 最少必要代码 |
|
|||
|
|
| 可维护性 | 复杂难维护 | 简单易维护 |
|
|||
|
|
| 性能开销 | 需要监听多个事件 | 几乎无开销 |
|
|||
|
|
| 可靠性 | 依赖浏览器API | 依赖路由机制 |
|
|||
|
|
| 调试难度 | 复杂状态管理 | 简单直观 |
|
|||
|
|
|
|||
|
|
## 注意事项
|
|||
|
|
|
|||
|
|
1. **连接时机**:Socket连接在组件`created`时建立
|
|||
|
|
2. **断开时机**:在路由离开时立即断开
|
|||
|
|
3. **资源清理**:组件销毁时进行全面清理
|
|||
|
|
4. **兼容性**:依赖Vue Router,适用于所有现代浏览器
|
|||
|
|
|
|||
|
|
## 总结
|
|||
|
|
|
|||
|
|
这个简洁的路由控制方案完美实现了用户的需求:
|
|||
|
|
- ✅ **在当前页面才连接Socket**
|
|||
|
|
- ✅ **离开页面就断开所有Socket连接**
|
|||
|
|
- ✅ **不加多余代码,简洁实现**
|
|||
|
|
|
|||
|
|
通过移除复杂的页面可见性检测和用户活动监测,我们得到了一个更加稳定、高效、易维护的解决方案。
|