Electron 慌了?Go 版 Electron 火了!打包体积直接缩小 10 倍
做桌面应用开发的,谁没被 Electron 的体积折磨过?
一个最简单的 Hello World,打包出来 100MB+。用户下载慢,启动慢,内存占用高。你说"用 Web 技术做桌面应用方便",用户说"这软件比我系统还占空间"。
Tauri 用 Rust 解决了这个问题,但 Rust 的学习曲线劝退了不少人。
Wails 走了另一条路:用 Go。
GitHub 34.7K Stars,Go 语言写的跨平台桌面应用框架,打包体积通常 10-20MB(Electron 的 1/10),前端用 Vue/React/Svelte 随便选,后端用标准 Go。
一、核心设计:Go 后端 + 任意前端 + 系统原生 WebView
Wails 的架构很简单,三部分:
后端 前端 渲染
没有嵌入 Chromium,没有打包浏览器引擎。 应用体积就是 Go 二进制 + 前端资源,通常 10-20MB。
创始人 Lea Anthony 的解释:
"The traditional method of providing web interfaces to Go programs is via a built-in web server. Wails offers a different approach: it provides the ability to wrap both Go code and a web frontend into a single binary."
(传统上给 Go 程序提供 Web 界面是通过内置 Web 服务器。Wails 提供了另一种方式:把 Go 代码和 Web 前端打包成单个二进制文件。)
二、前后端通信:Go 方法直接当 JS 函数调用
Wails 最省心的设计是自动绑定。
你在 Go 里写一个方法:
// App.go
type App struct {}
func (a *App) Greet(name string) string {
return fmt.Sprintf("Hello %s!", name)
}
Wails 自动把它暴露给前端,生成 TypeScript 类型定义:
// 自动生成的绑定
interface App {
Greet(name: string): Promise<string>;
}
前端直接调用:
const result = await Greet('World');
不需要手写 REST API、不需要配置 gRPC、不需要处理序列化。 Wails 自动处理 Go 和 JavaScript 之间的类型转换、异步调用、错误传递。
还有统一的事件系统,Go 和 JavaScript 可以互相发送事件:
// Go 发送事件
runtime.EventsEmit(ctx, "frontend:counter", count)
// JS 接收事件
window.runtime.EventsOn("frontend:counter", (count) => {
console.log(count);
});
三、v3 Alpha:跨平台编译、Docker 构建、代码混淆
Wails 目前有两个活跃版本:
v2 go install github.com/wailsapp/wails/v2/cmd/wails@latestv3 go install github.com/wailsapp/wails/v3/cmd/wails3@latest
v3 虽然还是 Alpha,但已经有一些组织在生产环境使用。GitHub FAQ 明确说了:API 已经"reasonably stable"(相当稳定)。
v3 的核心新能力:
1. 跨平台编译(Docker + Zig)
从 Linux 交叉编译到 macOS,一条命令:
# 一次性设置 Docker 镜像
wails3 task setup:docker
# 编译 Apple Silicon 版本
wails3 build GOOS=darwin GOARCH=arm64
# 编译 Intel 版本
wails3 build GOOS=darwin GOARCH=amd64
# 编译通用二进制
wails3 task darwin:build:universal
注意:跨平台编译的 macOS 二进制需要自行代码签名后才能分发。
2. Garble 代码混淆
v3.0.0-alpha.96 引入了 Garble 支持,对 Go 代码做混淆,保护商业逻辑:
wails3 build --obfuscated --garbleargs
3. 其他 v3 改进
条件拆分大型 RPC payload 为 chunked POST 请求 Vite 从 5.x 升级到 8.0.0 修复 Linux WebKit UI 冻结、Wayland 菜单崩溃、Windows 鼠标穿透等大量平台级 bug 自动 nightly release(alpha.98 是最新版)
四、3 分钟上手
安装
# 安装 Wails CLI
go install github.com/wailsapp/wails/v2/cmd/wails@latest
# 验证
wails version
# 环境诊断
wails doctor
创建项目
# 用 React + Vite 模板
wails init -n myapp -t react
# 用 Vue 模板
wails init -n myapp -t vue
# 用 Svelte 模板
wails init -n myapp -t svelte
项目结构
myapp/
├── build/ # 构建输出
├── frontend/ # 前端工程(React/Vue/Svelte)
├── app.go # Go 后端业务逻辑
├── main.go # 应用入口
└── wails.json # 项目配置
开发
cd myapp
wails dev
wails dev 同时启动前端开发服务器(Vite)和 Go 后端,支持热重载。
构建
# 当前平台
wails build
# 指定平台
wails build -platform windows/amd64
wails build -platform darwin/universal
wails build -platform linux/amd64
五、选型对比:Wails vs Tauri vs Electron
后端语言 前端 渲染引擎 打包体积 内存占用 学习曲线 跨平台编译 GitHub Stars 移动端
Wails 的甜区:
团队已经有 Go 后端,想快速做个桌面管理界面 不想学 Rust,但想要 Tauri 级别的轻量 需要跨平台,但不想处理 Electron 的体积和内存问题
Tauri 的甜区:
团队熟悉 Rust,追求极致体积和性能 需要移动端支持(iOS/Android)
Electron 的甜区:
需要完整的 Chromium 能力(DevTools、扩展、特定 Web API) 团队全栈 JS,不想引入第二语言
写在最后
Wails 的定位很清晰:不是功能最多的桌面框架,是"Go 开发者最顺手"的。
34.7K Stars、v3 Alpha 持续迭代、跨平台编译、代码混淆——这些数字背后是 Go 生态对桌面应用开发的真实需求。
对于已经有 Go 后端服务、想快速包装一个桌面管理界面的团队,或者不想被 Electron 体积绑架的独立开发者,Wails 是个非常务实的选择。
官网:https://wails.io/ v3 文档:https://v3.wails.io/ GitHub:https://github.com/wailsapp/wails
你做过桌面应用开发吗?用的 Electron、Tauri、Wails 还是其他?评论区聊聊~
