用 Go 开发桌面应用程序(GUI)的几种方法对比
ccwgpt 2024-10-03 18:45 63 浏览 0 评论
我想构建一个本地 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
相关推荐
- go-admin开源项目,快速搭建一个管理后台系统,直接二次开发上线
-
#头条创作挑战赛#目录1,关于go-admin2,使用go-admin进行构建3,使用go-admin进行数据库,后端初始化4,下载前端代码,进行node编译5,总结1,关于go-admingithu...
- 【开源】一款高效优雅的 Vite+Vue3 中后台管理模板——Arco-Admin
-
今天给大家分享一款开源的基于Vite、TypeScript和Vue3的中后台前端框架,结合了ArcoDesign提供的优雅设计与强大功能。值得一提的是,ArcoDesign是字节跳...
- 看看这样的Dotnet后台管理,那真是叫一个清新优雅高颜值!!!
-
MalusAdmin基于Vue3/TypeScript/NaiveUI和NET7&Sqlsugar开发的后台管理框架。采用最原生最简洁的方式来实现,前端清新优雅高颜值,后端结...
- NET 7 + Vue.js 的前后端分离的通用后台管理系统框架
-
DncZeus项目简介DncZeus是一个基于.NET7+Vue.js的前后端分离的通用后台管理系统框架。后端使用.NET7+EntityFrameworkCore构建,UI则...
- 后台管理系统这么受欢迎吗?又 Go 一个开源项目
-
大家好,我是欧盆索思(opensource),每天为你带来优秀的开源项目!之前推荐过两款后台管理系统,都是Go语言实现的。十分钟内构建数据可视化和管理后台:还同时支持众多框架基于Go语言Gi...
- 支持AI + 低代码!一款开箱即用的强大权限管理系统
-
写在前面大家好,这里是IT学习日记。今日推荐项目:cool-admin,获取方式在文后!1000+优质开源项目推荐进度:51/1000。如需更多类型优质项目推荐,请在文章后留言。项目简介如果你在为设计...
- 使用 Flask-Admin 快速开发博客后台管理系统:关键要点解析
-
一、为什么选择Flask-Admin?Flask-Admin是Flask生态中高效的后台管理框架,核心优势在于:-零代码生成CRUD界面:基于数据库模型自动生成增删改查功能-高度可定制...
- 通用后台管理系统需求及原型设计(后台管理系统需求分析)
-
编辑导读:后台管理系统,会根据不同公司、不同业务的要求做出改变。那么,有没有通用的功能和和需求设计模版呢?有的。本文作者基于自身工作经验,总结了一套通用的后台管理系统需求及原型设计,与你分享。网上很多...
- 基于 Vue3 后台管理平台Vue3.x-Admin
-
今天给大家分享一个Vue3.0框架搭建的后台管理模板Vue3.xAdmin。vue3.x-admin使用vue3开发的后台管理系统。主要包括CSS3特效、可拖拽的div、图表、益智小游戏、vuex4...
- 火爆全网:后台管理系统源码分享(项目部署+前后端手册+运维)
-
这是一款基于SpringBoot2.1.0、Jpa、SpringSecurity、redis、Vue的前后端分离的后台管理系统,项目采用分模块开发方式,权限控制采用RBAC,支持数...
- 好多程序员都在用的通用管理后台—likeadmin
-
前言作为一个程序员,最害怕的就是每次开新项目时,总是要从用户、角色、菜单、接口等一系列功能从头开始写代码,重复的工作实在是太多了,即耗费时间,又耗费精力,这个时候就需要一些能提高效率的工具,例如一个通...
- Axure无限级导航菜单(axure导航栏左右滑动怎么做)
-
在Axure设计中,树组件是展示层级结构数据的关键UI组件,广泛应用于文件管理、导航菜单和数据分类等场景。本篇文章将详细解析如何在Axure中构建一个实用的无限级导航菜单,帮助你高效管理和...
- 三星调整HBM团队组织架构 押宝定制化HBM
-
【三星调整HBM团队组织架构押宝定制化HBM】《科创板日报》27日讯,消息称,三星电子DS(设备解决方案)部门负责人全永铉正在进行内部组织大幅调整。他将三星HBM开发团队细分为标准HBM、定制化HB...
- 北森组织架构一览(北森总部地址)
-
北森的职级组织架构和职级名称都很有意思。可以作为企业参考。1)培养路径:森小白(BeisenNewcomer):新入职员工。森小贤(BeisenSage):L1层级森大侠(BeisenWarri...
- 高手正在使用的四个PLC编程思路,吃透让你少走20年弯路
-
在工业自动化领域,PLC(可编程逻辑控制器)编程是核心技能之一。掌握高效的编程思路不仅能提升工作效率,还能减少调试过程中的错误。以下是四条经过PLC工程师实践检验的编程思路,理解并运用这些思路可以让你...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- go-admin开源项目,快速搭建一个管理后台系统,直接二次开发上线
- 【开源】一款高效优雅的 Vite+Vue3 中后台管理模板——Arco-Admin
- 看看这样的Dotnet后台管理,那真是叫一个清新优雅高颜值!!!
- NET 7 + Vue.js 的前后端分离的通用后台管理系统框架
- 后台管理系统这么受欢迎吗?又 Go 一个开源项目
- 支持AI + 低代码!一款开箱即用的强大权限管理系统
- 使用 Flask-Admin 快速开发博客后台管理系统:关键要点解析
- 通用后台管理系统需求及原型设计(后台管理系统需求分析)
- 基于 Vue3 后台管理平台Vue3.x-Admin
- 火爆全网:后台管理系统源码分享(项目部署+前后端手册+运维)
- 标签列表
-
- MVC框架 (46)
- spring框架 (46)
- 框架图 (58)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- jpa框架 (47)
- laravel框架 (46)
- springmvc框架 (49)
- 分布式事务框架 (65)
- scrapy框架 (56)
- shiro框架 (61)
- 定时任务框架 (56)
- java日志框架 (61)
- JAVA集合框架 (47)
- grpc框架 (55)
- ppt框架 (48)
- 内联框架 (52)
- winform框架 (46)
- gui框架 (44)
- cad怎么画框架 (58)
- ps怎么画框架 (47)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)
- oracle提交事务 (47)