Wails 调研:用 Go + WebView 写桌面应用,35K 星的轻量 Electron 替代品

87次阅读
Wails 调研:用 Go + WebView 写桌面应用,35K 星的轻量 Electron 替代品

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 受限于组件库
  • WailsGo 后端 + 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,占绝对主导
  • 第二名 tmclane 231,第三名 stffabi 188
  • 公交模型风险:核心维护者掉线 → 进度停滞
  • 缓解:项目已经 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 段飞熊视角总结

  1. 如果你已经会 Go + Vue/React,Wails 是当前 性价比最高的桌面 GUI 选型 —— 没有 Electron 的 150MB 包袱,没有 Tauri 的 Rust 学习曲线。Go 后端 + 熟悉的前端 + 单文件产物 + 系统 WebView,组合很自然。

  2. 跟 Tauri 比:Stars 差距大(35K vs 109K),Tauri 社区生态确实更厚。但 Tauri 需要 Rust,对纯 Go 团队来说 Wails 是更 ” 门当户对 ” 的选择。Wails 在 ” 小工具 / 内部工具 / IoT 控制台 ” 这类场景特别合适

  3. 包大小是 Wails 最大卖点 :5-15 MB 对比 Electron 100-200 MB, 一个数量级差距。如果做 ToC 产品需要分发下载、安装包大小直接决定转化率。

  4. v2 / v3 双轨是个减分项:v3 还在 alpha,3 天一版让人犹豫要不要上车。建议生产锁 v2.13,6 个月后回头看 v3 稳定度再考虑切换

  5. WebView 抽象做得够用但不算完美:跨平台 WebView 行为差异(特别是 Linux WebKitGTK)会让你遇到 Safari 没问题但 Linux 样式跑偏的情况。Web 前端写法要保守

  6. Go → TS 自动绑定是真香:之前写 Electron 要手动维护 IPC 桥和类型,Wails 的 wails generate module 一步到位。这才是 ” 现代桌面开发 ” 该有的样子。

  7. 作者主导太重 :leaanthony 一人 4,078 commits,60%+ 占比。7 年坚持 + JetBrains 赞助说明项目长期能跑,但 核心人风险存在。建议把项目当 ” 主力但不是唯一依赖 ”。


九、一行结论

Wails = Go 后端 + 任意 Web 前端 + 系统 WebView + 单文件产物 + MIT。对 Go 团队来说,是当前写桌面应用 最自然的现代选型,但要警惕 v2/v3 版本分裂和 WebView 跨平台差异。


参考

正文完