# GO-DESK-8: Wails v3 迁移变更分析

> 范围: `44847e0`(v0.4.0) → `f54bf1c`(fs-only-v3) | 提交数: 1 | 日期: 2026-05-01

## 变更总览

| 类别 | 数量 | 说明 |
|------|------|------|
| 重命名 | 77 | web/ → frontend/（git rename，历史保留） |
| 新增 | 94 | v3 构建模板 + bindings + 新文件 |
| 删除 | 4 | 旧文件（clipboard png、md5、v2 transport/types） |
| 修改 | 10 | 核心代码适配 v3 API |
| **合计** | **185** | **+7,772 / -918 行** |

---

## 一、框架升级（核心）

### Wails v2 → v3 API 映射

| v2 (旧) | v3 (新) | 文件 |
|---------|---------|------|
| `wails.Run(&options.App{...})` | `application.New()` + `Window.NewWithOptions()` | main.go |
| `options.App.Bind: []interface{}{app}` | `Services: []application.Service{application.NewService(app)}` | main.go |
| `AssetServer: &assetserver.Options{}` | `Assets: application.AssetOptions{Handler, Middleware}` | main.go |
| `app.Startup(ctx)` / `app.Shutdown(ctx)` | `app.ServiceStartup(ctx, opts)` / `app.ServiceShutdown()` | app.go |
| `runtime.Window(ctx)` | `a.mainWindow`（手动注入） | app.go |
| `runtime.*` 函数调用 | `window.*` 方法 + v3-bindings 自动生成 | 前端 |
| `//go:embed all:web/dist` | `//go:embed all:frontend/dist` | main.go |

### main.go 实质性变更
- **Middleware 中间件**: 拦截 `/wails/custom.js` 返回空 200，消除控制台 404
- **DevTools**: 延迟 2s 调用 `window.OpenDevTools()`（production + devtools build tag）
- **窗口主题**: Windows CustomTheme 配置亮/暗模式标题栏颜色

### app.go 实质性变更
- **新增** `SetMainWindow()` — v3 需要手动注入窗口引用
- **新增** `SetWindowTitleBarColor()` — v3 窗口主题色动态切换
- **新增** `sync.Mutex` — 并发安全保护 mainWindow
- **生命周期**: `Startup/Shutdown` → `ServiceStartup/ServiceShutdown`（返回 error）
- **错误处理**: panic → return error（符合 Go 惯例）

---

## 二、前端代码修改（有业务逻辑变化的）

### App.vue (+375/-60 行)
- Tabs padding-top 覆盖（Arco Design 默认 16px → 0）
- import 路径更新：`@/wailsjs/v3-bindings/u-desk/app`
- 窗口控制方法改用 v3 binding 导入

### Sidebar.vue (+406 行)
- **新架构**: 双区块折叠（收藏夹 + 帮助文档），各自独立 header + content
- **滚动优化**: `.sidebar overflow:hidden` + 收藏内容区 `overflow-y:auto` 内部滚动
- **帮助区块**: 固定底部 `flex-shrink:0`，默认展开
- 折叠动画: max-height + opacity CSS transition

### useFavorites.ts (+259 行)
- **修复**: `longPressTimer` const → let（解决 Assignment to constant variable TypeError）

### stores/ (config/theme/update)
- **config.ts**: Wails v3 绑定加载方式调整
- **theme.ts**: 窗口主题色通过 v3 API 设置
- **update.ts**: 更新检查逻辑适配 v3 事件系统

### wails-transport.ts (+121 行)
- **全新**: v3 transport 层实现（替代 v2 的 runtime 调用）

### UpdateNotification.vue / UpdatePanel.vue
- 事件监听从 v2 runtime 改为 v3 OffAll/events 模式

---

## 三、依赖变更

```diff
- github.com/wailsapp/wails/v2 v2.12.0
+ github.com/wailsapp/wails/v3 v3.0.0-alpha.80

- go 1.25.6
+ go 1.26

+ github.com/wailsapp/wails/v3/pkg/w32     # Win32 直接调用
+ dario.cat/mergo v1.0.2                    # 结构体合并
```

移除: `go-toast/v2`（v3 自带通知）、`gosod`/`slicer`（v2 工具库）

---

## 四、新增构建基础设施（94 个文件，均为 Wails v3 标准模板）

以下由 `wails3 task generate` 自动生成，无自定义逻辑：

| 目录 | 用途 |
|------|------|
| `build/config.yml` | 项目配置（dev mode executes 流水线） |
| `Taskfile.yml` | 根级任务定义（dev/build/run） |
| `build/android/` | Android 构建模板（Gradle + Java Bridge） |
| `build/darwin/` | macOS 构建（Info.plist + Icons） |
| `build/ios/` | iOS 构建（Xcode project） |
| `build/linux/` | Linux 构建（AppImage + nfpm） |
| `build/docker/` | Docker 交叉编译 |
| `build/windows/nsis/` | NSIS 安装包脚本 |
| `build/windows/msix/` | MSIX 打包配置 |
| `frontend/src/wailsjs/v3-bindings/` | v3 TypeScript 绑定（自动生成） |
| `frontend/bindings/` | v3 绑定副本（备用路径） |

---

## 五、删除项（4 个文件）

| 文件 | 原因 |
|------|------|
| `cmd/agent/clipboard_*.png` | 截图残留，已归档到 `.archive/` |
| `web/package.json.md5` | 旧完整性校验文件 |
| `web/src/api/wails-transport.ts` | v2 版本，已被 frontend 下新版替代 |
| `web/src/types/window.d.ts` | v2 类型声明，已被 frontend 下新版替代 |

---

## 六、风险点

1. **alpha.80 稳定性**: Wails v3 仍为 alpha，部分 API 可能后续 breaking change
2. **OpenDevTools sleep hack**: 2s 硬编码延迟不够可靠，待 OnDomReady 稳定后替换
3. **v2 bindings 残留**: `frontend/src/wailsjs/wailsjs/`（v2）仍随重命名保留在 frontend/ 下，如不再使用应清理
