feat(desktop): 迁移 Wails v2 → v3(架构/目录/绑定重写)[WIP]

从 wails/v2 v2.12.0 迁到 v3 v3.0.0-alpha2.117,采用 v3 工程规范:

Go 侧:
- main.go:wails.Run(options.App) → application.New(Options{Services,Assets,Mac})
  + app.Window.NewWithOptions(WebviewWindowOptions) + app.Run();窗口选项照搬
  (1440×900/min 1100×700/#0b0d12/Mac TitleBarHiddenInset)
- app.go:App 结构体绑定 → v3 Service(application.NewService);去 startup/ctx 注入;
  SaveFileDialog 改 v3 链式 API(application.Get().Dialog.SaveFile().SetFilename().
  AddFilter().PromptForSingleSelection());5 个原生方法保留
- go.mod wails/v2→v3、go 1.25

构建:
- wails.json → Taskfile.yml + build/(config.yml 填产品信息 + 各平台配置)
- 删移动端脚手架(ios/android),桌面端只留 darwin/windows/linux
- .gitignore 改为只忽略 build/bin(build/ 构建系统需提交)

前端:
- vite.config 接 @wailsio/runtime/plugins/vite 插件 + WAILS_VITE_PORT
- package.json 加 @wailsio/runtime;wails3 generate bindings → frontend/bindings/
- desktop.ts:window.go.main.App → import { App } from bindings;桌面态检测改
  window._wails.environment(原生注入);isMacDesktop 用 System.IsMac()
- version.ts:runtime.BrowserOpenURL → @wailsio/runtime Browser.OpenURL;测试同步更新
- tsconfig 加 allowJs(消费 JSDoc 绑定)

验证进度:Go 编译过 + tsc 干净 + 48 前端测试绿 + 前端 vite build 通过。
**未完成:整体 wails3 build/dev 原生窗口实跑 + 原生能力(另存为/打开/外链)联调**——下次续。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Blizzard
2026-07-13 18:00:45 +08:00
parent 8f1aefe13e
commit 1f487c3163
46 changed files with 2430 additions and 175 deletions
+8 -16
View File
@@ -1,7 +1,6 @@
package main
import (
"context"
"fmt"
"io"
"net/http"
@@ -10,19 +9,13 @@ import (
"path/filepath"
goruntime "runtime"
wr "github.com/wailsapp/wails/v2/pkg/runtime"
"github.com/wailsapp/wails/v3/pkg/application"
)
// App 经 Wails 的 TS/Go 强绑定暴露给前端,承载只有桌面端能做的原生能力:
// App 经 Wails v3 的 Service 绑定暴露给前端,承载只有桌面端能做的原生能力:
// 文件读写、系统"另存为"框、用系统默认应用打开、原生通知。
type App struct {
ctx context.Context
}
func NewApp() *App { return &App{} }
// startup 在 Wails 启动时注入运行时 ctx。
func (a *App) startup(ctx context.Context) { a.ctx = ctx }
// v3 中不再需要注入 ctx——对话框经 application.Get().Dialog 获取。
type App struct{}
// Ping 供前端探活 Go 桥是否就绪。
func (a *App) Ping() string { return "sundynix-desktop ok" }
@@ -42,11 +35,10 @@ func (a *App) SaveReportAs(url, filename string) (string, error) {
if filename == "" {
filename = "report.docx"
}
path, err := wr.SaveFileDialog(a.ctx, wr.SaveDialogOptions{
Title: "保存报告",
DefaultFilename: filename,
Filters: []wr.FileFilter{{DisplayName: "Word 文档 (*.docx)", Pattern: "*.docx"}},
})
path, err := application.Get().Dialog.SaveFile().
SetFilename(filename).
AddFilter("Word 文档 (*.docx)", "*.docx").
PromptForSingleSelection()
if err != nil || path == "" {
return "", err
}