Wails v3 技术分析:跨平台桌面应用开发框架的革新

Wails v3 技术分析:跨平台桌面应用开发框架的革新

Wails v3 技术分析:跨平台桌面应用开发框架的革新

1. Wails 简介

Wails 是一个使用 Go 简化编写跨平台桌面应用程序能力的项目。它使用原生 webview 组件作为前端(而不是嵌入式浏览器),将世界上最流行的 UI 系统的强大功能引入 Go,同时保持轻量级。

2. Wails v2 的功能特点

第二版于 2022年9月22日 发布,带来了许多增强功能:

  • 实时开发,利用流行的 Vite 项目
  • 管理窗口和创建菜单的丰富功能
  • 微软的 WebView2 组件
  • 生成对应 Go 结构体的 TypeScript 模型
  • 创建 NSIS 安装程序
  • 混淆构建

现在,Wails v2 提供了强大的工具来创建丰富的跨平台桌面应用程序。

3. 当前问题分析

随着 Wails v2 的普及,项目面临一些关键问题,主要集中在以下几个方面:

3.1 API 设计问题

构建 Wails 应用程序的 API 由两部分组成:

  • 应用程序 API:只有一个函数 Run(),需要一堆控制应用程序如何工作的选项。这是一种”声明式”的方法,隐藏了很多潜在的复杂性。
  • 运行时 API:为开发者提供许多实用功能,包括窗口管理、对话框、菜单、事件、日志等。但需要传递”context”,对新手开发者来说既令人沮丧又令人困惑。

运行时 API 的最大问题是它是为只使用单个窗口的应用程序设计的,随着多窗口需求的增长,API 不太适合这种情况。

3.2 绑定生成问题

Wails 的关键特性之一是为 Go 方法生成绑定,使它们可以从 JavaScript 调用。当前执行此方法的过程有些 hack,涉及使用特殊标志构建应用程序,然后运行生成的二进制文件,该二进制文件使用反射来确定已绑定的内容。这导致了先有鸡还是先有蛋的情况:没有绑定就无法构建应用程序,没有构建应用程序就无法生成绑定。

3.3 构建系统问题

当前的构建系统虽然强大,但非常不透明,定制和调试都非常困难。当你运行 wails build 时,它在幕后做很多事情,但整个过程对开发者来说是一个黑盒。

4. v3 API 的改进设计

针对当前 API 的问题,v3 将采用更加直观的编程方法,允许开发人员直接与应用程序元素交互。

func main() {
    app := wails.NewApplication(options.App{})
    myWindow := app.NewWindow(options.Window{})
    myWindow.SetTitle("My Window")
    myWindow.On(events.Window.Close, func() {
        app.Quit()
    })
    app.Run()
}

这种设计使所有当前的窗口运行时方法都成为窗口对象上的方法。对于其他运行时方法,可以像这样移动到应用程序对象:

app := wails.NewApplication(options.App{})
app.NewInfoDialog(options.InfoDialog{})
app.Log.Info("Hello World")

这种 API 设计更加强大,可以构建更复杂的应用程序,并且允许创建多个窗口,这是 GitHub 上投票最多的功能:

func main() {
    app := wails.NewApplication(options.App{})
    myWindow := app.NewWindow(options.Window{})
    myWindow.SetTitle("My Window")
    myWindow.On(events.Window.Close, func() {
        app.Quit()
    })
    
    myWindow2 := app.NewWindow(options.Window{})
    myWindow2.SetTitle("My Window 2")
    myWindow2.On(events.Window.Close, func() {
        app.Quit()
    })
    
    app.Run()
}

5. 绑定生成机制的优化

为了解决当前绑定生成的问题,v3 将从反射方法转向AST(抽象语法树)方法。与反射相比,AST 方法要快得多,但复杂度也更高。

首先,我们可能需要对如何在代码中指定绑定施加某些约束。目标是支持最常见的用例,然后在以后扩展它。这种方法将消除当前方法的许多复杂性,使绑定生成过程更加高效和可靠。

6. 构建系统的革新

为了解决构建系统不透明且难以定制的问题,v3 将转向一个存在于 Wails 之外的构建系统。在使用 Task 一段时间后,团队发现它是配置构建系统的绝佳工具,任何使用过 Makefile的人都应该相当熟悉。

构建系统将使用 Taskfile.yml 文件进行配置,该文件默认使用任意受支持的模板生成。这将具有完成所有当前任务所需的所有步骤,例如构建或打包应用程序,从而实现轻松定制。

这个工具将没有外部要求,因为它将构成 Wails CLI 的一部分。这意味着您仍然可以使用 wails build,它会完成它今天所做的所有事情。但是,如果您想自定义构建过程,可以通过编辑 Taskfile.yml 文件来实现。

构建难题中缺少的部分是构建过程中的原子操作,例如图标生成、压缩和打包。为了解决这个问题,Wails CLI 将提供所有这些功能作为 CLI 的一部分。这意味着构建仍然按预期工作,没有额外的外部工具,但是您可以用您喜欢的任何工具替换构建的任何步骤。

7. v3 带来的好处与发展计划

这些积极的变化将为项目带来巨大的好处:

code更直观的 API

新的 API 将更加直观,并允许构建更复杂的应用程序,特别是支持多窗口功能。

speed更快的绑定生成

使用静态分析生成绑定会更快,并且会降低当前流程的复杂性。

build透明的构建系统

使用已建立的外部构建系统将使构建过程完全透明,从而实现强大的定制。

对项目维护者的好处是:

  • 新的 API 将更容易维护和适应新功能和平台
  • 新的构建系统将更容易维护和扩展,希望这将导致社区驱动构建管道的新生态系统
  • 更好地分离项目中的关注点,这将使添加新功能和平台变得更加容易

发展计划

很多这方面的实验已经完成,而且看起来不错。这项工作目前没有固定时间表,但希望到 2023 年第一季度末,将有一个 Mac 的 alpha 版本,允许社区进行测试、试验并提供反馈。

8. 总结

Wails v3 的核心改进

  • v2 API 是声明式的,对开发人员隐藏了很多,不适合多窗口等功能。将创建一个更简单、直观且功能更强大的新 API
  • 构建系统不透明且难以定制,因此我们将转向外部构建系统,它将全部开放
  • 绑定生成缓慢且复杂,因此我们将转向静态分析,这将消除当前方法的许多复杂性

我们在 v2 的内部做了很多工作,它是可靠的。现在是时候解决它上面的瓶颈并为开发人员提供更好的体验了。

— Lea
如果您或您的公司发现 Wails 有用,请考虑赞助项目。谢谢!

发表评论

人生梦想 - 关注前沿的计算机技术 acejoy.com 🐾 步子哥の博客 🐾 背多分论坛 🐾 知差(chai)网 🐾 DeepracticeX 社区 🐾 老薛主机 🐾