Wails 学习笔记:Wails核心思想理解

文章目录

      • 1. Wails 的核心思想
      • 2. 工作流程
        • 2.1 前端渲染
        • 2.2 后端逻辑
        • 2.3 前后端通信
        • 2.4 应用打包与分发
      • 3. Wails 主要组件
        • 3.1 WebView
        • 3.2 事件与数据绑定
        • 3.3 窗口管理
      • 4. Wails 的优点
      • 5. Wails 的使用场景
      • 6. 启动函数Run
        • `wails.Run()` 的主要功能
        • `wails.Run()` 的参数:`wails.Options`
        • 常用选项说明:
        • `wails.Run()` 的执行流程
        • 总结

Wails 应用程序是一个带有一个 webkit 前端的标准的 Go 应用程序。 应用程序的 Go 部分由应用程序代码和一个运行时库组成, 该库提供了许多有用的操作,例如控制应用程序窗口。 前端是一个 webkit 窗口,将显示前端资源。 前端还可以使用运行时库的 JavaScript 版本。 最后,可以将 Go 方法绑定到前端,这些将显示为可以调用的 JavaScript 方法,就像它们是原生 JavaScript 方法一样。


1. Wails 的核心思想

Wails 的核心目标是允许开发者使用现代前端技术开发桌面应用,同时利用 Go 的强大后端性能。它将前端 UI(如 HTML、CSS、JavaScript)嵌入到一个原生的桌面应用窗口中,并通过 Go 来处理后端逻辑和系统调用。

Wails 提供了前端和后端的桥梁,使得前端代码能够调用 Go 后端的功能,反之亦然。这使得开发者可以用现代的前端框架来创建高效、跨平台的桌面应用程序。


2. 工作流程

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Wails 的工作流程包括以下几个步骤:

2.1 前端渲染

Wails 使用现代前端框架(如 Vue、React、Svelte 等)来构建用户界面。前端资源(HTML、CSS、JavaScript)会被打包并嵌入到 Go 的应用程序中。Wails 会创建一个窗口,用来显示这些前端内容。

  • 前端框架:Wails 支持主流的前端框架如 Vue、React 等,开发者可以通过这些框架构建响应式的用户界面。
  • WebView:前端的界面通过操作系统的原生 WebView 显示,这意味着应用程序的 UI 实际上是在浏览器引擎中渲染的。
2.2 后端逻辑

后端由 Go 编写,负责处理业务逻辑和与系统的交互。开发者可以使用 Go 实现一切与桌面环境相关的功能,如文件系统访问、网络请求、数据处理等。

  • Go 后端:Wails 的后端是基于 Go 的。Go 提供了强大的并发能力和系统级 API 访问权限,适合处理文件、数据库、网络等复杂的逻辑。
2.3 前后端通信

Wails 提供了一个桥梁,让前端和后端能够轻松通信。前端可以调用 Go 后端的函数,而 Go 后端也可以通知前端进行 UI 更新。这种通信机制通过以下方式实现:

  • Wails Bindings:后端的 Go 方法可以通过 wails.Bind() 暴露给前端。前端可以通过 JavaScript 调用这些绑定的 Go 方法,并获取其返回结果。
  • 事件系统:Wails 内置了一个事件系统,允许前后端以发布/订阅的方式相互通信。例如,当后端处理完某个任务后,可以发布一个事件通知前端进行更新。
2.4 应用打包与分发

Wails 可以将前端资源和后端逻辑一起打包为一个可执行文件,适用于 Windows、macOS 和 Linux。由于它不依赖像 Electron 那样的重型运行时,所以生成的应用程序体积更小,性能更高。


3. Wails 主要组件

Wails 的整体架构可以分为以下几个核心组件:

3.1 WebView

Wails 使用操作系统的原生 WebView 来展示前端内容:

  • Windows:使用 Edge (Chromium) WebView2。
  • macOS:使用 WebKit(Safari)。
  • Linux:默认使用 WebKitGTK。

与 Electron 不同,Wails 并不嵌入整个 Chromium 引擎,而是使用操作系统提供的轻量级 WebView 引擎。这大大减少了应用的体积和资源消耗。

3.2 事件与数据绑定

Wails 允许 Go 后端与前端 JavaScript 之间的互操作。开发者可以在前端调用后端的 Go 方法,后端则可以通过事件来通知前端更新视图。

  • 前端调用后端:通过 JavaScript,前端可以直接调用绑定的 Go 函数,并获取返回值。
  • 后端调用前端:Go 后端可以向前端发送事件(如通知或数据更新),让前端做出相应的处理。
3.3 窗口管理

Wails 使用原生窗口系统来管理应用窗口。你可以自定义窗口的标题、大小、是否支持无边框等。与传统的 Web 应用不同,Wails 提供了与操作系统的更深层次集成,如访问系统文件、托盘、通知等。


4. Wails 的优点

  • 轻量级:与 Electron 相比,Wails 应用程序的体积要小得多,因为它依赖于操作系统的 WebView 而不是内嵌整个浏览器引擎。
  • 高效的前后端交互:通过 Go 后端与前端的紧密集成,Wails 提供了一个快速、高效的通信机制,使得开发桌面应用既高效又简洁。
  • 跨平台:Wails 支持 Windows、macOS 和 Linux,因此同一个代码库可以轻松编译为不同平台的应用程序。
  • 现代前端支持:Wails 允许你使用现代前端框架(如 Vue、React、Svelte)来构建桌面应用的 UI。

5. Wails 的使用场景

  • 轻量级桌面应用:与 Electron 相比,Wails 更适合那些不需要繁重渲染引擎的桌面应用,尤其是对于资源敏感的应用程序。
  • 系统工具与自动化工具:利用 Go 的系统访问能力,Wails 非常适合开发与文件系统、数据库或网络交互的桌面工具。
  • 跨平台 GUI 应用:Wails 的跨平台支持使它成为开发简单跨平台 GUI 应用的绝佳选择。

6. 启动函数Run

Wails 提供了一种现代化、轻量级的桌面应用开发方式,它将 Go 的高效后端与现代前端技术相结合。通过操作系统原生 WebView,它能够显著减小应用体积,并提供优秀的性能表现。对于需要开发跨平台桌面应用、并且对性能和体积敏感的开发者来说,Wails 是一个理想的选择。

wails.Run() 是 Wails 框架中的一个关键函数,它用于启动整个 Wails 应用。该函数会初始化应用的前端和后端部分,并且根据开发者在 wails.Options 中的配置,创建应用窗口、加载前端资源、绑定后端逻辑,最终呈现一个完整的桌面应用。

wails.Run() 的主要功能
  1. 初始化 Wails 应用
    wails.Run() 负责初始化整个应用的各个部分,包括应用窗口、前端 WebView、前后端通信机制以及相关的事件系统。它是 Wails 应用的入口点,启动 Wails 框架的运行。

  2. 应用窗口管理
    根据 wails.Options 提供的配置参数,wails.Run() 会创建并显示应用窗口。Wails 支持窗口的大小、标题、是否无边框等配置,所有这些窗口设置都通过 wails.Options 传递给 wails.Run()

  3. 加载前端资源
    Wails 会将前端资源(如 HTML、CSS、JavaScript)打包在应用中,wails.Run() 会加载这些前端资源并通过 WebView 显示在窗口中。前端代码通常由现代前端框架(如 Vue、React、Svelte)构建。

  4. 绑定前后端通信
    wails.Run() 负责建立前端 JavaScript 与后端 Go 代码的通信桥梁。Go 代码可以通过 wails.Bind() 将函数暴露给前端调用。通过 Wails 的事件机制,前后端之间可以轻松交换数据和通知。

  5. 启动生命周期管理
    在 Wails 应用启动和运行的过程中,wails.Run() 会触发不同的生命周期事件,例如:

    • OnStartup:在应用启动时执行,通常用于初始化应用。
    • OnShutdown:在应用关闭时执行,用于清理资源。
    • OnDomReady:当前端的 DOM 完全加载并准备好与后端交互时触发。
wails.Run() 的参数:wails.Options

wails.Run() 接受一个 wails.Options 结构体,开发者通过这个结构体定义应用的行为和配置。wails.Options 中的常见选项包括:

err := wails.Run(&wails.Options{
    Title:            "My Wails App",    // 应用程序的标题
    Width:            1024,              // 窗口的宽度
    Height:           768,               // 窗口的高度
    MinWidth:         400,               // 窗口的最小宽度
    MinHeight:        300,               // 窗口的最小高度
    WindowStartState: options.Normal,    // 窗口的初始状态 (如最大化、最小化)
    HTML:             "frontend/dist/index.html", // 前端 HTML 文件
    Bind: []interface{}{app},            // 绑定到前端的 Go 对象或函数
    OnStartup:        app.startup,       // 启动时调用的函数
    OnDomReady:       app.domReady,      // DOM 加载完成后调用的函数
    OnShutdown:       app.shutdown,      // 应用关闭时调用的函数
})
常用选项说明:
  • Title:设置窗口的标题。
  • WidthHeight:窗口的初始宽高。
  • MinWidthMinHeight:窗口的最小尺寸。
  • WindowStartState:窗口的启动状态,比如默认、最大化、最小化。
  • HTML:前端的入口 HTML 文件路径,通常是前端打包后的静态文件(如 Vue、React 的 index.html)。
  • Bind:绑定的 Go 对象或函数,它们可以在前端 JavaScript 中调用。
  • OnStartup:启动时执行的回调,用于应用初始化。
  • OnDomReady:前端 DOM 完全加载完成时触发的回调。
  • OnShutdown:应用关闭时执行的回调,用于资源清理。
wails.Run() 的执行流程
  1. 解析 wails.Options:Wails 首先会读取 wails.Options,根据开发者的设置来配置应用窗口、加载的前端资源和绑定的后端逻辑。
  2. 创建窗口和 WebView:接着,Wails 会根据操作系统创建一个原生窗口(如 Windows 的 WebView2 或 macOS 的 WebKit),并在其中加载前端的 HTML 页面。
  3. 前后端绑定wails.Run() 会通过 wails.Bind() 将 Go 后端函数暴露给前端 JavaScript,使前端可以调用这些函数。它还会建立前后端的事件机制,确保前后端可以进行数据通信。
  4. 启动应用:最后,wails.Run() 开始监听用户事件,运行主循环,保持应用的正常运行,直到用户关闭窗口。
总结

wails.Run() 是 Wails 框架的核心启动函数,负责初始化应用、加载前端资源、配置窗口、并管理前后端通信。通过 wails.Options,开发者可以灵活配置应用的行为,如窗口属性、前端入口文件、绑定的后端函数等。

wails.Run() 不仅启动了整个应用程序,还提供了一个平台,使得现代前端技术和高效的 Go 后端能够无缝集成,从而实现高性能的桌面应用开发。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/891862.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++】STL篇 string类(使用)

string的学习会分为两个大步骤,第一步就是会使用string,第二部是模拟实现string。这篇文章我们介绍一下string类以及它的使用。string大概有一百多个接口,我们需要重点掌握的就十几二十个。string其实就是字符串,严格来说string类…

STM32传感器模块编程实践(八) HX711压力传感器称重模块简介及驱动源码

文章目录 一.概要二.HX711主要技术指标三.HX711模块参考原理图四.模块接线说明五.模块工作原理介绍六.模块通讯协议介绍七.STM32单片机与HX711模块实现重量测量实验1.硬件准备2.软件工程3.软件主要代码4.实验效果 八.小结 一.概要 电子秤是将检测与转换技术、计算机技术、信息…

一文通透OpenAI o1:从CoT、Quiet-STaR、Self-Correct、Self-play RL、MCST等技术细节到工程复现

前言 注意,本文自10.12日起,正在每天更新的过程中,包括已写的部分也在不断修改(以增加更多技术细节、更加通俗易懂) 预计10.20完成第一版,10月底修订到第二版——具体修订记录详见本文文末.. 可能是去年写或讲的关于ChatGPT原理的…

植物大战僵尸杂交版之后要出联机版植物大战僵尸?(内测中,可在安卓手机上玩,文末附下载链接)

继植物大战僵尸杂交版之后给大家介绍一个杂交版作者正在酝酿的“植物大战僵尸射击版” 植物大战僵尸射击版介绍 《植物大战僵尸杂交版》的创作者“潜艇伟伟迷”即将推出PVZ改版新作——《植物大战僵尸射击版》。游戏将支持PC、手游和web端,提供单人、双人、三人、…

【java Web如何开发?】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

华为eNSP实验:交换机流量控制之风暴控制

一、交换机流量控制之风暴控制 风暴控制是交换机流量控制中的一种重要机制,用于防止网络中的广播、多播或单播风暴对网络性能造成破坏。具体如下: 基本原理:风暴控制通过监控端口的入站流量,并与预设的风暴抑制级别进行对比来管…

java数组讲解

前言: 由上两章,我们已经了解关于java的基础语法,这章我们将讲解数组的相关语法,坐好了没,我们准备要发车啦!!! 我们将从五部分给大家讲解: 1数组的基本概念 2.数组是…

使用Windows创建一个MFC应用【带界面】

MFC使用教程【对初学者保姆型友好!】 目录 前提条件 1:创建MFC应用程序 2. 项目结构解读 引用 外部依赖项 头文件 源文件 资源文件 文件功能详解 项目的主要流程 步骤2:配置OpenCV 安装OpenCV 包含目录与库文件 步骤3&#xff1…

Milvus×Dify半小时轻松构建RAG系统

最近,检索增强生成(RAG)技术在AI界引起了广泛关注。作为一种将知识库与生成模型结合的新型架构,RAG大大提升了AI应用的实际表现。而在构建RAG系统时,Milvus作为业界领先的开源向量数据库,扮演着关键角色。本…

视频格式在线转换,五种超实用的视频格式转换工具!

视频内容无处不在,从教育课程到娱乐电影,从社交媒体分享到在线会议,视频已成为我们日常生活中不可或缺的一部分。然而,不同的设备和平台支持的视频格式各异,会导致视频文件在某些设备上无法播放。因此,掌握…

计算机毕业设计python+spark知识图谱课程推荐系统 课程预测系统 课程大数据 课程数据分析 课程大屏 mooc慕课推荐系统 大数据毕业设计

指导教师意见: 1.对“文献综述”的评语: 对教育领域数据可视化的相关背景和现状做了综述,明确了课题的研究目标和研究重点,并对研究手段进行了概述。为后面的毕业设计做好了准备。 对本课题的深度、广度及工作量的…

【开源】第三期:数字货币程序化交易终端开源

关于初衷: 这篇文章,其实应该在六年前发出来,但是受制于各种杂事和生活琐事,一直拖到现在,想必有朋友看到在"终端"那期里,聊到的数字货币交易的实践,那个时候遍地都是数字货币交易所&…

git gui基本使用

一、图形化界面 二、创建新项目 创建文件,加入暂存区,提交到版本库 三、创建分支 四、合并分支 1.切换至master 五、更新分支 六、解决冲突 修改冲突,加入暂存区,提交到版本库 七、远程创建库 Gitee - 基于 Git 的代码托管和研…

储能硬件实物图

B 薄膜电容 薄膜电容 D 杜邦线 杜邦线 G 固态电容 固态电容 I IGBT iGBT S 散热片 散热片 Y 压敏电阻 压敏电阻 液冷板 液冷板

瑞萨IDE:CS+ for CC编译过程中执行脚本文件

最近发现使用CS for CC IDE发现一个很有意思的功能。编译工程过程中,IDE自动执行Python脚本和批处理脚本,极大地提高开发效率。 编写好脚本文件后,在IDE中选择CC-RH(Build Tool)->Common Options->Others。 Co…

SQL进阶技巧:如何找出开会时间有重叠的会议室?| 时间区间重叠问题

目录 0 场景描述 1 数据准备 2 问题分析 方法1:利用 lateral view posexplode()函数将表展开成时间明细表 方法2:利用数学区间讨论思想求解 3 小结 如果觉得本文对你有帮助,想进一步学习SQL语言这门艺术的,那么不妨也可以选…

arm架构ceph pacific部署

背景 合作伙伴实验室的华为私有云原来使用单点的nfs做为存储设备,现有两方面考量,业务需要使用oss了,k8s集群及其他机器也需要一套可扩展的分布式文件系统 部署ceph 初始机器配置规划 IP配置主机名Role10.17.3.144c8g1T数据盘ceph-node01…

Apache Seatunnel Zeta引擎-启动脚本分析

Apache SeaTunnel Zeta引擎的集群模式启动的第一步是执行bin/seatunnel-cluster.sh脚本,所以先来学习下这个脚本。 脚本执行流程分析 脚本简要注释 #!/bin/bash # # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license a…

Java项目:154 基于ssm旅游信息网站(含论文+ppt)

作者主页:源码空间codegym 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 使用旅游信息网站的分为管理员和用户两个角色的权限子模块。 管理员所能使用的功能主要有:个人中心、用户管理、旅游景点管理、交…

双指齐下:那晚我与算法的不解之缘

公主请阅 1.快乐数1.1题目说明示例 1示例 2 1.3题目分析1.4代码部分1.5代码解析 2.复写02.1题目说明示例 1示例 2 2.2题目分析2.3代码部分2.4代码解析 1.快乐数 题目传送门 1.1题目说明 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」定义为: 对于一个正…