你有没有遇到过这样的困扰:想用 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 开始,十分钟后你就能看到第一个桌面应用跑起来。