用 Go 开发桌面应用程序(GUI)的几种方法对比(使用go开发桌面gui程序)

我想构建一个本地 Go 桌面应用程序,有几种方法可以做到:

  1. Electron[1]:将 Node.js[2]Chromium[3] 浏览器绑定在一起,以创建一个打包的本地 Web 应用程序。可与 Go 框架(例如 go-app[4]go-astilectron[5])一起使用。
  2. Lorca[6]:使用本地安装的 Chrome 浏览器,通过 dev-tools communication protocol[7] 实现。
  3. 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 之间的通信:

用 Go 开发桌面应用程序(GUI)的几种方法对比(使用go开发桌面gui程序)

更酷的是,您可以在 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 相似,但输出还是有些不同:

用 Go 开发桌面应用程序(GUI)的几种方法对比(使用go开发桌面gui程序)

从上图可以看到 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 的一些其他部分使得用它变得有些困难:

  1. 如果使用 Bazel 和 gazelle,则webview生成的Build.bazel文件不正确,clinkopts = ["-framework WebKit"] 必须对其进行修补。
  2. 调用 w.Init 仅在w.Navigate被调用时有效,但随后w.Eval调用将停止工作。
  3. 要设置标题,您可以如上所述编写绑定,或者您必须使用Dispatch方法w.Dispatch(func() { w.SetTitle("Title") })。

我不确定有多少是Webview,有多少是 NSWindow。我需要进行更多的调查和学习,才能更清楚地说明这些发生的原因。

Electron

之前的文章[16]是关于构建一个简单的 Electron 应用程序的,该应用程序如下所示:

用 Go 开发桌面应用程序(GUI)的几种方法对比(使用go开发桌面gui程序)

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

(0)
上一篇 2024年5月3日 上午9:09
下一篇 2024年5月3日 上午9:20

相关推荐

  • 集群研修助力学前教育内涵发展(学前集中教育心得体会)

    来源:【中国教育新闻网】 幼儿园间师资力量不均、教师专业成长缺乏教研支持、教研制度不健全等问题,一度成为贵阳市学前教育发展的桎梏。为切实解决这些问题,2016年贵阳市印发《贵阳市教…

    科研百科 2023年8月7日
    76
  • 古惠南谈电池续航:不要把技术突破和商业推广混为一谈

    新华网北京1月17日电 中国电动汽车百人会论坛(2021)期间,1000公里续航成为热门话题。 中国电动汽车百人会副理事长、中国科学院院士欧阳明高在发言时提出,电池材料创新是厚积薄…

    科研百科 2023年3月14日
    82
  • 电子档案管理系统有哪些

    电子档案管理系统是一种用于管理文件和数据的计算机软件系统。随着数字化时代的到来,电子档案管理系统变得越来越普遍。本文将介绍一些常见的电子档案管理系统,包括: 1. Google D…

    科研百科 2024年8月20日
    31
  • onecode

    onecode: 一种简单易用的代码编辑器 随着编程技术的不断发展,越来越多的编程工具和编辑器被开发出来,但是,对于初学者来说,选择一个简单易用的代码编辑器并不容易。今天,我们介绍…

    科研百科 2024年10月31日
    0
  • 比较好的软件项目管理软件

    好的软件项目管理软件可以帮助项目经理更好地管理项目进度、资源、风险等信息,提高项目的效率和质量。本文将介绍一些比较好的软件项目管理软件,包括项目管理工具、团队协作工具和项目报告工具…

    科研百科 2024年8月19日
    27
  • 工程项目管理系统描述

    工程项目管理系统是一种用于管理和协调工程项目的软件系统。在现代商业环境中,工程项目管理对于企业的成功至关重要。通过使用工程项目管理系统,企业可以更好地组织项目活动,提高项目效率,降…

    科研百科 2025年7月2日
    1
  • 全国精选:农业化工重大项目(农业化工都有什么产品)

    标准厂房建设项目 01 项目性质:新建 进展阶段:工程设计 建设工期:2023-11-01至2024-11-01 建设内容:厂房、综合服务楼等 项目概况:曲阳骊山工业园标准厂房建设…

    科研百科 2024年4月11日
    73
  • 逐章逐条学条例丨学习《中国共产党纪律处分条例》(五十四)

    《中国共产党纪律处分条例》 2003年12月23日中共中央政治局会议审议批准  2003年12月31日中共中央发布  2023年12月8日中共中央政治局会议第三次修订  2023年…

    科研百科 2024年6月30日
    44
  • 参与科研项目指什么

    参与科研项目指参与由研究人员组成的团队,在特定的实验室或研究中心环境中,进行科学研究项目的过程。通常,这些项目涉及探索新的科学领域,发现新的知识和技术,并开发新的产品或服务。 参与…

    科研百科 2025年2月23日
    4
  • 合同与合同管理

    合同与合同管理 合同是现代商业活动中不可或缺的一部分。合同是双方为了保证各自利益而达成的协议,具有法律约束力。在合同管理方面,有效的合同管理可以帮助企业更好地保障自身利益,减少风险…

    科研百科 2024年9月19日
    20