做桌面应用开发的,谁没被 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 的架构很简单,三部分:

部分
技术
说明
后端
标准 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 最省心的设计是自动绑定

你在 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
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 二进制需要自行代码签名后才能分发。

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

维度
Wails
Tauri
Electron
后端语言
Go
Rust
Node.js
前端
任意框架
任意框架
任意框架
渲染引擎
系统 WebView
系统 WebView
嵌入 Chromium
打包体积
10-20MB
~600KB(Rust 二进制)
100MB+
内存占用
极低
学习曲线
中(Go 简单)
高(Rust 复杂)
低(JS 全栈)
跨平台编译
v3 支持(Docker+Zig)
原生支持
需额外配置
GitHub Stars
31.8K
89K+
114K+
移动端
v3 实验性支持
v2 支持 iOS/Android
不支持

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 还是其他?评论区聊聊~

扫码领红包

微信赞赏支付宝扫码领红包

发表回复

后才能评论