golang构建PC客户端的一些实践

前言 我的技术栈主要是vue3、go、java等。
前端对界面的表达力是最强的,所以暂不考虑原生相关的ui技术,如fyne、QT bind。
而单纯的基于web的跨端方案,虽然能提供一些基本的系统级操作,但对于自定义的底层需求还是需要go来处理。
我选的技术方案就落在了vue+go上,从原理上分为:

  • 独立UI+websocket+底层Go:electron, tauri
  • Go控制的UI+websocket+底层Go:lorca, webview
  • Go完整打包的UI+jsBridge:wails
方案比较 electron 算是web跨端中最具生态和成熟的方案,几年内也陆陆续续用过几次。
但最终也是因为它打包太大、依赖安装经常失败、打包上也遇到不少坑,太过折腾就放弃了。
tauri https://tauri.studio/en/
底层由rust实现,UI渲染依赖于webview2或webkit,提供js api访问系统功能、以及和rust底层交互。
以前端开发为主视角,tauri的相关库放置于前端工程中的src-tauri文件,对前端项目的侵入性较小。
能打包成一个独立的程序,在OSX下测试的效果还不错。
但是在windows下搭建环境时会遇到依赖安装错误,打包工具是基于node的,过于折腾就先不去解决了(交叉编译的支持也在计划内)。
目前tauri发布了beta版本,go binding的支持还在计划内,所以如果我要以go为底层的话,只能采用websocket或http的通信方式。
tauri还计划发布android和ios版本,可以期待下。
lorca https://github.com/zserge/lorca
原理上是从go调用了chrome,然后启动了定制化的chrome界面,所以需要依赖chrome。
这是我用的比较多的一个,因为直接可以从go来控制启动关闭,加载页面等等。
缺点也很明显,开启应用本身是chrome的一个窗口,所以不能做过多的定制化。和go之间的通信,需要自行用websocket或http。
其兄弟项目 github.com/zserge/webview,提供了较多的定制功能,将webview内置。但是在编译打包时还是有一些坑,以及有些功能没找到用法(可能得用c++?),比如全屏。
wails https://wails.io/
和tauri类似,但是底层为go,而且是以go项目的主视角来打包,也是基于webview2或webkit。
目前推出v2版本,暂时只支持了windows的打包(在windows中需要webview2环境支持)。
v2的总体使用体验很不错,优势如下:
  • 可以做到前后端分离开发,打包时只需要在go中引入前端打包好的dist资源即可。
  • 提供了js和go之间的进程内通信。
  • 打包工具是基于go的,基本能避免基于node打包时依赖安装的“劣根性”。目前在windows中打包运行测试很顺畅。
我认为在go+web这个方向,wails v2 应该是目前最好用并且符合要求的一款。
小劣势就是还在beta中,osx和linux的即将推出。有些浏览器的深度定制没有开放出来,比如webview2对不安全资源的访问权限问题,需要底层支持后开发配置出来,不过好在社区响应及时。
总结 我会持续关注wails和tauri的进展。
【golang构建PC客户端的一些实践】项目应用中,将从lorca逐步迁移到wails的方式中。

    推荐阅读