你有没有遇到过这样的困扰:想用 Go 写一个带图形界面的桌面应用,却发现选择寥寥无几?用 Electron 吧,一个 Hello World 就要 50MB+,内存占用动辄几百兆;用原生开发吧,每个平台都要单独写一套代码,维护成本太高。
我来介绍一个轻量级的解决方案——Wails,它让你用 Go 写后端、用熟悉的 Web 技术写前端,打包出来的应用体积小、启动快,还能跨平台运行。
Wails 是什么?
Wails 是一个开源框架,专门为 Go 开发者设计,用于创建具有现代 Web 界面的桌面应用。它的核心思路很简单:把 Go 代码和 Web 前端打包成一个单独的二进制文件,无需内置浏览器,也不需要 Web 服务器。
与 Electron 最大的不同在于,Wails 不嵌入 Chromium,而是直接使用操作系统的原生渲染引擎:Windows 上用 WebView2,macOS 上用 WKWebView,Linux 上用 WebKitGTK。这意味着应用体积可以控制在 10MB 以内,启动速度和内存占用都大幅优于 Electron。
快速上手
安装 Wails CLI
go install github.com/wailsapp/wails/v2/cmd/wails@latest
安装完成后,运行 wails doctor 检查依赖是否齐全。Windows 需要 WebView2 运行时,macOS 需要 Xcode 命令行工具,Linux 需要 libgtk3 和 libwebkit。
创建项目
wails init -n myapp -t vue
Wails 内置了多种前端模板,包括 Svelte、React、Vue、Preact、Vanilla 等,每个都有 JavaScript 和 TypeScript 版本。
项目结构
myapp/
├── frontend/ # 前端代码
├── build/ # 构建配置和图标
├── main.go # Go 主程序
├── wails.json # 项目配置
└── go.mod
注意,Go 代码直接放在根目录的 main.go 中,而不是单独的 backend/ 目录。
核心概念:方法绑定
Wails 最优雅的设计是方法绑定。你只需在 Go 中定义一个结构体,把它的实例加到 Bind 选项中,Wails 就会自动生成对应的 JavaScript 调用方法。
Go 后端代码
type App struct {
ctx context.Context
}
func (a *App) startup(ctx context.Context) {
a.ctx = ctx
}
func (a *App) Greet(name string) string {
return "Hello, " + name + "!"
}
在 main.go 中绑定:
err := wails.Run(&options.App{
Title: "My App",
Width: 800,
Height: 600,
Bind: []interface{}{
&App{},
},
})
前端调用
Wails 会自动在 wailsjs/go/main/App.js 生成绑定方法,前端直接导入调用:
import { Greet } from '../wailsjs/go/main/App'
const result = await Greet('World')
console.log(result) // "Hello, World!"
整个过程不需要手写任何桥接代码,Wails 甚至会自动生成 TypeScript 类型定义,开发体验非常丝滑。
原生能力支持
除了方法绑定,Wails 还提供了丰富的运行时 API,支持原生对话框、菜单、窗口控制、事件系统、剪贴板等:
// 显示原生对话框
runtime.MessageDialog(a.ctx, runtime.MessageDialogOptions{
Type: runtime.InfoDialog,
Title: "提示",
Message: "操作成功!",
})
这些 API 在 JavaScript 端同样可用,通过 window.runtime 访问。
Wails vs Electron
| 特性 | Wails | Electron |
|---|---|---|
| 后端语言 | Go | JavaScript/Node.js |
| 应用体积 | 小(通常 < 10MB) | 大(通常 > 50MB) |
| 内存占用 | 低 | 高 |
| 渲染引擎 | 原生 WebView | 嵌入式 Chromium |
| 启动速度 | 快 | 较慢 |
简单来说,如果你是 Go 开发者,想要一个轻量级的桌面应用方案,Wails 是更合适的选择;如果你需要 Node.js 生态或更复杂的后端逻辑,Electron 可能更灵活。
写在最后
Wails 为 Go 开发者打开了一扇通往桌面应用的大门。它巧妙地结合了 Go 的高性能和现代前端技术的灵活性,让你可以用熟悉的工具链构建跨平台桌面应用。
目前 Wails 在 GitHub 上已有超过 3 万星标,社区活跃,文档完善。如果你正在为 Go 应用寻找一个图形界面方案,不妨试试 Wails,从 wails init 开始,十分钟后你就能看到第一个桌面应用跑起来。