编程 Wails:Go 版 Electron,打包体积直接缩小 10 倍!

2026-06-11 11:57:18 +0800 CST views 9

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
渲染系统原生 WebViewWindows 用 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 构建、代码混淆

版本状态

版本状态安装命令
v2Stable(稳定版)go install github.com/wailsapp/wails/v2/cmd/wails@latest
v3Alpha(预览版)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

维度WailsTauriElectron
后端语言GoRustNode.js
前端任意框架任意框架任意框架
渲染引擎系统 WebView系统 WebView嵌入 Chromium
打包体积10-20MB~600KB100MB+
内存占用极低
学习曲线中(Go 简单)高(Rust 复杂)低(JS 全栈)
跨平台编译v3 支持(Docker+Zig)原生支持需额外配置
GitHub Stars34.7K89K+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 技术做桌面应用,但追求轻量的开发者

相关链接


Keywords: Wails, Go桌面应用, Electron替代, Tauri对比, 跨平台桌面, WebView, 前端开发, Go语言, 打包体积, 热重载

推荐文章

JavaScript 实现访问本地文件夹
2024-11-18 23:12:47 +0800 CST
html5在客户端存储数据
2024-11-17 05:02:17 +0800 CST
rangeSlider进度条滑块
2024-11-19 06:49:50 +0800 CST
程序员茄子在线接单