用 Go 开发桌面应用程序(GUI)的几种方法对比
我想构建一个本地 Go 桌面应用程序,有几种方法可以做到:
- Electron[1]:将 Node.js[2] 和 Chromium[3] 浏览器绑定在一起,以创建一个打包的本地 Web 应用程序。可与 Go 框架(例如 go-app[4] 或 go-astilectron[5])一起使用。
- Lorca[6]:使用本地安装的 Chrome 浏览器,通过 dev-tools communication protocol[7] 实现。
- Webview[8]:使用 webview[9] 创建一个本地窗口,并使用 CGo 绑定在其中渲染应用程序。
我已经写过有关构建一个简单的 electron 应用程序的文章[10],因此本文将探讨如何使用 Lorca 和 Webview 构建应用程序,然后比较这三种的不同。
Lorca
Go 中一个简单的 Lorca[11] 应用:
func main() { // Create UI with data URI ui, _ := lorca.New("data:text/html,"+url.PathEscape(` <html> <head><title>Hello</title></head> <body><h1>Hello, world!</h1></body> </html> `), "", 600, 200) defer ui.Close() // Create a GoLang function callable from JS ui.Bind("hello", func() string { return "World!" }) // Call above `hello` function then log to the JS console ui.Eval("hello().then( (x) => { console.log(x) })") // Wait until UI window is closed <-ui.Done() } 因为复杂性被隐藏了,所以看起来非常简单!上面的代码打开一个 Chome 窗口,通过 websocket 连接到其 dev-tools[12] 端点,发送要加载的 HTML,并提供 Go 和 JS 之间的通信:
更酷的是,您可以在 Chrome 中调用 JS 函数并在 Go 中获取输出:
n := ui.Eval(`Math.random()`).Float() fmt.Println(n) 使用这个库是如此容易,如此直观,如此实用,以至于我刚使用它时感到困惑。我以为一定有陷阱,不会这么简单。但是没有,它就是这么简单。
另外一个好处是您可以使用 Chrome 开发工具来帮助调试任何问题或调整布局。另外,鉴于我自 2014 年以来[13]一直在写 Promise,我喜欢使用 JS Promise 在 Go 和 JS 之间实现异步调用。
Lorca 的最大缺点是,由于它使用 Chrome,因此某些应用程序详细信息(如系统菜单,图标,标题)无法自定义。然后,需要在应用程序优化和简单应用程序之间进行权衡。根据您构建内容的不同,有好有弊,例如,如果您正在构建内部工具,那会很好,但是对于企业应用程序,这可能看起来并不好。
Webview
Webview[14] 是一个库,可帮助直接在本地组件之上构建 Web 应用程序。执行此操作的代码如下:
func main() { w := webview.New(true) defer w.Destroy() w.SetSize(600, 200, webview.HintNone) // Create a GoLang function callable from JS w.Bind("hello", func() string { return "World!" }) // Create UI with data URI w.Navigate(`data:text/html, <!doctype html> <html> <head><title>Hello</title></head> <body><h1>Hello, world!</h1></body> <script> hello().then((x) => { console.log(x) }) </script> </html>`) w.Run() } 这与 Lorca 非常相似,我认为 Lorca 也是基于 Webview 的。尽管与 Lorca 相似,但输出还是有些不同:
从上图可以看到 Webview 应用程序窗口没有阴影,没有边框,并且在屏幕的左下角进行了初始化。可以通过将Window返回一个 unsafe.Pointer到 OS 依赖的窗口对象的方法(在 macOS 中是 NSWindow)进行定制。这是开始难的地方。
要使用该 Window 对象,我们必须将 Go 的绑定写入本地组件。举例来说,如果我们希望我们的窗口居中启动,我们会调用 NSWindow 的 Center 方法。因此,我们需要在三个文件中写绑定(改编自 gogoa[15]):
ns_window.go
package main // #cgo CFLAGS: -x objective-c // #cgo LDFLAGS: -framework Cocoa //#include "ns_window.h" import "C" import "unsafe" type NSWindow struct { ptr unsafe.Pointer } func (self *NSWindow) Center() { C.Center(self.ptr) } ns_window.h
#include <Cocoa/Cocoa.h> void Center(void *); ns_window.m
#include "ns_window.h" void Center(void *self) { NSWindow *window = self; [window center]; } 然后在main()函数中,我们可以将窗口居中:
window := NSWindow {w.Window()} window.Center() 与 Lorca 不同,Webview 可以针对我们的应用程序进行完全自定义。问题在于它需要一些工作。
Webview 的一些其他部分使得用它变得有些困难:
- 如果使用 Bazel 和 gazelle,则webview生成的Build.bazel文件不正确,clinkopts = ["-framework WebKit"] 必须对其进行修补。
- 调用 w.Init 仅在w.Navigate被调用时有效,但随后w.Eval调用将停止工作。
- 要设置标题,您可以如上所述编写绑定,或者您必须使用Dispatch方法w.Dispatch(func() { w.SetTitle("Title") })。
我不确定有多少是Webview,有多少是 NSWindow。我需要进行更多的调查和学习,才能更清楚地说明这些发生的原因。
Electron
我之前的文章[16]是关于构建一个简单的 Electron 应用程序的,该应用程序如下所示:
Electron 用于许多大型产品,例如 VSCode。这可能是因为将所有内容捆绑到一个应用程序中使可移植性变得更加简单,并且可以广泛地定制应用程序。将应用程序与浏览器和 Node.js 捆绑在一起的不利之处在于,它导致程序 非常庞大。
让 Go 与 Electron 一起工作也有些困难。但有一些框架可以简化[17]此过程,例如 go-astilectron[18],不过这些框架很复杂,并且大多数功能不完整。另一种方法可能是使用我之前写过的[19] Go 编译为 WASM ,但这也不是简单的解决方案。
Electron 的优势在于它是便携式的,可定制的,并且经过了应用程序分发的严格测试。只是和 Go 结合有点复杂。
三者比较
我认为要进行的主要比较是可定制性与简单性。到目前为止,Lorca 是最简单的,其可定制性非常有限,Webview 可以完全自定义,但有些困难,而 Electron 则可以完全自定义,但很难与 Go 一起使用。
同样,框架之间的捆绑包大小也有很大差异。Lorca 的二进制文件大小为 8.7 MB,Webview 的大小为 3.7Mb,Electron 的大小为 157Mb。
调试工具也有所不同:Lorca 和 Electron 使用 Chrome 开发工具,而 Webview 使用 Safari 开发工具。
结论
Lorca 和 Webview 都可以与 Go 一起很好地使用,最终二进制较小,并且具有类似的 API。主要区别在于基础渲染器(本机)和调试工具。
我认为 Electron 与 Go 一起使用可能太复杂了,但没有太多困难。
一个潜在的工作流程是在开发和 Webview 分发期间使用 Lorca。Lorca 提供了用于调试和开发的熟悉工具,其中 Webview 提供了可分发的可定制性。Lorca 也是很好的备份,可以交叉编译到 Webview 不支持的其他操作系统。
注意:还有更多类似的选项,wails[20] 或 gotk[21] 可以提供其他方式来构建/分发应用程序。
作者:Graham Jenson
原文链接:https://maori.geek.nz/golang-desktop-app-webview-vs-lorca-vs-electron-a5e6b2869391
译者:polaris
参考资料
[1]
Electron: https://www.electronjs.org/
[2]
Node.js: https://nodejs.org/
[3]
Chromium: https://www.chromium.org/
[4]
go-app: https://github.com/maxence-charriere/go-app
[5]
go-astilectron: https://github.com/asticode/go-astilectron
[6]
Lorca: https://github.com/zserge/lorca
[7]
dev-tools communication protocol: https://chromedevtools.github.io/devtools-protocol/
[8]
Webview: https://github.com/webview/webview
[9]
webview: https://developer.apple.com/documentation/webkit/webview
[10]
构建一个简单的 electron 应用程序的文章: https://maori.geek.nz/building-an-electron-app-with-bazel-d124ed550957
[11]
Lorca: https://github.com/zserge/lorca
[12]
dev-tools: https://chromedevtools.github.io/devtools-protocol/
[13]
自 2014 年以来: https://maori.geek.nz/jquery-promises-and-deferreds-i-promise-this-will-be-short-d10275f82717
[14]
Webview: https://github.com/webview/webview
[15]
gogoa: https://github.com/alediaferia/gogoa
[16]
之前的文章: https://maori.geek.nz/building-an-electron-app-with-bazel-d124ed550957
[17]
简化: https://github.com/asticode/go-astilectron
[18]
go-astilectron: https://github.com/asticode/go-astilectron
[19]
之前写过的: https://maori.geek.nz/a-web-app-using-bazel-golang-wasm-and-proto-c020914f4341
[20]
wails: https://github.com/wailsapp/wails
[21]
gotk: https://github.com/gotk3/gotk3
版权声明:
作者: FreeClashNode
链接: https://www.freeclashnode.com/news/article-4136.htm
来源: www.freeclashnode.com
文章版权归作者所有,未经允许请勿转载。
热门文章
- 10月1日免费节点分享|18M/S,Clash节点/V2ray节点/Singbox节点/SSR节点|免费上网梯子每天更新
- 10月2日免费节点分享|22.8M/S,Singbox节点/Shadowrocket节点/Clash节点/V2ray节点|免费上网梯子每天更新
- 10月3日免费节点分享|20.1M/S,SSR节点/Singbox节点/V2ray节点/Clash节点|免费上网梯子每天更新
- 9月30日免费节点分享|19.1M/S,Clash节点/V2ray节点/SSR节点/Singbox节点|免费上网梯子每天更新
- 10月6日免费节点分享|19.2M/S,V2ray节点/Singbox节点/Shadowrocket节点/Clash节点|免费上网梯子每天更新
- 10月8日免费节点分享|22.5M/S,V2ray节点/Singbox节点/Clash节点/Shadowrocket节点|免费上网梯子每天更新
- 10月11日免费节点分享|18.6M/S,V2ray节点/Clash节点/SSR节点/Singbox节点|免费上网梯子每天更新
- 10月5日免费节点分享|19.9M/S,Singbox节点/Clash节点/V2ray节点/SSR节点|免费上网梯子每天更新
- 10月14日免费节点分享|22.5M/S,Clash节点/V2ray节点/Singbox节点/SSR节点|免费上网梯子每天更新
- 9月29日免费节点分享|22M/S,SSR节点/Singbox节点/V2ray节点/Clash节点|免费上网梯子每天更新
最新文章
- 跨越知识边界:浙大学子的全球学术网络探索指南
- 10月25日免费节点分享|18.1M/S,SSR节点/V2ray节点/Singbox节点/Clash节点|免费上网梯子每天更新
- 10月24日免费节点分享|20.5M/S,V2ray节点/Clash节点/Singbox节点/Shadowrocket节点|免费上网梯子每天更新
- 刘大猫科学上网全攻略:解锁全球网络的终极指南
- 10月23日免费节点分享|22.2M/S,Shadowrocket节点/Clash节点/Singbox节点/V2ray节点|免费上网梯子每天更新
- 全面解析Quantumult安卓版:功能、安装与配置教程
- 双重防护,畅享无界:AdGuard联手V2RayNG,打造极致安全的上网体验
- 10月22日免费节点分享|18.8M/S,V2ray节点/SSR节点/Singbox节点/Clash节点|免费上网梯子每天更新
- 掌握Clash白名单设置:精准控制代理流量的艺术
- 10月21日免费节点分享|22M/S,Clash节点/Singbox节点/V2ray节点/SSR节点|免费上网梯子每天更新
- 突破网络边界:技术科学上网的终极安全指南
- 10月20日免费节点分享|22.9M/S,SSR节点/V2ray节点/Clash节点/Singbox节点|免费上网梯子每天更新
- Shadowrocket 选购指南:从入门到精通,找到你的专属代理神器
- 10月19日免费节点分享|19.3M/S,Singbox节点/V2ray节点/Clash节点/Shadowrocket节点|免费上网梯子每天更新
- 深入解读:V2Ray为何比SSR更安全?一场网络隐私的全方位较量
- 10月18日免费节点分享|20.6M/S,V2ray节点/Clash节点/SSR节点/Singbox节点|免费上网梯子每天更新
- 深度指南:Shadowrocket从入门到精通——iOS用户的网络自由密钥
- 10月17日免费节点分享|18M/S,Clash节点/SSR节点/V2ray节点/Singbox节点|免费上网梯子每天更新
- 深入解析科学上网套:全方位使用指南与常见问题解答
- 10月16日免费节点分享|22M/S,Shadowrocket节点/V2ray节点/Singbox节点/Clash节点|免费上网梯子每天更新
- 10月15日免费节点分享|21.2M/S,Clash节点/SSR节点/V2ray节点/Singbox节点|免费上网梯子每天更新
- 全局掌控:安卓设备上 Clash 全局模式完整设置指南与深度解析
- 解锁全球游戏体验:育碧平台科学上网全攻略与深度解析
- 10月14日免费节点分享|22.5M/S,Clash节点/V2ray节点/Singbox节点/SSR节点|免费上网梯子每天更新
- 华为Mate 10科学上网全攻略:突破限制,畅游全球网络
- 10月13日免费节点分享|22.1M/S,V2ray节点/Clash节点/Singbox节点/Shadowrocket节点|免费上网梯子每天更新
- 10月12日免费节点分享|22.7M/S,Shadowrocket节点/V2ray节点/Singbox节点/Clash节点|免费上网梯子每天更新
- 量子ULT全方位指南:从下载配置到高阶玩法一网打尽
- 10月11日免费节点分享|18.6M/S,V2ray节点/Clash节点/SSR节点/Singbox节点|免费上网梯子每天更新
- 极路由V2ray插件完全指南:打造家庭网络的安全屏障
- 10月10日免费节点分享|18.3M/S,V2ray节点/Singbox节点/Clash节点/SSR节点|免费上网梯子每天更新
- 极速狂飙与正义追击:《警车 Clash》深度解析与高阶攻略
- 10月9日免费节点分享|22.3M/S,Singbox节点/Clash节点/Shadowrocket节点/V2ray节点|免费上网梯子每天更新
- 用hosts文件科学上网:一份从入门到实战的详细指南
- 10月8日免费节点分享|22.5M/S,V2ray节点/Singbox节点/Clash节点/Shadowrocket节点|免费上网梯子每天更新
- iOS设备上SSR科学上网全教程:从入门到精通
- 10月7日免费节点分享|23M/S,Singbox节点/Clash节点/Shadowrocket节点/V2ray节点|免费上网梯子每天更新
- 深度剖析V2Ray订阅机制:从零搭建高效、安全的科学上网环境
- 10月6日免费节点分享|19.2M/S,V2ray节点/Singbox节点/Shadowrocket节点/Clash节点|免费上网梯子每天更新
- 全面解析蚕蛹生态冲突及其多元价值
- 10月5日免费节点分享|19.9M/S,Singbox节点/Clash节点/V2ray节点/SSR节点|免费上网梯子每天更新
- 从零开始:手把手教你刷梅林固件实现安全科学上网
- 10月4日免费节点分享|20M/S,SSR节点/V2ray节点/Clash节点/Singbox节点|免费上网梯子每天更新
- 跨越边界,自由探索:一加科学上网全面指南与深度解析
- 10月3日免费节点分享|20.1M/S,SSR节点/Singbox节点/V2ray节点/Clash节点|免费上网梯子每天更新
- 10月2日免费节点分享|22.8M/S,Singbox节点/Shadowrocket节点/Clash节点/V2ray节点|免费上网梯子每天更新
- 斐讯K2路由器刷机全攻略:解锁科学上网新境界
- 解锁网络自由:B站d手机科学上网全攻略
- 10月1日免费节点分享|18M/S,Clash节点/V2ray节点/Singbox节点/SSR节点|免费上网梯子每天更新
- 洞悉网络脉络:一份关于Vmess节点测试的全景式实践手记
归档
- 2026-10 49
- 2026-09 58
- 2026-08 63
- 2026-07 61
- 2026-06 55
- 2026-05 56
- 2026-04 51
- 2026-03 60
- 2026-02 52
- 2026-01 56
- 2025-12 59
- 2025-11 55
- 2025-10 56
- 2025-09 55
- 2025-08 49
- 2025-07 31
- 2025-06 30
- 2025-05 31
- 2025-04 30
- 2025-03 388
- 2025-02 360
- 2025-01 403
- 2024-12 403
- 2024-11 390
- 2024-10 403
- 2024-09 388
- 2024-08 402
- 2024-07 427
- 2024-06 442
- 2024-05 181
- 2024-04 33
- 2024-03 31
- 2024-02 29
- 2024-01 51
- 2023-12 52
- 2023-11 32
- 2023-10 32
- 2023-09 3