Wails:Vue/React 写界面、Go 写逻辑,桌面产物只有 3–8MB
项目地址:github.com/wailsapp/wails
用 Electron 写桌面端,语法顺手和包体膨胀是同时存在的两件事:一个 Hello World 级别的安装包就能到 150–250 MB,运行内存 200MB 起步。Wails 换了一条路——界面层继续用 Vue/React/Svelte,逻辑层交给 Go,最终输出原生可执行文件。产品体积通常在 3–8MB。这个项目以 MIT 协议开源,GitHub 上目前 36k+ star。
项目简介
Wails 不内嵌 Chromium,渲染引擎直接复用系统自带的 WebView 组件:
- Windows 使用 WebView2
- macOS 使用 WKWebView
- Linux 使用 WebKitGTK
前端代码与 Go 函数之间直接互调,不需要额外起 REST API 或 WebSocket。由于不附带浏览器运行时,产物是免安装的原生二进制,用户双击即用,无需安装额外依赖。
核心功能
Go 函数绑定
Go 结构体和方法可以直接暴露给前端 JavaScript 调用,反之亦可。一个结构体加上 @wails/event 标记,就能完成后端方法与前端调用之间的绑定,编译时自动生成类型安全的绑定代码。
CLI 工具链
Wails v3 的 CLI 命令前缀为 wails3:
wails3 init:初始化项目wails3 dev:启动带热重载的开发模式wails3 build:打包生产级二进制文件
跨平台与原生能力
支持产出 Windows、macOS、Linux 三个平台的桌面应用,并提供原生菜单、对话框、系统托盘、剪贴板等系统级 API。
事件系统与热重载
内置事件总线,支持后端向前端推送实时数据。开发模式下,改前端代码即时刷新;改 Go 代码会自动重新编译并重连。
安装与创建项目
前置条件:Go 1.18+ 和 Node.js 15+。
安装 Wails CLI:
go install github.com/wailsapp/wails/v3/cmd/wails3@latest
用 Vue 模板创建项目并启动开发模式:
wails3 init -n myapp -t vue
cd myapp
wails3 dev
几秒后桌面窗口会拉起。修改前端代码会热更新,修改 Go 代码会触发重新编译。
代码演示:Go 函数直接给前端调用
后端定义一个结构体和方法:
type App struct{}
func (a *App) Greet(name string) string {
return fmt.Sprintf("Hello, %s! From Go backend.", name)
}
Wails 会基于这个结构体自动生成前端的绑定代码。Vue 里直接 import 后调用:
import { Greet } from '../wailsjs/go/main/App'
Greet("World").then(result => {
console.log(result) // Hello, World! From Go backend.
})
不需要配置 API 端点,也不用手动序列化。
与 Electron / Tauri 的对比
三个项目的关键差异:
| 对比维度 | Wails | Electron | Tauri |
|---|---|---|---|
| 打包体积 | 3–8 MB | 150–250 MB | 3–10 MB |
| 内存占用 | 极低(<50MB) | 高(200MB+) | 极低 |
| 后端语言 | Go(高性能,并发强) | Node.js | Rust(学习曲线陡) |
| 渲染引擎 | 系统 WebView(复用系统组件) | 内嵌 Chromium | 系统 WebView |
| 学习门槛 | 低(前端不变,Go 易学) | 极低 | 高(需学 Rust) |
| 原生体验 | 原生菜单、对话框、托盘 | 需额外插件 | 原生 |
与 Electron 相比,Wails 在包体和内存上是数量级差异;与 Tauri 相比,体积、内存和渲染方案都接近,真正的分叉在后端语言——Tauri 需要 Rust,Wails 用 Go。对于已有 Web 前端背景、需要给服务配一个桌面端的团队,Go 是比 Rust 更容易跨过的门槛。