用途:用 Go 做桌面应用,后端 Go、前端网页,由系统 WebView 渲染。不打包 Chromium,因此产物是 MB 级而非数百 MB。涵盖 v2(稳定)与 v3(alpha),两者 API 不兼容,最常见错误是混用两个版本的代码,每次回答必须纯 v2 或纯 v3。
版本识别(强制):先查项目再写代码,不要凭措辞猜测。判断信号:go.mod 导入路径(v2 为 github.com/wailsapp/wails/v2,v3 为 .../v3);CLI(v2 用 wails,v3 用 wails3);构建编排(v2 由 wails.json 驱动,v3 用 Taskfile.yml);入口(v2 是 wails.Run(&options.App{...}),v3 是 application.New(application.Options{...}));Go 暴露给 JS(v2 用 Bind,v3 用 Services);运行时调用(v2 用 runtime.EventsEmit(ctx,...) 需保存上下文,v3 用 app/window 上的方法);前端导入(v2 是 wailsjs/go/main/App,v3 是 frontend/bindings/<import-path>/<service>)。新项目无代码时,需稳定选 v2,接受 alpha 且长期维护可选 v3,须明确说明权衡并固定具体 alpha 版本;不得把 v3 说成稳定版。若代码同时出现两栏 API,先指出这是 bug。
v2 要点:main.go 用 //go:embed all:frontend/dist(all: 前缀必须有,否则 Vite 下划线文件在生产构建中丢失)。runtime.* 调用依赖 OnStartup 传入的 context,须保存;在 OnStartup 前调用运行时会崩溃。绑定结构体的导出方法在前端成为异步 JS 函数,Go 的 (value, error) 对应 Promise。绑定须传指针以保留状态,生成文件 wailsjs/ 会被重新生成,不要手改。绑定结构体应是薄适配层,业务逻辑放无 Wails 依赖的包中。
v3 要点:入口用 application.New,服务用 application.NewService 注入,可选 ServiceStartup/ServiceShutdown 生命周期方法;服务是跨窗口单例,可变状态需加锁。用 Manager API 风格(app.Window.NewWithOptions、app.Event.On、app.Menu.New、app.SystemTray.New),早期 alpha 的扁平方法已迁移,不要臆造不存在的方法。前端绑定用 wails3 generate bindings 生成,从 frontend/bindings/... 导入。支持多窗口,支持窗口关闭前确认的钩子。构建由 go-task 与 Taskfile.yml 编排,打包用 wails3 package。设 WAILS_MCP=1 可嵌入 MCP 服务器供 LLM 代理驱动运行中的应用。alpha 版本需固定并阅读 changelog 后升级,编译报错不明显时先查当前文档。
共有原则:前端输入不可信,绑定方法中须校验参数,不要用原始前端字符串拼 shell 命令或文件路径;返回 error 而非 panic;密钥留在 Go 侧,frontend/dist 中的内容用户可读;耗时任务应发进度事件而非让前端轮询。
限制:v3 截至资料所述仍为 late alpha,发布为 nightly 标签,细节会变动;资料未提供收费、价格与平台之外的效果信息。