「GoCN酷Go推荐」Golang轻量级桌面程序wails2教学
01
推荐理由
不依赖cgo!不依赖cgo!不依赖cgo!真的不依赖cgo,且跨平台,原生渲染 无嵌入式浏览器,轻量级,生成的文件很小,而且只有一个可执行文件就可运行。
02
功能介绍
后端使用标准 Go
使用任意前端技术构建 UI 界面
快速为您的 Go 应用生成 Vue、Vuetify、React 前端代码
通过简单的绑定命令将 Go 方法暴露到前端
使用原生渲染引擎 - 无嵌入式浏览器
共享事件系统
原生文件系统对话框
强大的命令行工具
跨多个平台
03
使用指南
本次教学在windows下进行。
04
安装
1、首先要安装三个必要的东西:
npm: https://nodejs.org/en/download/
webviews2: https://developer.microsoft.com/zh-cn/microsoft-edge/webview2/#download-section (下载常青版引导程序
,记得安装是一定用管理员安装)
*upx:https://github.com/upx/upx/releases/tag/v3.96 (下载后:upx-3.96-win64.zip,然后放入环境变量)2、golang版本必须是1.17及其以上,安装wails工具:
go install github.com/wailsapp/wails/v2/cmd/wails@latest
3、wails doctor (用此命令查看是否已安装完整必要依赖) 如下图:
目录结构概要:
/main.go - 主应用
/frontend/ - 前端项目文件
/build/ - 项目构建目录/build/appicon.png - 应用程序图标/build/darwin/ - Mac 特定的项目文件/build/windows/ - Windows 特定的项目文件
/wails.json - 项目配置
/go.mod - Go 模块文件
/go.sum - Go 模块校验文件frontend目录没有特定于 Wails 的内容,可以是您选择的任何前端项目。
build目录在构建过程中使用。这些文件可以修改以自定义您的构建。如果文件从构建目录中删除,将重新生成默认版本。
go.mod中的默认模块名称是“changeme”。您应该将其更改为更合适的内容。
开始做我们的圣诞树
1、首先,利用wails工具创建一个项目:
wails init -n 项目名称
2、然后,我们开始写咱们的main:(看到go:embed注解就知道为什么要用go1.17及其以上的版本了吧)
package mainimport ("embed""log""github.com/wailsapp/wails/v2/pkg/options/mac""github.com/wailsapp/wails/v2""github.com/wailsapp/wails/v2/pkg/logger""github.com/wailsapp/wails/v2/pkg/options""github.com/wailsapp/wails/v2/pkg/options/windows"
)//go:embed frontend/src
var assets embed.FS//go:embed build/appicon.png
var icon []bytefunc main() {// 创建一个APP结构体实例app := NewApp()// 给这个APP设置参数err := wails.Run(&options.App{Title: "GoCN祝天下所有的Gopher圣诞节快乐",Width: 720,Height: 570,MinWidth: 720,MinHeight: 570,MaxWidth: 1280,MaxHeight: 740,DisableResize: false,Fullscreen: false,Frameless: false,StartHidden: false,HideWindowOnClose: false,RGBA: &options.RGBA{R: 33, G: 37, B: 43, A: 255},Assets: assets,LogLevel: logger.DEBUG,OnStartup: app.startup,OnDomReady: app.domReady,OnShutdown: app.shutdown,Bind: []interface{}{app,},// Windows平台特定选项Windows: &windows.Options{WebviewIsTransparent: false, // 背景是否半透明WindowIsTranslucent: false, // 导航条是否半透明DisableWindowIcon: false, // 是否关闭窗口上的图标},Mac: &mac.Options{TitleBar: mac.TitleBarHiddenInset(),WebviewIsTransparent: true,WindowIsTranslucent: true,About: &mac.AboutInfo{Title: "Vanilla Template",Message: "Part of the Wails projects",Icon: icon,},},})if err != nil {log.Fatal(err)}
}
3、写咱们的前端,在frontend/src/index.html下写入下面的代码(我也是抄h阿泉的):
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
<html>
<head><title>圣诞节快乐</title><meta charset="utf-8"><style>html, body {width: 100%;height: 100%;margin: 0;padding: 0;border: 0;}canvas {width: 100%;height: 100%;}div {margin: 0;padding: 0;border: 0;}.nav {position: absolute;top: 0;left: 0;width: 100%;height: 27px;background-color: white;color: black;text-align: center;line-height: 25px;}a {color: black;text-decoration: none;border-bottom: 1px dashed black;}a:hover {border-bottom: 1px solid red;}.previous {float: left;margin-left: 10px;}.next {float: right;margin-right: 10px;}.green {color: green;}.red {color: red;}textarea {width: 100%;height: 100%;border: 0;padding: 0;margin: 0;padding-bottom: 20px;}.block-outer {float: left;width: 22%;height: 100%;padding: 5px;border-left: 1px solid black;margin: 30px 3px 3px 3px;}.block-inner {height: 68%;}.one {border: 0;}</style>
</head>
<body marginwidth="0" marginheight="0">
<canvas id="c" height="800" width="300"><script>var collapsed = true;function toggle() {var fs = top.document.getElementsByTagName('frameset')[0];var f = fs.getElementsByTagName('frame');if (collapsed) {fs.rows = '250px,*';// enable resizing of frames in firefox/operafs.noResize = false;f[0].noResize = false;f[1].noResize = false;} else {fs.rows = '30px,*';// disable resizing of frames in firefox/operafs.noResize = true;f[0].noResize = true;f[1].noResize = true;}collapsed = !collapsed;}</script><script>var b = document.body;var c = document.getElementsByTagName('canvas')[0];var a = c.getContext('2d');document.body.clientWidth; // fix bug in chrome.</script><script>// start of submission //M = Math;Q = M.random;J = [];U = 16;T = M.sin;E = M.sqrt;for (O = k = 0; x = z = j = i = k < 200;) with (M[k] = k ? c.cloneNode(0) : c) {width = height = k ? 32 : W = 446;with (getContext('2d')) if (k > 10 | !k) for (font = '60px Impact', V = 'rgba('; I = i * U, fillStyle = k ? k == 13 ? V + '205,205,215,.15)' : V + (147 + I) + ',' + (k % 2 ? 128 + I : 0) + ',' + I + ',.5)' : '#cca', i < 7;) beginPath(fill(arc(U - i / 3, 24 - i / 2, k == 13 ? 4 - (i++) / 2 : 8 - i++, 0, M.PI * 2, 1))); else for (; x = T(i), y = Q() * 2 - 1, D = x * x + y * y, B = E(D - x / .9 - 1.5 * y + 1), R = 67 * (B + 1) * (L = k / 9 + .8) >> 1, i++ < W;) if (D < 1) beginPath(strokeStyle = V + R + ',' + (R + B * L >> 0) + ',40,.1)'), moveTo(U + x * 8, U + y * 8), lineTo(U + x * U, U + y * U), stroke();for (y = H = k + E(k++) * 25, R = Q() * W; P = 3, j < H;) J[O++] = [x += T(R) * P + Q() * 6 - 3, y += Q() * U - 8, z += T(R - 11) * P + Q() * 6 - 3, j / H * 20 + ((j += U) > H & Q() > .8 ? Q(P = 9) * 4 : 0) >> 1]}setInterval(function G(m, l) {A = T(D - 11);if (l) return (m[2] - l[2]) * A + (l[0] - m[0]) * T(D);a.clearRect(0, 0, W, W);J.sort(G);for (i = 0; L = J[i++]; a.drawImage(M[L[3] + 1], 207 + L[0] * A + L[2] * T(D) >> 0, L[1] >> 1)) {if (i == 2e3) a.fillText('Merry Christmas!', U, 412);if (!(i % 7)) a.drawImage(M[13], ((157 * (i * i) + T(D * 5 + i * i) * 5) % W) >> 0, ((113 * i + (D * i) / 60) % (290 + i / 99)) >> 0);}D += .02}, 1)// end of submission //</script>
</body>
</html>
4、在当前目录下用命令行开启开发者热加载工具查看效果:
wails dev
效果图来啦,提前祝各位2021圣诞节快乐~:
https://cdn.xinchao.com/goods/202112/6082eea0f69486dc233fecde834dd8911920x1080.gif
5、当然我们也可以打包成自己的可执行二进制文件哟:
wails build
生成的文件放在了build/bin下。
05
总结
其实之前我也知道有不少的go桌面应用库,可要么就是效率低,要么就是生产的二进制文件太大,但wails似乎让我看到了新希望,很多简单的桌面级小应用可能会因此而诞生更多。
06
参考资料
wails中文文档(https://wails.io/zh-Hans/docs/reference/options)
源码仓库((https://github.com/wailsapp/wails)
《酷Go推荐》招募:
各位Gopher同学,最近我们社区打算推出一个类似GoCN每日新闻的新栏目《酷Go推荐》,主要是每周推荐一个库或者好的项目,然后写一点这个库使用方法或者优点之类的,这样可以真正的帮助到大家能够学习到
新的库,并且知道怎么用。
大概规则和每日新闻类似,如果报名人多的话每个人一个月轮到一次,欢迎大家报名!戳「阅读原文」,即可报名
扫码也可以加入 GoCN 的大家族哟~
「GoCN酷Go推荐」Golang轻量级桌面程序wails2教学相关推荐
- 「GoCN酷Go推荐」Golang的Ealstic链接库
背景介绍 Elasticsearch是一个分布式.高扩展.高实时的搜索与数据分析引擎,用于海量文档的搜索.有些项目会将Elasticsearch当做存储海量数据的数据库使用,可见其查询性能之高效.作为 ...
- 「GoCN酷Go推荐」golang 跨平台部署利器
1 研究背景 go程序部署时,直接将编译好的文件在服务器上运行即可,一般无需安装所依赖的第三方库. Linux下部署分为以下几种方式: 使用nohup 命令 使用 Supervisord管理 使用sy ...
- 「GoCN酷Go推荐」后现代时代远程办公网络问题的golang开源解决方案 —— PairMesh...
PairMesh是什么? Pairmesh是一款先进的虚拟局域网(VPN)工具,用来搭建与访问安全,易用,高性能的点对点的软件定义虚拟局域网,为远程办公的网络连接问题提供了开箱即用的解决方案. 拥抱开 ...
- 「GoCN酷Go推荐」QQ机器人 go-cqhttp
什么是 go-cqhttp?✦ QQ机器人,可以做的事儿太多了,比如一个UP主需要群发多个QQ群,以便通知粉丝们开播:再比如可以检测群内或发给自己的消息,而通过代码直接回复做的简单回复.比如检测群内有 ...
- 「GoCN酷Go推荐」高性能内存缓存 ristretto
背景 ristretto 是 dgraph 团队开源的一款高性能内存缓存库,旨在解决高并发场景下的缓存性能和吞吐瓶颈.dgraph 专攻的方向是高性能图数据库,ristretto 就是其图数据库和 K ...
- 「GoCN酷Go推荐」快速搭建私有云服务 go-btfs
# 1. go-btfs 是什么?# go-btfs 是一个去中心化的文件存储平台,无论图片.文件.视频等等各类文件.每个人都可以在自己电脑上安装部署 BTFS 节点,然后大家的节点相互连接,构成一个 ...
- 「GoCN酷Go推荐」JSON 数据获取器 JID
01 推荐理由 JSON 格式数据适用范围非常广泛,一个内容丰富的json数据可能很大,使用 JID 可以让你非常舒服的获取到想要到数据. 02 简介 JID 是一个过滤JSON格式数据 cli ...
- 「GoCN酷Go推荐」简单易用的性能分析工具——nitro
#1 推荐理由 Golang官方在程序性能分析方面提供了用来分析cpu/内存等采样信息的pprof,以及用来追踪和分析运行时事件的trace,这两个工具对于分析程序的性能瓶颈可以说是得心应手.但是,对 ...
- 「GoCN酷Go推荐」漏桶限流库 — uber-go/ratelimit
上次有同学分享了 单机限流器 time/rate 库,讲了 Golang 标准库中基于令牌桶实现限流组件的 time/rate 使用,同时也讲了一些限流算法原理. 这里分享一个 uber 开源的一套基 ...
最新文章
- 微信是把“杀猪刀”,还改变了我的表情包
- android自定义差值器,如何创建自定义插值器以在android中应用翻译动画
- NameValueCollection详解
- IT兄弟连 JavaWeb教程 EL表达式获取对象的属性以及数组的元素
- 王峰记忆法 解密王峰记忆法之迷
- iOS Hacker Keychain相关The executable was signed with invalid entitlements
- 腾讯DCI上线基于集中控制的SR-TE方案
- mysql replicate error
- [react] react组件的state和props两者有什么区别?
- Mac终端神器zsh
- PyTorch系列入门到精通——梯度消失与爆炸,损失函数
- Cocos2d-x编程中的runOnUiThread方法和runOnGLThread方法剖析
- 机器学习常用十大算法
- Mac开机速度优化的详细教程
- Vivado下载 安装 与 和谐教程
- AABB和OBB包围盒简介
- 织梦dede canonical 标签页面设置(最新完美修改)
- Qlv转换MP4格式 让你不再错过
- InterSystems IRIS数据平台:数据接收速度测试
- 淘宝里面的data-spm-anchor-id属性有什么用?