【GoWails】Go做桌面应用开发?本篇文章带你上手Wails框架!一步步带你玩明白前后端双端的数据绑定!

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
应用实时监控服务-可观测链路OpenTelemetry版,每月50GB免费额度
可观测监控 Prometheus 版,每月50GB免费额度
简介: wails是一个可以让你使用Go和Web技术编写桌面应用的项目可以将它看作Go的快并且轻量级的Electron替代品。可以使用Go的功能,并结合现代化UI完成桌面应用程序的开发

Wails

WebView

WebView是一个基于webkit的引擎,可以解析DOM元素,展示html页面的空间,它和浏览器展示页面的原理是相同的,所以可以把它当作浏览器看待。

加载流程:

  1. 原生应用加载html页面(加载页面的方式可能有多种,比如加载本地写好的html文件,或者放置在服务器的文件)
  2. 加载完成,展示就是通过webview来渲染展示的,如果系统没有webview,则是无法渲染展示html的

Wails项目

wails是一个可以让你使用Go和Web技术编写桌面应用的项目

可以将它看作Go的快并且轻量级的Electron替代品。可以使用Go的功能,并结合现代化UI完成桌面应用程序的开发

功能

  • 原生菜单、对话框、主题和半透明
  • Windows、macOS 和 linux 支持
  • 内置 Svelte、React 、Preact 、Vue、Lit 和 Vanilla JS 的模板
  • 从 JavaScript 轻松调用 Go 方法
  • 自动将 Go 结构体转换为 TypeScript 模块
  • Windows 上不需要 CGO 或外部 DLL
  • 使用 Vite 的实时开发模式
  • 可以轻松创建、构建和打包应用的强大命令行工具
  • 丰富的 运行时库
  • 使用 Wails 构建的应用程序兼容 Apple & Microsoft 商店

安装Wails

Wails 有许多安装前需要的常见依赖项(确保您电脑的环境中是符合下述要求的):

  • Go 1.20+
  • NPM (Node 15+)

直接执行这个安装命令:

go install -v github.com/wailsapp/wails/v3/cmd/wails3@latest

安装完成后,运行

wails3

查看是否有wails提示,如果有则表示安装完成

注意:

  • 如果输入wails提示不是一个命令,有可能你的path变量没有指向GO的安装路径

PATH变量:

PATH变量需要指向你GO安装的bin目录,这样才能识别到安装的wails.exe文件

创建项目

安装好Wai-CLI后,可以使用wails init 命令生成一个新项目

使用JavaSciprt生成一个Svelte项目:

wails3 init -n myproject -t svelte

也可以使用TypeScript

wails3 init -n myproject -t svelte

项目布局

Wails 项目有以下布局:

├─ build                        # 包含构建过程使用的文件
│ ├─ darwin                    # 后台管理应用模块(安装saas时存在、不安装则删除)
│ │ ├─ icons.icns             # macOS 应用程序图标
│ │ ├─ Info.dev.plist         # 开发配置
│ │ ├─ Info.plist             # 生产配置
│ │ └─ Taskfile.yml           # macOS 构建任务
│ ├─ linux                     # 特定于 Linux 的构建文件
│ │ ├─ appimage               # AppImage 打包
│ │ │ └─ build.sh            # AppImage 构建脚本
│ │ ├─ nfpm                   # NFPM 包装
│ │ │ ├─ scripts             # 构建脚本
│ │ │ │ ├─ postinstall.sh   # 
│ │ │ │ ├─ postremove.sh    # 
│ │ │ │ ├─ preinstall.sh    # 
│ │ │ │ └─ preremove.sh     # 
│ │ │ └─ nfpm.yaml           # 文件包配置
│ │ └─ Taskfile.yml           # Linux 构建任务
│ ├─ windows                   # 特定于 Windows 的构建文件
│ │ ├─ nsis                   # NSIS 安装程序文件
│ │ │ ├─ project.nsi         # NSIS 项目文件
│ │ │ └─ wails_tools.nsh     # NSIS 帮助程序脚本
│ │ ├─ icon.ico               # Windows 应用程序图标
│ │ ├─ info.json              # 应用程序元数据
│ │ ├─ Taskfile.yml           # Windows 生成任务
│ │ └─ wails.exe.manifest     # Windows 清单文件
│ ├─ appicon.png          # 应用程序图标
│ ├─ config.yml           # 构建配置
│ └─ Taskfile.yml         # 生成任务
├─ frontend                # 前端应用程序文件
├─ greetservice.go         # Go后端服务
├─ main.go                 # 主要应用程序代码
├─ README.md               # 项目文档
└─ Taskfile.yml            # 项目任务配置

运行

使用命令进行运行

wails3 dev

第一次运行会非常长,需要耐心等待

直接获取项目

如果嫌弃上述步骤麻烦,可以直接拉取wails-go-init仓库进行开发,仓库内的项目已经搭建好了基本的目录结构。

  • 项目的地址:
git clone https://gitee.com/rix_renex/wails-go-init.git

运行项目前,请确保您的电脑上安装了以下环境:

  1. Go - 1.23+
  2. Node.js - 18+
  3. wails3

前后端双端数据绑定

框架通过wails命令内置模板在frontend前端目录下生成bindings代码绑定Go和前端通讯,前通过js函数调用后端Go函数。

其实,前后端双端的数据绑定只要看如下三个点即可:

Service声明

在新建一个Service时,不论是否是一个Service文件,还是方法,Wails生成时它会根据结构体来进行链式输出

  • WebService.go
package web
import (
    ...
)
// 必须存在,这是双端绑定的关键
type WebService struct{}
// 打开网页跳转
func (g *WebService) JumpWebUrl(url string) {
    link.JumpWeb(url)
}
// 获取常见网址名称
func (g *WebService) GetWebNameList() map[string]_struct.WebAction {
    return _struct.CheckWebNameList()
}

来看一个Service创建的过程:在函数声明的时候 (g *WebService) 这个必须指向当前Service所拥有的某个struct结构体

我们所有的Service都依靠这个struct结构体进行连接调用

当创建Service文件后,还需要在main.go文件中声明该Service文件

  • main.go
app := application.New(application.Options{
    // ...
    Services: []application.Service{
        // 添加go方法程序
        application.NewService(&web.WebService{}),
    },
    // ...
})

在这里main.go文件中,声明app变量时,需要添加go的方法程序,也就是application.NewService()方法;

  • 该方法内部传递的就是你上一步在Service中声明的struct结构

wails在内部解析时,就会依靠这里传递的struct来生成binding中对应的Service类,然后通过引用变量名进行调用

bindings源码:

可以看到它生成了两个文件

index.js和webservice.js

  • index.js
// @ts-check
// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
// This file is automatically generated. DO NOT EDIT
import * as WebService from "./webservice.js";
export {
    WebService
};
  • webservice.js
// @ts-check
// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
// This file is automatically generated. DO NOT EDIT
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore: Unused imports
import {Call as $Call, Create as $Create} from "@wailsio/runtime";
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore: Unused imports
import * as _struct$0 from "../../struct/models.js";
/**
 * 获取常见网址名称
 * @returns {Promise<{ [_: string]: _struct$0.WebAction }> & { cancel(): void }}
 */
export function GetWebNameList() {
    let $resultPromise = /** @type {any} */($Call.ByID(2464737837));
    let $typingPromise = /** @type {any} */($resultPromise.then(($result) => {
        return $$createType3($result);
    }));
    $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise);
    return $typingPromise;
}
/**
 * 打开网页跳转
 * @param {string} url
 * @returns {Promise<void> & { cancel(): void }}
 */
export function JumpWebUrl(url) {
    let $resultPromise = /** @type {any} */($Call.ByID(1783560979, url));
    return $resultPromise;
}
// Private type creation functions
const $$createType0 = _struct$0.WebInformation.createFrom;
const $$createType1 = $Create.Array($$createType0);
const $$createType2 = _struct$0.WebAction.createFrom;
const $$createType3 = $Create.Map($Create.Any, $$createType2);

生成的bindings包内的内容,其实就是对Service进行解析成js文件,以便前端进行调用。而在main.go中声明就是打开Service的开放,使得wails能够扫描到对应的service

引用路径与使用

那么此时Service已经创建完毕了,下面来在实际的js或vue业务中进行调用

import { WebService } from "../bindings/passwordManagement/src/service/web";
/**
传值
*/
const jumpWeb =(url)=>{
  WebService.JumpWebUrl(url)
}
/**
获取数据
*/
WebService.GetWebNameList().then(data=>{
})

是不是很简单?其实只要引入bindings中index.js所在目录就行了,然后将index.js中暴露出来的变量进行声明,就可以使用Service了,其他的值传递@wailsio/runtime包中的代码会帮你解决的

💕👉博客专栏

目录
相关文章
|
1月前
|
算法 Java Go
【GoGin】(1)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
gin 框架中采用的路优酷是基于httprouter做的是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。
163 4
|
4月前
|
人工智能 测试技术 Go
Go 语言的主流框架
本文全面解析了 Go 语言主流技术生态,涵盖 Web 框架、微服务、数据库工具、测试与部署等多个领域。重点介绍了 Gin、Echo、Beego 等高性能框架,以及 gRPC-Go、Go-Micro 等微服务组件。同时分析了 GORM、Ent 等 ORM 工具与测试部署方案,并结合场景提供选型建议,助力开发者构建高效稳定的 Go 应用。
1022 0
|
2月前
|
消息中间件 缓存 NoSQL
Redis各类数据结构详细介绍及其在Go语言Gin框架下实践应用
这只是利用Go语言和Gin框架与Redis交互最基础部分展示;根据具体业务需求可能需要更复杂查询、事务处理或订阅发布功能实现更多高级特性应用场景。
239 86
|
3月前
|
数据采集 数据挖掘 测试技术
Go与Python爬虫实战对比:从开发效率到性能瓶颈的深度解析
本文对比了Python与Go在爬虫开发中的特点。Python凭借Scrapy等框架在开发效率和易用性上占优,适合快速开发与中小型项目;而Go凭借高并发和高性能优势,适用于大规模、长期运行的爬虫服务。文章通过代码示例和性能测试,分析了两者在并发能力、错误处理、部署维护等方面的差异,并探讨了未来融合发展的趋势。
280 0
|
1月前
|
开发框架 前端开发 Go
【GoGin】(0)基于Go的WEB开发框架,GO Gin是什么?怎么启动?本文给你答案
Gin:Go语言编写的Web框架,以更好的性能实现类似Martini框架的APInet/http、Beego:开源的高性能Go语言Web框架、Iris:最快的Go语言Web框架,完备的MVC支持。
285 2
|
5月前
|
JSON 中间件 Go
Go 网络编程:HTTP服务与客户端开发
Go 语言的 `net/http` 包功能强大,可快速构建高并发 HTTP 服务。本文从创建简单 HTTP 服务入手,逐步讲解请求与响应对象、URL 参数处理、自定义路由、JSON 接口、静态文件服务、中间件编写及 HTTPS 配置等内容。通过示例代码展示如何使用 `http.HandleFunc`、`http.ServeMux`、`http.Client` 等工具实现常见功能,帮助开发者掌握构建高效 Web 应用的核心技能。
307 61
|
3月前
|
前端开发 JavaScript Linux
用 Go 写桌面应用?试试 Wails 吧!
Wails 是一个结合 Go 语言与前端技术(如 Vue、React)开发轻量级桌面应用的框架。相比 Electron,它更轻、更快,资源占用更低,支持跨平台打包,适合熟悉 Web 开发又追求原生性能的开发者。
679 0
|
5月前
|
开发框架 JSON 中间件
Go语言Web开发框架实践:路由、中间件、参数校验
Gin框架以其极简风格、强大路由管理、灵活中间件机制及参数绑定校验系统著称。本文详解其核心功能:1) 路由管理,支持分组与路径参数;2) 中间件机制,实现全局与局部控制;3) 参数绑定,涵盖多种来源;4) 结构体绑定与字段校验,确保数据合法性;5) 自定义校验器扩展功能;6) 统一错误处理提升用户体验。Gin以清晰模块化、流程可控及自动化校验等优势,成为开发者的优选工具。
|
5月前
|
开发框架 安全 前端开发
Go Web开发框架实践:模板渲染与静态资源服务
Gin 是一个功能强大的 Go Web 框架,不仅适用于构建 API 服务,还支持 HTML 模板渲染和静态资源托管。它可以帮助开发者快速搭建中小型网站,并提供灵活的模板语法、自定义函数、静态文件映射等功能,同时兼容 Go 的 html/template 引擎,具备高效且安全的页面渲染能力。
|
5月前
|
开发框架 JSON 中间件
Go语言Web开发框架实践:使用 Gin 快速构建 Web 服务
Gin 是一个高效、轻量级的 Go 语言 Web 框架,支持中间件机制,非常适合开发 RESTful API。本文从安装到进阶技巧全面解析 Gin 的使用:快速入门示例(Hello Gin)、定义 RESTful 用户服务(增删改查接口实现),以及推荐实践如参数校验、中间件和路由分组等。通过对比标准库 `net/http`,Gin 提供更简洁灵活的开发体验。此外,还推荐了 GORM、Viper、Zap 等配合使用的工具库,助力高效开发。