用 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
全面掌握Shadowrocket:解锁网络自由与安全的终极指南
在当今信息时代,网络已成为我们日常生活的重要组成部分。然而,由于各种原因,许多网站和服务在某些地区可能无法访问。这时,一款强大的网络代理工具就显得尤为重要。Shadowrocket作为iOS设备上的一款优秀代理工具,不仅能够帮助用户突破网络限制,还能提供安全、稳定的网络连接体验。本文将全面介绍Shadowrocket的功能、配置技巧以及使用心得,帮助您更好地掌握这一工具。
什么是Shadowrocket?
Shadowrocket是一款专为iOS设备设计的网络代理工具,它通过配置各种代理服务器,帮助用户访问被限制的网站和服务。无论是用于学术研究、商业需求还是个人娱乐,Shadowrocket都能提供强大的支持。其核心功能在于通过代理服务器转发网络流量,从而实现匿名浏览和访问受限内容。
Shadowrocket的主要功能
1. 多协议支持
Shadowrocket支持多种代理协议,包括Shadowsocks、VMess、Trojan等。这种多协议支持使得用户可以根据自己的需求和网络环境选择最适合的协议,从而获得最佳的网络体验。
2. 全局代理与分流
用户可以选择全局代理模式,将所有网络流量通过代理服务器发送,确保隐私和安全。同时,Shadowrocket还支持节点分流功能,用户可以根据访问的网站或服务选择不同的代理节点,从而提高访问速度和稳定性。
3. 自定义规则
Shadowrocket允许用户自定义规则,实现更精细的流量控制。例如,用户可以设置某些网站直连,而其他网站通过代理访问。这种灵活性使得Shadowrocket在众多代理工具中脱颖而出。
Shadowrocket与其他代理工具的比较
与VPN的比较
VPN通常提供全局代理服务,虽然简单易用,但灵活性和性能往往不如Shadowrocket。Shadowrocket允许用户根据需求调整代理规则,从而在速度和稳定性上更具优势。此外,Shadowrocket支持多种协议,而许多VPN仅支持单一协议,这在复杂网络环境下显得尤为重要。
与其他代理工具的比较
市面上许多代理工具功能单一,仅支持有限的协议或配置选项。Shadowrocket则提供了丰富的配置选择和高度自定义的功能,满足技术用户和普通用户的不同需求。
如何下载与安装Shadowrocket
要使用Shadowrocket,首先需要在iOS设备上安装该应用。以下是详细的安装步骤:
- 访问App Store:打开App Store,在搜索框中输入“Shadowrocket”。
- 下载应用:找到应用后,点击“获取”并完成安装。请注意,Shadowrocket可能需要付费购买。
- 安装完成:安装完成后,点击图标打开应用。
初始化和账号注册
首次使用Shadowrocket时,需要进行简单的初始化设置:
- 登录或注册账号:部分功能可能需要账号登录,您可以选择注册新账号或使用现有账号登录。
- 完成初始配置:根据应用提示,完成基本的网络和代理设置。
配置代理
添加节点
节点是代理服务器的核心配置,以下是添加节点的详细步骤:
- 打开Shadowrocket:进入应用主界面。
- 进入配置页面:点击右下角的“配置”选项。
- 添加节点:选择“添加节点”,您可以选择手动配置或导入配置文件。
- 输入节点信息:包括服务器地址、端口、密码和协议类型。完成后点击“保存”。
使用公共节点
如果您没有自己的代理服务器,可以尝试使用公共节点:
- 查找公共节点:在网络论坛或社交媒体上搜索Shadowrocket公共节点分享。
- 添加节点:按照上述步骤添加这些节点信息。
- 测试节点:连接后测试节点的速度和稳定性,选择最优节点使用。
设置规则
Shadowrocket的规则功能可以帮助用户更精细地控制网络流量:
- 进入规则设置:在设置界面中选择“规则”。
- 添加规则:根据需要添加规则条件,例如基于域名、IP地址或关键词。
- 测试规则:保存规则后,测试其是否生效,确保流量按照预期进行分流。
检测和优化连接
为了获得最佳的网络体验,定期检测和优化连接是必要的:
- 节点测试:使用Shadowrocket内置的节点测试功能,评估节点的延迟和速度。如果节点表现不佳,及时更换。
- 查看连接日志:通过日志功能查看历史连接情况,帮助排查问题并优化配置。
常见问题解答
1. Shadowrocket如何注册?
注册通常在应用内完成,需要提供邮箱并设置密码。部分功能可能需要付费解锁。
2. Shadowrocket支持哪些协议?
Shadowrocket支持Shadowsocks、VMess、Trojan等多种协议,用户可以根据需求灵活选择。
3. 如何获取可用的节点?
除了自己搭建节点外,用户还可以通过在线社区获取其他用户分享的公共节点。
4. 使用Shadowrocket会影响网络速度吗?
如果选择高速优质的节点,通常不会显著影响网络速度,甚至可能因为优化路由而提升速度。
5. Shadowrocket是否支持Android?
Shadowrocket目前仅支持iOS设备,Android用户可以选择其他类似工具,如Shadowsocks客户端。
结论
通过本文的详细介绍,相信您已经对Shadowrocket的功能、配置和使用有了全面的了解。无论是为了访问受限内容、提升网络速度,还是保障隐私安全,Shadowrocket都是一款值得信赖的工具。掌握其使用技巧,不仅能帮助您更好地利用网络资源,还能在日益复杂的网络环境中保持优势。
点评:
Shadowrocket作为iOS平台上的一款代理工具,以其强大的功能和灵活的配置选项赢得了众多用户的青睐。它不仅支持多种代理协议,还提供了精细的流量控制规则,满足不同用户的需求。与其他工具相比,Shadowrocket在性能和安全性上表现突出,尤其适合对网络代理有较高要求的用户。通过本文的指南,用户可以轻松上手并充分利用Shadowrocket的各项功能,实现网络自由与安全的双重目标。无论是技术爱好者还是普通用户,都能从中受益匪浅。
版权声明:
作者: freeclashnode
链接: https://www.freeclashnode.com/news/article-4136.htm
来源: FreeClashNode
文章版权归作者所有,未经允许请勿转载。
热门文章
- 12月6日|19.8M/S,V2ray节点/Clash节点/SSR节点/Singbox节点|免费订阅机场|每天更新免费梯子
- 11月22日|20.2M/S,Shadowrocket节点/V2ray节点/Clash节点/Singbox节点|免费订阅机场|每天更新免费梯子
- 12月5日|23M/S,Singbox节点/V2ray节点/Clash节点/SSR节点|免费订阅机场|每天更新免费梯子
- 12月11日|23M/S,Singbox节点/V2ray节点/Clash节点/Shadowrocket节点|免费订阅机场|每天更新免费梯子
- 11月25日|20.3M/S,Clash节点/V2ray节点/Singbox节点/SSR节点|免费订阅机场|每天更新免费梯子
- 12月9日|20M/S,Singbox节点/V2ray节点/Clash节点/SSR节点|免费订阅机场|每天更新免费梯子
- 12月12日|18.6M/S,Singbox节点/Clash节点/Shadowrocket节点/V2ray节点|免费订阅机场|每天更新免费梯子
- 12月8日|21.6M/S,Singbox节点/SSR节点/V2ray节点/Clash节点|免费订阅机场|每天更新免费梯子
- 12月13日|18.1M/S,V2ray节点/SSR节点/Clash节点/Singbox节点|免费订阅机场|每天更新免费梯子
- 11月20日|19.3M/S,Singbox节点/Shadowrocket节点/V2ray节点/Clash节点|免费订阅机场|每天更新免费梯子
最新文章
- 12月17日|20.7M/S,Singbox节点/V2ray节点/Shadowrocket节点/Clash节点|免费订阅机场|每天更新免费梯子
- 12月16日|21M/S,SSR节点/Singbox节点/Clash节点/V2ray节点|免费订阅机场|每天更新免费梯子
- 12月15日|20.8M/S,SSR节点/Singbox节点/Clash节点/V2ray节点|免费订阅机场|每天更新免费梯子
- 12月14日|21.5M/S,V2ray节点/Shadowrocket节点/Singbox节点/Clash节点|免费订阅机场|每天更新免费梯子
- 12月13日|18.1M/S,V2ray节点/SSR节点/Clash节点/Singbox节点|免费订阅机场|每天更新免费梯子
- 12月12日|18.6M/S,Singbox节点/Clash节点/Shadowrocket节点/V2ray节点|免费订阅机场|每天更新免费梯子
- 12月11日|23M/S,Singbox节点/V2ray节点/Clash节点/Shadowrocket节点|免费订阅机场|每天更新免费梯子
- 12月10日|19.9M/S,Clash节点/V2ray节点/Singbox节点/SSR节点|免费订阅机场|每天更新免费梯子
- 12月9日|20M/S,Singbox节点/V2ray节点/Clash节点/SSR节点|免费订阅机场|每天更新免费梯子
- 12月8日|21.6M/S,Singbox节点/SSR节点/V2ray节点/Clash节点|免费订阅机场|每天更新免费梯子
归档
- 2025-12 30
- 2025-11 55
- 2025-10 56
- 2025-09 55
- 2025-08 49
- 2025-07 31
- 2025-06 30
- 2025-05 31
- 2025-04 31
- 2025-03 383
- 2025-02 360
- 2025-01 403
- 2024-12 403
- 2024-11 390
- 2024-10 403
- 2024-09 388
- 2024-08 402
- 2024-07 424
- 2024-06 446
- 2024-05 184
- 2024-04 33
- 2024-03 32
- 2024-02 29
- 2024-01 50
- 2023-12 53
- 2023-11 32
- 2023-10 32
- 2023-09 3