electron+go 实现跨平台是否可行?

2020-05-05 11:22:50 +08:00
 teawithlife

五一期间花时间学习了一下 electron,基本算是入门吧

学习的目的是为了解决跨平台桌面应用的开发问题,虽然也算熟悉 Qt,但是相对目前日新月异的新技术来说,有点太“经典”了

所以考虑用 electron 来做跨平台桌面应用开发,我的想法是拿 electron 做前端,再用 golang 写个后端,负责一些比较底层,或者对运行效率要求比较高,抑或是有保密需求的工作。electron 和 golang 的跨平台都非常容易实现,这样就可以比较完美的实现这个需求。

一开始我把后端放在服务器上,但是就要求使用者必须要联网才能使用,这个有些麻烦。后来找到 child_process, 于是可以把可执行程序直接放在程序包中,然后 spawn 出后端程序,再进行进程间通讯即可

目前有几个问题想请教一下各位大佬:

  1. 有大佬尝试过这种组合吗?有没有什么坑?为什么没怎么看到有人这么搞?

  2. 从 electron 启动后端程序,可以放在 app.ready 事件中,但是程序退出时需要自动关闭后端,放在哪个事件比较合适?因为我看到 before-quit, will-quit, quit 这三个事件,都标注了

    Note: On Windows, this event will not be emitted if the app is closed due to a shutdown/restart of the system or a user logout.

    而 window-all-closed 事件,又说

    If the user pressed Cmd + Q, or the developer called app.quit(), Electron will first try to close all the windows and then emit the will-quit event, and in this case the window-all-closed event would not be emitted.

    那么到底放在哪个事件里更合适呢?

  3. 进程间通讯我用 HTTP 接口,一个原因是开发方便,另一个原因是做成 web 也可以通用,但是这里存在一个后端绑定哪个端口的问题,我想了两个方案:

    • 方案一是 electron 先找一个可用端口,然后通过命令行参数的方法传给后端,缺点在于没有找到一个比较好的查找可用端口的方法(看了几个库,都是通过尝试 listen 的方法,这种方法存在一个小概率竞争的可能性)
    • 方案二是后端随机绑定一个端口,然后通过 ipc 的方法,然后把端口号传给前端,这个方案就是担心有点不通用

    不知道还有没有更好的方法?

10210 次点击
所在节点    问与答
34 条回复
teawithlife
2020-05-06 07:06:55 +08:00
@qwe121002 #20 提问的话,最好单独发一个主题,尽量描述清楚你的目的和已经做了哪些尝试,这样会有更多的人帮助你
buffzty
2020-05-06 14:06:21 +08:00
我的想法跟你一样. 桌面软件用 electron+tsx 做前端展示. 大部分功能用 node 写, 再用 go 起一个 http 服务器 做一些本来需要用 c 完成的功能.
teawithlife
2020-05-06 14:16:58 +08:00
@buffzty #22 对的,就是这么个思路。那你在实际使用过程中,有碰到什么问题吗?
buffzty
2020-05-06 15:34:09 +08:00
@teawithlife 还没写过 pc 端项目,我们现在全部都是 web. 前端 tsx, 后端 go .我觉得套个 electron 应该问题不大
teawithlife
2020-05-06 16:00:50 +08:00
@buffzty #24 作为业余前端,我的操作是找个 vue+element-ui 模板改一改,搞定显示的内容,所有的逻辑放到后端来实现
qwe121002
2020-05-08 00:35:35 +08:00
@qwe121002
@teawithlife 好的,谢谢
zkdfbb
2020-07-17 00:05:37 +08:00
@teawithlife 这两天也跑了个 demo,发现了一个很奇怪的问题,使用 asar: true 打包时,child_process 里面的函数,exec, fork, spawn 是可以用的,但是遇到一个很奇怪的问题,使用 go 编译出来一个后台程序,然后通过 electron 来启动它。无论是用 spawn 还是 exec,打包出来的程序在 mac 平台下是可以正常启动的,但是在 windows 下面怎么都启动不了,一启动就退出,exit code 是 1,问题是这个 go 编译出来的程序单独打开是正常的,说明不是程序的问题,而且用一段最简单的程序,比如直接 time.Sleep 一段时间,用 spawn 启动也是马上就退出了。但是用 spawn 启动一个其他的程序,比如 dir,python -m http.server 又都是正常的。崩溃了。。。
teawithlife
2020-07-17 09:00:28 +08:00
@zkdfbb #27 exec, fork, spawn 在启用 asar 时不能使用,我是看文档里面这么写的,倒确实没试过,也可能是操作系统相关。
你在 windows 平台用 execFile 可以启动这个 go 程序吗?
进程的启动,不同操作系统的实现区别会比较大,可能有些情况不太好兼容
zkdfbb
2020-07-17 10:32:11 +08:00
@teawithlife execFile 也试过了,就是很奇怪,其他的比如 python -m http.server 都 OK,偏偏 go 程序就不行
AndyAO
2021-01-09 08:51:39 +08:00
思源笔记是这种结构
前端 JavaScript(Electron),后端 Go
dosgo
2021-09-13 23:16:14 +08:00
挑来跳去,还是 electron 好用,fyne 实在是丑,然后好多复杂功能不好弄,而且官方理念我就看的无语。。。跨平台 GUI 这套目前 electron 最优,毕竟跨平台的 GUI 库投入太大很少公司开发。。。
lizhenda
2022-06-23 14:52:30 +08:00
思路不错,准备这么干,但有个疑问。我直接已 nodejs 来写后台服务和用 Go 来写有什么优劣呢。感觉 nodejs 直接在 electron 的主进程启动更加方便,但 go 的话性能更好,可以直接放在云上,不止是个本地服务了。纠结。
teawithlife
2022-06-25 10:27:11 +08:00
@lizhenda #32 我个人是熟悉 go ,前端只是半吊子,所以选择用 go ,如果你熟悉 js 的话,用 nodejs 也是可以的,至于放到云上运行的需求,套个 docker 就可以了,还有性能问题,不必过早考虑,先把业务跑起来再说,等日活上来了,再考虑优化也不迟
qqshenhan
2023-11-15 12:25:02 +08:00
@teawithlife 楼主觉得 wails 怎么样

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/668620

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX