51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

使用 Wails:结合 Go 和 Web 技术轻松构建桌面应用程序

本站提供Linux服务器运维,自动化脚本编写等服务,如有需要请联系博主微信:xiaozme

Wails 是一个项目,可以让您使用 Go 和 Web 技术编写桌面应用程序。它可以被视为 Go 的快速、轻量级的 Electron 替代品。结合丰富的现代前端,您可以使用 Go 的灵活性和强大功能,轻松构建应用程序。

在之前发的AsBot客户端 中xiaoz正是使用Wails技术来进行开发。

图片

Wails功能

  • 原生菜单、对话框、主题和半透明

  • Windows、macOS 和 linux 支持

  • 内置 Svelte、React 、Preact 、Vue、Lit 和 Vanilla JS 的模板

  • 从 JavaScript 轻松调用 Go 方法

  • 自动将 Go 结构体转换为 TypeScript 模块

  • Windows 上不需要 CGO 或外部 DLL

  • 使用 Vite 的实时开发模式

  • 可以轻松创建、构建和打包应用的强大命令行工具

  • 丰富的 运行时库

  • 使用 Wails 构建的应用程序兼容 Apple & Microsoft 商店

什么情况下适合选择Wails

提起跨平台客户端开发,就会想到Electron。Electron是跨平台客户端开发的首选,许多知名软件,如VScode和腾讯QQ的重构版,都是使用Electron开发的。然而,Electron也存在一些缺点,例如内存占用量高、应用程序体积大且需要熟悉Node.js。如果您无法容忍这些缺点,同时满足以下条件,您可以考虑使用Wails。

适合情况:

  1. 开发一些简单的客户端

  2. 您已经熟悉Golang这门开发语言

  3. 您已经熟悉一门Web 前端框架,比如Vue3

如果您已经掌握了上述要求,那么完全可以使用Wails来开发跨平台客户端。但如果您不熟悉上述技术栈,我不建议选择Wails,因为学习成本可能比Electron更高。

Wails快速上手

xiaoz在使用Wails开发的时候,搭配的前端技术是Vue3,但Wails不仅仅是支持Vue3,包括Svelte、React等都是可以的。

环境要求:

  • Go 1.18+

  • NPM (Node 15+)

安装Wails的话参考帮助文档就行了:Wails安装

开始开发

Wails项目创建成功后,你就可以在frontend目录下进行前端工作的开发了。如果使用Vue3作为前端技术的话,通常还需要搭配Vue Router、Pinia、axios等JavaScript 库一起使用。

然后再选一个你熟悉的Vue 3 UI组件库,比如Element Plus啥的。

参数选项

如果您需要对应用程序参数做出修改,可以在main.go这里面进行设置,比如默认窗口大小、标题等,具体可以参考官方文档:应用程序参数

前端与后端通讯

如果你在前端中想要调用Golang提供的后端方法,可以在app.go中编写自己的方法。比如:

// 扫描文件并入库
func (a *App) ScanFiles(path string) string {
   result := controller.Scan(path)
   return result
}

如果前端需要调用ScanFiles()这个方法,需要先导入:

import {ScanFiles} from "../../wailsjs/go/main/App.js"

然后再调用:

ScanFiles(path.value)
   .then((res)=>{
       console.log(res)
   })
   .catch((err)=>{
       console.log(err)
   })

我个人觉得这样的调用方式写起来会很累,尤其是处理复杂数据的时候。我们也可以换一种思路和方法,通过HTTP调用的方式来通讯,比如后端使用Gin作为WEB服务。

使用Gin来与前端进行通讯

如果后端我们使用Gin来提供WEB服务,那么前端只需要进行HTTP调用即可,但是这里需要注意一下。

  1. Gin框架需要在wails.Run()之前运行,否则Gin会导致wails被阻塞

  2. Gin需要保持后端运行,否则也会被阻塞

Gin后台运行使用下面的方法就行了:

   go func() {
       r.Run(":11280")
   }()

打包wails

使用命令wails build即可打包为二进制文件,我们也可以使用wails build -upx使用upx来进行压缩,从而让体积更加小巧。upx在Windows下默认可用,其它平台需要单独安装,部分情况下使用upx压缩后会出现异常,请根据实际情况选择。

如果打包后的客户端存在异常,需要进行调试,也可以使用wails build -debug来进行编译,这样允许您使用前端调试工具。

不支持交叉编译

Wails不支持交叉编译,也就是说您在Windows下无法打包MacOS程序,因此xiaoz搞了一个黑苹果,见:如何将Intel NUC8i5BEH安装MacOS系统:教程及经验分享,来专门打包MacOS应用。

踩坑

wails修改文件后,无法自动编译更新

问题原因是wails在创建项目的时候会自动生成文件夹frontend/Views,注意这个Views首字母是大写的,在Windows机器下默认区分大小写,使用Vue Router引入的时候,路径一定要注意大小写,否则不会报错,但是wails修改文件后,无法自动编译更新。

结语

Wails的出现让我们在开发跨平台客户端时,多了一个选择。Wails更适合开发一些较为简单的客户端程序。如果您不熟悉Golang,且对体积大小等因素不在意,也许Electron更加合适。总之,应根据自身情况和场景进行选择。

赞(8)
未经允许不得转载:工具盒子 » 使用 Wails:结合 Go 和 Web 技术轻松构建桌面应用程序