# 窗口自动关闭修复 🔧
## 📋 问题描述
**用户反馈:**
- 点击"确认选择"后,MCP 成功接收到了消息
- 但是页面一直显示"正在配置环境..."的 loading 状态
- 页面没有自动关闭
- 用户需要手动关闭窗口
## 🎯 修复方案
### 核心思路
发送确认/取消/切换账号消息后,立即自动关闭窗口,不再显示 loading 状态。
### 实现方式
**修复前的流程:**
```
用户点击确认
↓
显示 loading
↓
发送 WebSocket 消息
↓
❌ 页面卡在 loading 状态
❌ 用户需要手动关闭
```
**修复后的流程:**
```
用户点击确认
↓
发送 WebSocket 消息
↓
✅ 等待 100ms(确保消息发送完成)
↓
✅ 自动关闭窗口
```
---
## 💻 代码修改
### 1. 确认选择函数
**修改前:**
```javascript
function confirm() {
if (!selectedEnvId) {
console.warn('[env-setup] No environment selected');
return;
}
console.log('[env-setup] Confirming selection:', selectedEnvId);
const loading = document.getElementById('loading');
if (loading) {
loading.style.display = 'flex'; // ❌ 显示 loading
}
if (ws.readyState === WebSocket.OPEN) {
ws.send(JSON.stringify({
type: 'envId',
data: selectedEnvId,
cancelled: false
}));
// ❌ 没有关闭窗口,导致卡住
} else {
console.error('[env-setup] WebSocket not connected');
if (loading) {
loading.style.display = 'none';
}
}
}
```
**修改后:**
```javascript
function confirm() {
if (!selectedEnvId) {
console.warn('[env-setup] No environment selected');
return;
}
console.log('[env-setup] Confirming selection:', selectedEnvId);
if (ws.readyState === WebSocket.OPEN) {
ws.send(JSON.stringify({
type: 'envId',
data: selectedEnvId,
cancelled: false
}));
// ✅ 发送消息后立即关闭窗口
setTimeout(() => {
window.close();
}, 100);
} else {
console.error('[env-setup] WebSocket not connected');
alert('连接已断开,请刷新页面重试'); // ✅ 友好的错误提示
}
}
```
### 2. 取消按钮函数
**修改前:**
```javascript
function cancel() {
console.log('[env-setup] Cancelling');
if (ws.readyState === WebSocket.OPEN) {
ws.send(JSON.stringify({
type: 'envId',
data: null,
cancelled: true
}));
// ❌ 没有关闭窗口
}
}
```
**修改后:**
```javascript
function cancel() {
console.log('[env-setup] Cancelling');
if (ws.readyState === WebSocket.OPEN) {
ws.send(JSON.stringify({
type: 'envId',
data: null,
cancelled: true
}));
// ✅ 发送取消消息后立即关闭窗口
setTimeout(() => {
window.close();
}, 100);
}
}
```
### 3. 切换账号函数
**修改前:**
```javascript
function switchAccount() {
console.log('[env-setup] Switching account');
if (ws.readyState === WebSocket.OPEN) {
ws.send(JSON.stringify({
type: 'envId',
data: null,
switch: true
}));
// ❌ 没有关闭窗口
}
}
```
**修改后:**
```javascript
function switchAccount() {
console.log('[env-setup] Switching account');
if (ws.readyState === WebSocket.OPEN) {
ws.send(JSON.stringify({
type: 'envId',
data: null,
switch: true
}));
// ✅ 发送切换请求后立即关闭窗口
setTimeout(() => {
window.close();
}, 100);
}
}
```
---
## 🔍 技术细节
### 为什么使用 `setTimeout`?
```javascript
setTimeout(() => {
window.close();
}, 100);
```
**原因:**
1. **确保消息发送完成** - WebSocket 的 `send()` 是异步的,需要一点时间完成发送
2. **避免消息丢失** - 如果立即关闭窗口,WebSocket 连接可能在消息发送前就断开
3. **100ms 延迟** - 足够短不影响用户体验,又足够长确保消息发送
### 为什么移除 loading 状态?
**移除前:**
- 显示 loading 状态
- 用户看到"正在配置环境..."
- 但窗口不会自动关闭
- 用户困惑并需要手动关闭
**移除后:**
- 不显示 loading 状态
- 点击确认后立即关闭窗口
- 流程简洁明了
- 用户体验更好
---
## 📊 用户体验对比
### 修复前
```
用户操作流程:
1. 选择环境 ✅
2. 点击"确认选择" ✅
3. 看到"正在配置环境..." ⏳
4. 等待...等待...等待... ⏰
5. 页面一直不关闭 ❌
6. 用户手动关闭窗口 😕
```
**问题:**
- ❌ 用户不知道是否成功
- ❌ 需要手动关闭窗口
- ❌ 体验不够流畅
### 修复后
```
用户操作流程:
1. 选择环境 ✅
2. 点击"确认选择" ✅
3. 窗口立即关闭 ⚡
4. 环境配置完成 ✅
```
**优势:**
- ✅ 操作即时反馈
- ✅ 自动关闭窗口
- ✅ 流程简洁流畅
---
## 🚀 编译结果
```bash
✅ library-esm compiled successfully
✅ library-cjs compiled with 11 warnings
✅ cli-bundle-cjs compiled with 11 warnings
编译时间:~3.2 秒
Bundle 大小:9.5 MB
```
---
## 📝 修改的文件
### `mcp/src/templates/env-setup/scripts.ts`
- ✅ `confirm()` - 移除 loading,添加自动关闭
- ✅ `cancel()` - 添加自动关闭
- ✅ `switchAccount()` - 添加自动关闭
---
## ✅ 验证清单
### 功能验证
- [x] 点击确认后窗口自动关闭
- [x] 点击取消后窗口自动关闭
- [x] 点击切换账号后窗口自动关闭
- [x] WebSocket 消息成功发送
- [x] 不再显示 loading 状态
### 用户体验验证
- [x] 操作流程简洁
- [x] 无需手动关闭窗口
- [x] 反馈及时
### 错误处理验证
- [x] WebSocket 断开时显示友好提示
---
## 💡 设计决策
### 为什么选择立即关闭而不是等待后端确认?
**方案对比:**
| 方案 | 优点 | 缺点 |
|------|------|------|
| **立即关闭** | • 响应快速<br>• 流程简洁<br>• 用户体验好 | • 不知道后端是否处理成功 |
| **等待确认** | • 可以显示成功/失败<br>• 更加保险 | • 需要额外的确认消息<br>• 用户等待时间长<br>• 可能卡住 |
**选择理由:**
1. **WebSocket 已连接** - 消息发送可靠性高
2. **后端会处理** - 即使窗口关闭,后端仍会处理消息
3. **用户体验优先** - 立即关闭给用户更好的反馈
4. **问题已解决** - 原方案导致用户困惑
---
## 🎯 效果总结
### 解决的问题
1. ✅ 窗口不会再卡住
2. ✅ 不再显示"正在配置环境..."
3. ✅ 自动关闭窗口
4. ✅ 操作流程更流畅
### 用户体验提升
- **操作步骤减少** - 无需手动关闭窗口
- **反馈更及时** - 点击后立即关闭
- **流程更清晰** - 操作完成即关闭
---
## 🎊 总结
本次修复通过**立即关闭窗口**的方式解决了"配置环境中"卡住的问题:
1. ✅ **移除 loading 显示** - 不再显示"正在配置环境..."
2. ✅ **自动关闭窗口** - 发送消息后 100ms 自动关闭
3. ✅ **统一处理** - 确认、取消、切换账号都自动关闭
4. ✅ **友好错误提示** - WebSocket 断开时显示 alert
**最终效果:** 一个响应迅速、操作流畅的环境选择流程!⚡✨