Wails:Go 版 Electron,打包体积直接缩小 10 倍!
标签: Wails / Go / Electron / 桌面应用 / Tauri / 跨平台 / WebView / 前端开发
原文: 微信公众号「前端Hardy」https://mp.weixin.qq.com/s/9xCoW6lltJ-_IEJyzqRoHA
官网: https://wails.io
GitHub: https://github.com/wailsapp/wails
痛点:Electron 的体积噩梦
做桌面应用开发的,谁没被 Electron 的体积折磨过?
| 问题 | 描述 |
|---|---|
| 打包体积 | 最简单的 Hello World,打包出来 100MB+ |
| 下载体验 | 用户下载慢,体验差 |
| 启动速度 | 启动时间长 |
| 内存占用 | 内存占用高 |
用户吐槽:"用 Web 技术做桌面应用方便","这软件比我系统还占空间"。
现有解决方案
| 方案 | 问题 |
|---|---|
| Tauri | 用 Rust 解决体积问题,但 Rust 学习曲线劝退不少人 |
| Wails | 用 Go解决,走了一条不同的路 |
Wails 是什么?
GitHub 34.7K Stars,Go 语言写的跨平台桌面应用框架。
核心数据
- 📦 打包体积:通常 10-20MB(Electron 的 1/10)
- 🎨 前端:Vue / React / Svelte 随便选
- ⚙️ 后端:标准 Go
- ⭐ GitHub: 34.7K Stars
核心设计:Go 后端 + 任意前端 + 系统原生 WebView
Wails 的架构很清晰,三部分:
| 部分 | 技术 | 说明 |
|---|---|---|
| 后端 | 标准 Go | 业务逻辑、文件系统、网络请求、系统 API |
| 前端 | 任意框架 | Vue、React、Svelte、Vanilla HTML/JS,甚至 Vite |
| 渲染 | 系统原生 WebView | Windows 用 WebView2,macOS 用 WKWebView,Linux 用 WebKitGTK |
关键点
没有嵌入 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 最省心的设计是 自动绑定。
Step 1: 在 Go 里写方法
// App.go
type App struct {}
func (a *App) Greet(name string) string {
return fmt.Sprintf("Hello %s!", name)
}
Step 2: Wails 自动暴露给前端
自动生成 TypeScript 类型定义:
// 自动生成的绑定
interface App {
Greet(name: string): Promise<string>;
}
Step 3: 前端直接调用
const result = await Greet('World');
你不需要
- ❌ 手写 REST API
- ❌ 配置 gRPC
- ❌ 处理序列化
Wails 自动处理 Go 和 JavaScript 之间的 类型转换、异步调用、错误传递。
事件系统:Go 和 JS 互相发送事件
// Go 发送事件
runtime.EventsEmit(ctx, "frontend:counter", count)
// JS 接收事件
window.runtime.EventsOn("frontend:counter", (count) => {
console.log(count);
});
v3 Alpha:跨平台编译、Docker 构建、代码混淆
版本状态
| 版本 | 状态 | 安装命令 |
|---|---|---|
| v2 | Stable(稳定版) | go install github.com/wailsapp/wails/v2/cmd/wails@latest |
| v3 | Alpha(预览版) | 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 二进制需要自行代码签名后才能分发。
v3 新能力 2:Garble 代码混淆
v3.0.0-alpha.96 引入了 Garble 支持,对 Go 代码做混淆,保护商业逻辑:
wails3 build --obfuscated --garbleargs
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
| 维度 | Wails | Tauri | Electron |
|---|---|---|---|
| 后端语言 | Go | Rust | Node.js |
| 前端 | 任意框架 | 任意框架 | 任意框架 |
| 渲染引擎 | 系统 WebView | 系统 WebView | 嵌入 Chromium |
| 打包体积 | 10-20MB | ~600KB | 100MB+ |
| 内存占用 | 低 | 极低 | 高 |
| 学习曲线 | 中(Go 简单) | 高(Rust 复杂) | 低(JS 全栈) |
| 跨平台编译 | v3 支持(Docker+Zig) | 原生支持 | 需额外配置 |
| GitHub Stars | 34.7K | 89K+ | 114K+ |
| 移动端 | v3 实验性支持 | v2 支持 iOS/Android | 不支持 |
选型建议
Wails 的甜区 ✅
- 团队已经有 Go 后端,想快速做个桌面管理界面
- 不想学 Rust,但想要 Tauri 级别的轻量
- 需要跨平台,但不想处理 Electron 的体积和内存问题
Tauri 的甜区 ✅
- 团队熟悉 Rust,追求极致体积和性能
- 需要移动端支持(iOS/Android)
Electron 的甜区 ✅
- 需要完整的 Chromium 能力(DevTools、扩展、特定 Web API)
- 团队全栈 JS,不想引入第二语言
写在最后
Wails 的定位很清晰:
不是功能最多的桌面框架,是"Go 开发者最顺手"的。
核心价值
✅ Go + 任意前端 —— 用标准 Go 写后端,前端随便选
✅ 打包体积 10-20MB —— Electron 的 1/10
✅ 自动绑定 —— Go 方法直接当 JS 函数调用,无需手写 API
✅ 事件系统 —— Go 和 JS 互相发送事件
✅ v3 Alpha —— 跨平台编译、代码混淆、Docker 构建
✅ 热重载 —— 开发时前后端同时热重载
适合谁?
- 已有 Go 后端服务,想快速包装桌面管理界面的团队
- 不想被 Electron 体积绑架的独立开发者
- 想用 Web 技术做桌面应用,但追求轻量的开发者
相关链接
- 官网: https://wails.io
- GitHub: https://github.com/wailsapp/wails
- v3 文档: https://v3.wails.io/
- Wails 中文文档: https://wails.io/zh-Hans/docs/overview
Keywords: Wails, Go桌面应用, Electron替代, Tauri对比, 跨平台桌面, WebView, 前端开发, Go语言, 打包体积, 热重载