
Wails 调研:用 Go + WebView 写桌面应用,35K 星的轻量 Electron 替代品
一句话定位 :Wails 让你用 Go 写后端 + 任意前端框架(Vue/React/Svelte/ 原生 JS)写 UI,打包成单个原生二进制 —— 不是 Electron 的 ” 套壳浏览器 ”,而是直接调用系统 WebView 渲染引擎。35K stars / MIT / v2.13.0 稳定版 + v3.0 alpha 双轨迭代。
一、项目画像
| 字段 | 值 |
|---|---|
| GitHub | wailsapp/wails |
| Stars | 35,569 ⭐ |
| Forks | 1,783 🍴 |
| Open Issues | 284 |
| Watchers | 35,569 |
| License | MIT ✅ |
| 主语言 | Go (6.97M LoC) |
| 首次 commit | 2018-12-15 |
| 最新 release | v2.13.0(2026-07-06) |
| v3 alpha | v3.0.0-alpha2.119(2026-07-27,3 天前还在更) |
| 仓库大小 | 434 MB |
| 维护者 | leaanthony(4,078 commits,占比 60%+,核心灵魂人物) |
| 最近 push | 2026-07-29(今天!项目持续活跃) |
| 赞助 | JetBrains(开源 license) |
| 文档 | wails.io(v2)+ v3.wails.io |
两个并行版本 很有意思:
–
v2.13.0(Stable) —— 生产可用,最新稳定
–
v3.0.0-alpha2.119(Alpha) —— 几乎每 1-3 天一个小版本,迭代极激进
v3 已经在做 systray / 32 位 Windows 反思 / 客户端尺寸调整 这些细节,说明 v3 是 v2 的全面重构版,不只是小升级。
二、核心卖点:为什么 Wails 值得看?
2.1 真正的 ” 原生 WebView”,不是套壳浏览器
这是 Wails 和 Electron 最本质的区别:
| 维度 | Electron | Wails | Tauri |
|---|---|---|---|
| 渲染方式 | 打包整个 Chromium (~150MB) | 调用系统 WebView2/WebKitGTK/WKWebView | 调用系统 WebView(Rust 实现) |
| Linux | Chromium | WebKitGTK 6.0 | WebKitGTK |
| macOS | Chromium | WKWebView | WKWebView |
| Windows | Chromium | WebView2(Win10+ 内置) | WebView2 |
| 安装包大小 | 100-200 MB | 5-15 MB | 3-10 MB |
| 启动内存 | 150-300 MB | 30-80 MB | 50-150 MB |
| 后端语言 | Node.js | Go | Rust |
Wails README 原话:“Uses native rendering engines – no embedded browser!”
这意味着:
– ✅ 安装包小一个数量级
– ✅ 启动快
– ✅ 内存占用低
– ⚠️ 但系统 WebView 行为有差异(WebView2 vs WebKitGTK),跨平台 UI 细节可能不一致
2.2 Go 后端 + 自动生成 TS 类型
最爽的点:Go 方法直接暴露给 JS,自动生成 TypeScript 定义。
// backend/app.go
package main
import "context"
type App struct {ctx context.Context}
type GreetResponse struct {
Message string `json:"message"`
Time string `json:"time"`
}
// 导出方法:自动可从 JS 调用
func (a *App) Greet(name string) GreetResponse {
return GreetResponse{
Message: "Hello " + name + "!",
Time: "2026-07-29",
}
}
Wails CLI 跑 wails generate module 自动生成:
// frontend/wailsjs/go/main/App.d.ts
export function Greet(arg1: string): Promise<GreetResponse>;
前端调用:
import {Greet} from '../wailsjs/go/main/App';
const resp = await Greet('飞熊');
console.log(resp.message); // "Hello 飞熊!"
没有手动维护 API 类型、没有手写 IPC 桥接代码。
2.3 任意前端框架
README 主题标签直接列了:angular / react / svelte / vuejs
官方模板仓:
–
wailsapp/wails-template-vue / wailsapp/wails-template-react / wailsapp/wails-template-svelte
–
wailsapp/wails-template-literal(纯 JS + Vite,最轻量)
– 还有 community 维护的 Solid / Lit / Preact 等模板
不是锁定技术栈,你团队现有前端能力直接复用。
2.4 原生能力开箱即用
| 能力 | Wails 状态 |
|---|---|
| Native Dialogs(文件 / 消息 / 输入) | ✅ 内置 |
| Native Menus(菜单栏) | ✅ 内置 |
| Dark/Light Mode | ✅ 自动适配系统 |
| Translucency / 毛玻璃效果 | ✅ 支持 |
| 系统托盘 | ✅(v3 systray) |
| Go ↔ JS 事件系统 | ✅ 双向事件总线 |
| Cross-platform build | ✅ CLI 一行命令出三平台产物 |
| Hot Reload | ✅ wails dev 改 Go 自动重载前端 |
三、技术架构
3.1 跨平台 WebView 抽象
Wails 不直接绑死 WebView2(只在 Windows 上有),而是用 WebView 抽象层:
┌──────────────────────────────────────┐
│ Frontend (Vue/React/Svelte/Vanilla) │
└──────────────┬───────────────────────┘
│ JS Bridge (auto-gen)
┌──────────────┴───────────────────────┐
│ Wails Runtime (Go) │
│ • Event Bus (双向事件) │
│ • Binding Generator (Go→TS) │
│ • Window/Application Manager │
└──────────────┬───────────────────────┘
│
┌───────────┼───────────┐
▼ ▼ ▼
┌──────┐ ┌──────┐ ┌──────┐
│WebView│ │WebKit│ │WKWeb │
│ 2 │ │ GTK │ │ View │
│ Win10+│ │Linux │ │ macOS│
└──────┘ └──────┘ └──────┘
跨平台底层用 wailsapp/go-webview2(46 stars,Wails fork 的 webview2 绑定)+ CGo 桥接各平台原生 WebView。
3.2 CLI 工具链
# 安装 CLI
go install github.com/wailsapp/wails/v2/cmd/wails@latest
# 初始化项目(选模板)wails init -n myapp -t vue
wails init -n myapp -t react-ts
wails init -n myapp -t svelte-ts
wails init -n myapp -t vanilla # 纯 HTML/JS
# 开发模式(Go 热重载 + 前端 HMR)wails dev
# 打包(默认当前平台)wails build
# 交叉编译 Linux/macOS/Windows
wails build -platform linux/amd64
wails build -platform darwin/universal
wails build -platform windows/amd64
# 生成 TS 类型(Go 结构体 /method → .d.ts)wails generate module
CLI 框架用的是 leaanthony/clir(看作者名,同一个作者 leaanthony 写的 —— 4,078 commits 真不是盖的)。CLI 输出用了 pterm 做彩色格式化。
3.3 数据规模
Go: 6,970,679 LoC (主逻辑)
HTML: 4,026,657 (文档 / 示例 / 模板)
TypeScript: 446,371 (前端类型 + 工具)
CSS: 422,902
JavaScript: 347,069
Objective-C: 317,684 (macOS 桥接)
Java: 236,501 (Android 桥接 - v3 准备)
Go Template: 167,351
NSIS: 163,979 (Windows 安装包)
C: 97,719
Go 是绝对主力(7MB),HTML 主要是 docs + templates,符合 ”Go 后端 + Web 前端 ” 的定位。
四、对比:Wails vs Electron vs Tauri vs Fyne
这是开源 GUI 桌面应用 4 大主力,全部 GitHub stars / 活跃度对比:
| 项目 | Stars | Forks | 主语言 | License | 包大小 | 后端栈 | 渲染方式 |
|---|---|---|---|---|---|---|---|
| electron/electron | 122,219 | 17,359 | C++ | MIT | 100-200 MB | Node.js | 自带 Chromium |
| tauri-apps/tauri | 109,623 | 3,810 | Rust | Apache-2.0 | 3-10 MB | Rust | 系统 WebView |
| fyne-io/fyne | 28,541 | 1,539 | Go | BSD-3-Clause | 10-30 MB | Go | 自绘 Canvas |
| wailsapp/wails | 35,569 | 1,783 | Go | MIT | 5-15 MB | Go | 系统 WebView |
4.1 定位差异
- Electron:生态最大、Node.js 全栈,但包大内存大。VSCode / Slack / Discord / Notion 全是它
- Tauri:Rust 后端 + 系统 WebView,包最小速度最快,但 Rust 学习曲线陡
- Fyne:Go 原生 UI 控件(不依赖 WebView),像 Qt 的 Go 版,但 UI 受限于组件库
- Wails:Go 后端 + Web 前端,平衡了 Tauri 的轻量 + Electron 的前端自由度
4.2 选择建议
| 场景 | 推荐 |
|---|---|
| 已有 Go 后端,要快速加桌面 UI | Wails ✅ |
| 已有前端团队(Vue/React),要小包 | Wails / Tauri |
| 后端是 Node.js 全栈 | Electron(生态) |
| 后端是 Rust,愿意学 | Tauri(最现代) |
| 完全不想要 WebView,要纯原生 UI | Fyne(但 UI 现代感差) |
| 跨 macOS/iOS/Android 一套 | Wails v3(Java 桥接已加入) |
4.3 Wails vs Tauri(最常被比较)
| 维度 | Wails | Tauri |
|---|---|---|
| 后端语言 | Go(更主流,开发者多) | Rust(学习曲线陡) |
| 包大小 | 5-15 MB | 3-10 MB(略胜) |
| 启动速度 | 快 | 更快 |
| 内存占用 | 30-80 MB | 50-150 MB |
| WebView 抽象 | 较薄一层 | 更厚更可控(权限系统更严格) |
| 移动端 (Android/iOS) | v3 alpha 已支持 | 实验性支持 |
| 社区规模 | 35K stars,活跃 | 109K stars,更活跃 |
| 文档质量 | 较好 | 极好(Tauri 文档公认一流) |
| License | MIT ✅ | Apache-2.0 ✅ |
飞熊视角:如果团队有 Go 背景,Wails 上手快得多;如果愿意投入 Rust,Tauri 是更 ” 未来 ” 的选型。
五、实战:5 分钟写个 Wails 应用
# 1. 安装 CLI(需要 Go 1.20+)go install github.com/wailsapp/wails/v2/cmd/wails@latest
# 2. 检查环境(依赖 WebView2/GTK/WKWebView)wails doctor
# 3. 创建项目
wails init -n hellofei -t vue
cd hellofei
# 4. 看目录结构
.
├── app.go # Go 后端(你的业务逻辑)├── main.go # 应用入口
├── go.mod
├── frontend/ # 前端
│ ├── src/
│ ├── package.json
│ └── wailsjs/ # 自动生成的 JS/TS 绑定
└── build/ # 打包配置(图标 /Info.plist)# 5. 写后端方法
cat > app.go <<'EOF'
package main
import (
"context"
"fmt"
)
type App struct {ctx context.Context}
func NewApp() *App { return &App{} }
func (a *App) startup(ctx context.Context) {a.ctx = ctx}
func (a *App) Greet(name string) string {return fmt.Sprintf("Hello %s, welcome to Wails!", name)
}
func (a *App) Add(a2, b int) int {return a2 + b}
EOF
# 6. 生成前端 TS 类型
wails generate module
# 7. 开发模式(热重载)wails dev
# → 打开窗口,修改 app.go 自动重启前端
# → 修改 frontend/src/* HMR 立即生效
# 8. 打包
wails build
# → build/bin/hellofei.app (macOS)
# → build/bin/hellofei.exe (Windows)
# → build/bin/hellofei (Linux)
前端调用:
<template>
<div>
<button @click="testWails"> 调 Go 方法 </button>
<p>{{message}}</p>
</div>
</template>
<script setup>
import {ref} from 'vue'
import {Greet, Add} from '../wailsjs/go/main/App'
const message = ref('')
const testWails = async () => {message.value = await Greet('飞熊')
const sum = await Add(2, 3)
console.log('2+3 =', sum)
}
</script>
六、风险与限制
6.1 v2 vs v3 的版本选择焦虑
- v2.13.0 稳定,但作者精力已转向 v3
- v3 在 alpha,3 天一版,API 还在变化
- 第三方插件 / 模板主要支持 v2
- v2 也会持续维护(修复为主,不加新特性)
建议:生产项目先锁 v2.13,新项目愿意踩坑可以上 v3 alpha。
6.2 WebView 跨平台差异
虽然 Wails 抽象了 WebView,但:
– WebView2 (Windows) ≈ Chrome 最新版
– WebKitGTK (Linux) ≠ Safari(CSS 兼容性差异,
特别是 backdrop-filter / 新 CSS)
– WKWebView (macOS) ≈ Safari
踩坑点 :用了 Safari/Chrome 最新 CSS feature,Linux 上可能样式跑偏。建议 核心 UI 用成熟 CSS,跨平台浏览器兼容可以用 caniuse.com 查。
6.3 启动器 / 维护高度集中
- leaanthony 一人 4,078 commits,占绝对主导
- 第二名
tmclane231,第三名stffabi188 - 公交模型风险:核心维护者掉线 → 进度停滞
- 缓解:项目已经 7 年、JetBrains 赞助、商业公司在用(Discord 也有专门频道)
6.4 Go 后端的限制
- CGo 依赖(编译跨平台工具链复杂)
- WebView2 Linux 端要装
webkit2gtk-4.0-dev系统包 - 交叉编译需要 Docker 镜像(wailsapp/xgo 25 stars 解决了)
- Go 1.20+ 才能编译(高版本要求)
6.5 移动端还在 alpha
- v3 才开始支持 Android/iOS
- API 变化频繁
- 移动端 WebView 兼容性问题会更复杂
6.6 调试 / DevTools
Wails 默认开启 DevTools(右键 → Inspect),但:
– WebView2 DevTools 不如 Chrome 完整
– macOS WKWebView Inspector 要单独开 Safari
– 生产 build 默认禁用 DevTools
七、谁在用 Wails?(awesome-wails 收录)
| 项目 | 场景 |
|---|---|
| Wails Desktop Examples | 官方示例集合(12 stars) |
| Todo App | 经典 TODO,演示完整功能 |
| dryw | Wails 自己的 GUI 管理工具 |
| updater-demo | 应用自动更新演示 |
社区应用:awesome-wails 851 stars,收录了 30+ 真实项目,涵盖:
– DevOps 工具(k8s 管理、git GUI)
– 数据库客户端(SQLite Browser)
– 笔记 / Markdown 编辑器
– 系统监控面板
– AI 推理界面
八、7 段飞熊视角总结
-
如果你已经会 Go + Vue/React,Wails 是当前 性价比最高的桌面 GUI 选型 —— 没有 Electron 的 150MB 包袱,没有 Tauri 的 Rust 学习曲线。Go 后端 + 熟悉的前端 + 单文件产物 + 系统 WebView,组合很自然。
-
跟 Tauri 比:Stars 差距大(35K vs 109K),Tauri 社区生态确实更厚。但 Tauri 需要 Rust,对纯 Go 团队来说 Wails 是更 ” 门当户对 ” 的选择。Wails 在 ” 小工具 / 内部工具 / IoT 控制台 ” 这类场景特别合适。
-
包大小是 Wails 最大卖点 :5-15 MB 对比 Electron 100-200 MB, 一个数量级差距。如果做 ToC 产品需要分发下载、安装包大小直接决定转化率。
-
v2 / v3 双轨是个减分项:v3 还在 alpha,3 天一版让人犹豫要不要上车。建议生产锁 v2.13,6 个月后回头看 v3 稳定度再考虑切换。
-
WebView 抽象做得够用但不算完美:跨平台 WebView 行为差异(特别是 Linux WebKitGTK)会让你遇到 Safari 没问题但 Linux 样式跑偏的情况。Web 前端写法要保守。
-
Go → TS 自动绑定是真香:之前写 Electron 要手动维护 IPC 桥和类型,Wails 的
wails generate module一步到位。这才是 ” 现代桌面开发 ” 该有的样子。 -
作者主导太重 :leaanthony 一人 4,078 commits,60%+ 占比。7 年坚持 + JetBrains 赞助说明项目长期能跑,但 核心人风险存在。建议把项目当 ” 主力但不是唯一依赖 ”。
九、一行结论
Wails = Go 后端 + 任意 Web 前端 + 系统 WebView + 单文件产物 + MIT。对 Go 团队来说,是当前写桌面应用 最自然的现代选型,但要警惕 v2/v3 版本分裂和 WebView 跨平台差异。