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 的内部做了很多工作,它是可靠的。现在是时候解决它上面的瓶颈并为开发人员提供更好的体验了。