跳到主要内容

·阅读时间 9 分钟
Lea Anthony

简介

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

版本 2 于 2022 年 9 月 22 日发布,并带来了许多增强功能,包括

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

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

这篇博文旨在探讨该项目目前的状况以及我们可以改进的地方。

我们现在在哪里?

自 v2 发布以来,看到 Wails 的受欢迎程度不断上升,真是令人难以置信。我不断地被社区的创造力和他们用 Wails 构建的奇妙事物所惊叹。随着更多的人关注该项目,随之而来的是更多功能请求和错误报告。

随着时间的推移,我能够识别出该项目面临的一些最紧迫的问题。我也能够识别出阻碍该项目发展的一些事情。

当前问题

我发现以下几个方面我认为阻碍了该项目的发展

  • API
  • 绑定生成
  • 构建系统

API

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

  • 应用程序 API
  • 运行时 API

应用程序 API 以其仅有一个函数而闻名:Run(),该函数接受大量选项,这些选项控制着应用程序的工作方式。虽然这种方式非常易于使用,但也非常有限。它是一种“声明式”方法,隐藏了许多底层的复杂性。例如,没有主窗口的句柄,因此你无法直接与它交互。为此,你需要使用运行时 API。当你开始想要做更复杂的事情,例如创建多个窗口时,就会出现问题。

运行时 API 为开发人员提供了许多实用程序函数。这包括

  • 窗口管理
  • 对话框
  • 菜单
  • 事件
  • 日志

我对运行时 API 不满意的地方有很多。首先,它需要传入一个“上下文”。这对新开发人员来说既令人沮丧又令人困惑,因为他们传入一个上下文,然后收到运行时错误。

运行时 API 最大的问题是,它最初是为仅使用单个窗口的应用程序设计的。随着时间的推移,对多个窗口的需求不断增长,而 API 并不适合这种情况。

关于 v3 API 的想法

如果我们可以做这样的事情,那不是很好吗?

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()
}

绑定生成

Wails 的一个关键功能是为你的 Go 方法生成绑定,以便可以从 Javascript 中调用它们。目前执行此操作的方法有点像 hack。它涉及使用一个特殊的标志构建应用程序,然后运行生成的二进制文件,该二进制文件使用反射来确定已绑定了哪些内容。这会导致一个循环依赖问题:在没有绑定文件的情况下无法构建应用程序,在没有构建应用程序的情况下无法生成绑定文件。解决这个问题的方法有很多,但最好的方法是不使用这种方法。

之前曾尝试编写 Wails 项目的静态分析器,但它们进展不大。在最近一段时间,随着更多关于此主题的资料出现,执行此操作变得稍微容易了一些。

与反射相比,AST 方法要快得多,但它也复杂得多。首先,我们可能需要对代码中如何指定绑定施加一些约束。目标是支持最常见的用例,然后在之后进行扩展。

构建系统

与 API 的声明式方法类似,构建系统是为了隐藏构建桌面应用程序的复杂性而创建的。当你运行 wails build 时,它在后台执行很多操作

  • 构建后端二进制文件以进行绑定并生成绑定文件
  • 安装前端依赖项
  • 构建前端资产
  • 确定应用程序图标是否存在,如果存在,则将其嵌入
  • 构建最终二进制文件
  • 如果构建用于 darwin/universal,则构建两个二进制文件,一个用于 darwin/amd64,另一个用于 darwin/arm64,然后使用 lipo 创建一个胖二进制文件
  • 如果需要压缩,则使用 UPX 压缩二进制文件
  • 确定此二进制文件是否要打包,如果要打包,则
    • 确保图标和应用程序清单被编译到二进制文件中(Windows)
    • 构建应用程序包,生成图标包并将其复制到应用程序包中,将二进制文件和 Info.plist 复制到应用程序包中(Mac)
  • 如果需要 NSIS 安装程序,则构建它

整个过程虽然功能强大,但也非常不透明。很难对其进行自定义,也很难调试。

为了在 v3 中解决这个问题,我想将构建系统转移到 Wails 之外的构建系统中。在使用 Task 一段时间后,我成为了它的忠实粉丝。它是一个用于配置构建系统的绝佳工具,对于使用过 Makefiles 的任何人来说应该都相当熟悉。

构建系统将使用 Taskfile.yml 文件进行配置,该文件将在任何支持的模板中默认生成。这将包含执行所有当前任务所需的步骤,例如构建或打包应用程序,允许轻松自定义。

此工具不会有任何外部要求,因为它将成为 Wails CLI 的一部分。这意味着你仍然可以使用 wails build,它将执行它现在执行的所有操作。但是,如果你想自定义构建过程,可以通过编辑 Taskfile.yml 文件来实现。这也意味着你可以轻松地理解构建步骤,并且如果你愿意,可以使用自己的构建系统。

构建难题中缺失的部分是构建过程中的原子操作,例如图标生成、压缩和打包。要求使用一堆外部工具对开发人员来说不会是一次很好的体验。为了解决这个问题,Wails CLI 将提供所有这些功能作为 CLI 的一部分。这意味着构建仍然按预期工作,无需额外的外部工具,但你可以用任何你喜欢的工具替换构建过程中的任何步骤。

这将是一个更加透明的构建系统,将允许更轻松地进行自定义,并解决围绕构建系统提出的许多问题。

回报

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

  • 新的 API 将更加直观,将允许构建更复杂的应用程序。
  • 使用静态分析进行绑定生成将更快,并减少当前过程中的许多复杂性。
  • 使用成熟的外部构建系统将使构建过程完全透明,允许进行强大的自定义。

项目维护者的优势是

  • 新的 API 将更容易维护,并能够适应新的功能和平台。
  • 新的构建系统将更容易维护和扩展。我希望这将导致新的社区驱动构建管道的生态系统。
  • 项目内部更好的职责分离。这将使添加新功能和平台变得更容易。

计划

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

总结

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

v2 的核心已经投入了大量工作,并且非常稳定。现在是时候处理它之上的层,并为开发人员提供更好的体验了。

我希望你和我一样对这件事感到兴奋。我期待着听到你的想法和反馈。

此致

Lea

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

PPS:是的,这是使用 Wails 构建的多窗口应用程序的真实屏幕截图。它不是模型。它是真实的。它很棒。它即将推出。

·阅读时间:8 分钟
Lea Anthony

它来了!

今天标志着 Wails v2 的发布。从第一个 v2 alpha 版本发布到现在已经过去了大约 18 个月,从第一个 beta 版本发布到现在也已经过去了一年。我衷心感谢所有参与该项目发展的人。

之所以花这么长时间,部分原因是为了在正式将其称为 v2 之前,先达到某种完整性的定义。事实是,发布的最佳时机永远不存在——总会有未解决的问题或“再多一个”要塞入的功能。然而,标记一个不完美的重大版本确实能为项目的使用者提供一些稳定性,同时也能为开发人员提供一些重置机会。

这次发布超出了我的预期。我希望它能给你带来与我们开发它时一样的快乐。

什么是 Wails?

如果你不熟悉 Wails,它是一个项目,可以让 Go 程序员使用熟悉的 Web 技术为他们的 Go 程序提供丰富的前端。它是 Electron 的轻量级 Go 替代方案。更多信息可以在 官方网站 上找到。

有什么新功能?

v2 版本是该项目的一大进步,解决了 v1 中的许多痛点。如果你还没有阅读关于 macOSWindowsLinux 的 Beta 版本的任何博文,那么我建议你阅读一下,因为它更详细地介绍了所有重大变化。概括起来

  • 用于 Windows 的 Webview2 组件,支持现代 Web 标准和调试功能。
  • 深色/浅色主题 + 自定义主题(Windows)。
  • Windows 现在没有 CGO 要求。
  • 开箱即用地支持 Svelte、Vue、React、Preact、Lit 和 Vanilla 项目模板。
  • Vite 集成,为你的应用程序提供热重载开发环境。
  • 原生应用程序 菜单对话框
  • 用于 WindowsmacOS 的原生窗口半透明效果。支持 Mica 和 Acrylic 背景。
  • 轻松为 Windows 部署生成 NSIS 安装程序
  • 一个丰富的 运行时库,提供用于窗口操作、事件、对话框、菜单和日志记录的实用方法。
  • 支持使用 garble 对你的应用程序进行 混淆
  • 支持使用 UPX 压缩你的应用程序。
  • Go 结构体的自动 TypeScript 生成。更多信息 在这里
  • 你的应用程序无需任何额外的库或 DLL 文件即可运行。适用于任何平台。
  • 无需捆绑前端资源。像任何其他 Web 应用程序一样开发你的应用程序。

致谢

发布 v2 是一项巨大的工作。从最初的 alpha 版本到今天的发布,共有 89 位贡献者进行了大约 2.2K 次提交,还有很多其他贡献者提供了翻译、测试、反馈以及在讨论论坛和问题跟踪器上的帮助。我非常感谢你们每个人。我还想特别感谢所有为该项目提供指导、建议和反馈的赞助商。你们所做的一切都非常感谢。

我想要特别提到一些人

首先,衷心感谢 @stffabi,他提供了很多贡献,我们所有人都从中受益,并且还为许多问题提供了大量支持。他提供了一些关键功能,例如外部开发服务器支持,该功能通过允许我们接入 Vite 的强大功能,改变了我们的开发模式。可以公平地说,如果没有他的 巨大贡献,Wails v2 将不会那么令人兴奋。非常感谢你,@stffabi!

我还想向 @misitebao 表示衷心的感谢,他一直在不知疲倦地维护网站,并提供中文翻译、管理 Crowdin 以及帮助新翻译者快速上手。这是一项非常重要的工作,我对为此付出的所有时间和精力表示极大的感谢!你真棒!

最后但并非最不重要的是,衷心感谢 Mat Ryer 在 v2 的开发过程中提供的建议和支持。使用 v2 的早期 Alpha 版本一起编写 xBar 有助于确定 v2 的方向,并让我了解早期版本中的一些设计缺陷。我很高兴地宣布,从今天起,我们将开始将 xBar 移植到 Wails v2,它将成为该项目的旗舰应用程序。祝你好运,Mat!

经验教训

在开发 v2 的过程中,我们学到了很多经验教训,这些教训将指导未来的发展。

更小、更快、更集中的发布

在开发 v2 的过程中,有许多功能和错误修复是在临时基础上开发的。这导致了更长的发布周期,也更难调试。展望未来,我们将更频繁地发布版本,这些版本将包含更少的功能。发布将包括文档更新以及彻底的测试。希望这些更小、更快、更集中的发布将导致更少的回归和更好的质量文档。

鼓励参与

在启动这个项目时,我希望能立即帮助所有遇到问题的人。问题是“个人”的,我希望尽快解决它们。这是不可持续的,最终会损害该项目的长期发展。展望未来,我将为人们更多地参与解答问题和分类问题提供更多空间。最好能得到一些工具来帮助解决这个问题,所以如果你有任何建议,请加入讨论 这里

学会说“不”

参与开源项目的人越多,对额外功能的请求就越多,这些功能可能对大多数人有用,也可能没有用。这些功能的初始开发和调试将需要一定的时间,从那时起就会产生持续的维护成本。我本人在这方面最内疚,经常想要“煮沸海洋”,而不是提供最小的可行功能。展望未来,我们需要更多地说“不”来添加核心功能,并将精力集中在赋予开发人员自行提供这些功能的方式上。我们正在认真考虑插件,以应对这种情况。这将允许任何人在他们认为合适的情况下扩展该项目,以及提供一个简单的方式来为该项目做出贡献。

展望未来

在接下来的主要开发周期中,我们已经有很多核心功能要添加到 Wails 中。该 路线图 充满了有趣的想法,我迫不及待地想开始着手进行。其中一个重要的要求是多窗口支持。这是一个棘手的问题,要做到这一点,我们需要考虑提供一个替代的 API,因为当前的 API 不是为此而设计的。根据一些初步的想法和反馈,我认为你会喜欢我们想要的发展方向。

我个人非常兴奋地期待着让 Wails 应用程序在移动设备上运行。我们已经有一个演示项目,表明在 Android 上运行 Wails 应用程序是可能的,所以我很想探索一下我们能走多远!

我最后想提的一点是功能奇偶性。长期以来,我们一直秉持着一个核心原则,即在我们没有为所有平台提供完全跨平台支持的情况下,不会向该项目添加任何功能。虽然到目前为止,这已被证明是(主要)可行的,但这确实阻碍了该项目发布新功能。展望未来,我们将采用一种略微不同的方法:任何无法立即为所有平台发布的新功能都将在实验性配置或 API 下发布。这允许某些平台上的早期使用者尝试该功能并提供反馈,这些反馈将纳入该功能的最终设计中。当然,这意味着在该功能得到所有可以支持它的平台的完全支持之前,API 稳定性无法得到保证,但至少它将解除开发的阻碍。

最后的话

我为我们在 V2 版本中取得的成就感到非常自豪。看到人们已经能够使用到目前为止的 beta 版本构建的东西,真是太神奇了。像 VarlySurgeOctober 这样的高质量应用程序。我鼓励你查看它们。

这次发布得益于许多贡献者的辛勤工作。虽然它是免费下载和使用,但它并不是免费的。不要搞错,这个项目已经花费了相当大的成本。这不仅是我的时间和每个贡献者的时间,还包括这些人离开朋友和家人所花费的成本。因此,我对为实现这个项目而奉献的每一秒都心存感激。参与的贡献者越多,这项工作就能越分散,我们就能一起取得更多成就。我鼓励你们每个人选择一件你能做出的贡献,无论是确认某人的错误,建议修复方案,更改文档,还是帮助那些需要帮助的人。所有这些微不足道的事情都具有巨大的影响!如果你也参与了实现 v3 的故事中,那就太棒了。

享受吧!

Lea

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

·阅读时间:5 分钟
Lea Anthony

我很高兴地宣布,Wails v2 现在针对 Linux 发布了 beta 版本!具有讽刺意味的是,v2 最初的实验是在 Linux 上进行的,但最终成为了最后一个发布版本。话虽如此,我们今天拥有的 v2 与那些最初的实验相比,已经截然不同。因此,事不宜迟,让我们来看看新功能

新功能


很多用户都要求原生菜单支持。Wails 终于满足了你的需求。应用程序菜单现已推出,并支持大多数原生菜单功能。这包括标准菜单项、复选框、单选按钮组、子菜单和分隔符。

在 v1 中,我们收到了大量关于对窗口本身进行更多控制的要求。我很高兴地宣布,为此我们提供了新的运行时 API。它功能丰富,支持多显示器配置。对话框 API 也得到了改进:现在,您可以拥有现代、原生的对话框,并提供丰富的配置以满足您所有的对话框需求。

无需捆绑资产

v1 的一个重大痛点是需要将整个应用程序压缩成单个 JS 和 CSS 文件。我很高兴地宣布,在 v2 中,无论如何,无论如何,都不需要捆绑资产。想加载本地图片?使用带有本地 src 路径的 <img> 标签。想使用炫酷的字体?复制并将其路径添加到你的 CSS 中。

哇,这听起来像一个 Web 服务器...

是的,它的工作原理就像一个 Web 服务器,但它不是。

那么我该如何包含我的资产呢?

您只需将包含所有资产的单个 embed.FS 传递到应用程序配置中。它们甚至不需要位于顶级目录中 - Wails 会为您解决所有问题。

新的开发体验

现在资产不需要捆绑,这使得开发体验焕然一新。新的 wails dev 命令将构建并运行您的应用程序,但它不会使用 embed.FS 中的资产,而是直接从磁盘加载它们。

它还提供以下附加功能

  • 热重载 - 对前端资产的任何更改都会触发应用程序前端的自动重新加载
  • 自动重建 - 对 Go 代码的任何更改都会重建并重新启动您的应用程序

除此之外,一个 Web 服务器将在端口 34115 上启动。这将为连接到它的任何浏览器提供您的应用程序。所有连接的 Web 浏览器都将响应系统事件,例如资产更改时的热重载。

在 Go 中,我们习惯于在应用程序中处理结构体。将结构体发送到前端并在应用程序中将其用作状态通常很有用。在 v1 中,这是一个非常手动化的过程,给开发人员带来了不少负担。我很高兴地宣布,在 v2 中,在开发模式下运行的任何应用程序都会自动为所有作为绑定方法的输入或输出参数的结构体生成 TypeScript 模型。这使得在两个世界之间无缝交换数据模型成为可能。

除此之外,另一个 JS 模块是动态生成的,它包装了所有绑定的方法。这为您的方法提供了 JSDoc,在您的 IDE 中提供代码完成和提示。当您在包装 Go 代码的自动生成模块中按下 Tab 键时,自动导入数据模型真的太棒了!

远程模板


让应用程序快速启动并运行一直是 Wails 项目的关键目标。当我们推出时,我们尝试涵盖当时很多现代框架:react、vue 和 angular。前端开发的世界非常有意见,发展迅速,很难跟上!结果,我们发现我们的基本模板很快就过时了,这造成了维护上的麻烦。这也意味着我们没有针对最新、最优秀的技术栈提供酷炫的现代模板。

对于 v2,我希望通过赋予您创建和托管自己的模板的能力来赋能社区,而不是依赖 Wails 项目。因此,现在您可以使用社区支持的模板创建项目!我希望这将激励开发人员创建一个充满活力的项目模板生态系统。我对我们开发人员社区能够创造什么感到非常兴奋!

交叉编译到 Windows

因为 Wails v2 for Windows 纯粹是 Go 语言编写的,所以您可以针对 Windows 构建而无需 docker。


总结

正如我在 Windows 版本说明中提到的,Wails v2 代表了该项目的新基础。此版本的目的是获得有关新方法的反馈,并在全面发布之前解决任何错误。您的意见将不胜感激!请将任何反馈意见发送到 v2 Beta 讨论区。

Linux 很难 支持。我们预计测试版会存在一些问题。请通过提交详细的错误报告来帮助我们帮助您!

最后,我要特别感谢所有项目赞助商,他们的支持在幕后以多种方式推动着项目的进展。

我期待看到人们在项目的下一个激动人心的阶段使用 Wails 构建什么!

Lea。

PS:v2 版本即将发布!

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

·6 分钟阅读
Lea Anthony

今天标志着 Wails v2 for Mac 的第一个测试版发布!我们花了很长时间才走到这一步,我希望今天的发布能带给您一些相当有用的东西。为了走到这一步,我们经历了一些曲折,我希望在您的帮助下,我们能解决这些问题,并为最终的 v2 版本发布做好准备。

您是说这还没有准备好用于生产?对于您的用例,它可能已经准备好,但仍然存在一些已知问题,请留意这个项目看板,如果您愿意贡献,我们将非常欢迎!

那么,Wails v2 for Mac 与 v1 相比有什么新功能?提示:它与 Windows Beta 非常相似 😉

新功能


很多用户都要求原生菜单支持。Wails 终于满足了你的需求。应用程序菜单现已推出,并支持大多数原生菜单功能。这包括标准菜单项、复选框、单选按钮组、子菜单和分隔符。

在 v1 中,我们收到了大量关于对窗口本身进行更多控制的要求。我很高兴地宣布,为此我们提供了新的运行时 API。它功能丰富,支持多显示器配置。对话框 API 也得到了改进:现在,您可以拥有现代、原生的对话框,并提供丰富的配置以满足您所有的对话框需求。

Mac 特定选项

除了常规应用程序选项之外,Wails v2 for Mac 还带来了一些 Mac 附加功能

  • 让您的窗口变得时髦,并具有半透明效果,就像所有漂亮的 swift 应用程序一样!
  • 高度可自定义的标题栏
  • 我们支持应用程序的 NSAppearance 选项
  • 简单的配置可自动创建“关于”菜单

无需捆绑资产

v1 的一个重大痛点是需要将整个应用程序压缩成单个 JS 和 CSS 文件。我很高兴地宣布,在 v2 中,无论如何,无论如何,都不需要捆绑资产。想加载本地图片?使用带有本地 src 路径的 <img> 标签。想使用炫酷的字体?复制并将其路径添加到你的 CSS 中。

哇,这听起来像一个 Web 服务器...

是的,它的工作原理就像一个 Web 服务器,但它不是。

那么我该如何包含我的资产呢?

您只需将包含所有资产的单个 embed.FS 传递到应用程序配置中。它们甚至不需要位于顶级目录中 - Wails 会为您解决所有问题。

新的开发体验

现在资产不需要捆绑,这使得开发体验焕然一新。新的 wails dev 命令将构建并运行您的应用程序,但它不会使用 embed.FS 中的资产,而是直接从磁盘加载它们。

它还提供以下附加功能

  • 热重载 - 对前端资产的任何更改都会触发应用程序前端的自动重新加载
  • 自动重建 - 对 Go 代码的任何更改都会重建并重新启动您的应用程序

除此之外,一个 Web 服务器将在端口 34115 上启动。这将为连接到它的任何浏览器提供您的应用程序。所有连接的 Web 浏览器都将响应系统事件,例如资产更改时的热重载。

在 Go 中,我们习惯于在应用程序中处理结构体。将结构体发送到前端并在应用程序中将其用作状态通常很有用。在 v1 中,这是一个非常手动化的过程,给开发人员带来了不少负担。我很高兴地宣布,在 v2 中,在开发模式下运行的任何应用程序都会自动为所有作为绑定方法的输入或输出参数的结构体生成 TypeScript 模型。这使得在两个世界之间无缝交换数据模型成为可能。

除此之外,另一个 JS 模块是动态生成的,它包装了所有绑定的方法。这为您的方法提供了 JSDoc,在您的 IDE 中提供代码完成和提示。当您在包装 Go 代码的自动生成模块中按下 Tab 键时,自动导入数据模型真的太棒了!

远程模板


让应用程序快速启动并运行一直是 Wails 项目的关键目标。当我们推出时,我们尝试涵盖当时很多现代框架:react、vue 和 angular。前端开发的世界非常有意见,发展迅速,很难跟上!结果,我们发现我们的基本模板很快就过时了,这造成了维护上的麻烦。这也意味着我们没有针对最新、最优秀的技术栈提供酷炫的现代模板。

对于 v2,我希望通过赋予您创建和托管自己的模板的能力来赋能社区,而不是依赖 Wails 项目。因此,现在您可以使用社区支持的模板创建项目!我希望这将激励开发人员创建一个充满活力的项目模板生态系统。我对我们开发人员社区能够创造什么感到非常兴奋!

原生 M1 支持

感谢Mat Ryer 的大力支持,Wails 项目现在支持 M1 原生构建


您也可以指定 darwin/amd64 作为目标


哦,我差点忘了....您还可以使用 darwin/universal.... 😉


交叉编译到 Windows

因为 Wails v2 for Windows 纯粹是 Go 语言编写的,所以您可以针对 Windows 构建而无需 docker。


WKWebView 渲染器

V1 依赖于一个(现在已弃用)的 WebView 组件。V2 使用最新的 WKWebKit 组件,因此您可以期待来自 Apple 的最新和最强大的功能。

总结

正如我在 Windows 版本说明中提到的,Wails v2 代表了该项目的新基础。此版本的目的是获得有关新方法的反馈,并在全面发布之前解决任何错误。您的意见将不胜感激!请将任何反馈意见发送到 v2 Beta 讨论区。

最后,我要特别感谢所有项目赞助商,包括JetBrains,他们的支持在幕后以多种方式推动着项目的进展。

我期待看到人们在项目的下一个激动人心的阶段使用 Wails 构建什么!

Lea。

PS:Linux 用户,你们是下一个!

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

·阅读时间 9 分钟
Lea Anthony

两年前,我第一次在 Reddit 上宣布了 Wails,当时我正乘坐从悉尼出发的火车,我没有想到它会引起太多关注。几天后,一位多产的技术博主发布了一段教程视频,并给予了积极评价,从那时起,人们对该项目的兴趣激增。

很明显,人们对在 Go 项目中添加 Web 前端感到兴奋,并且几乎立即将该项目推向了超越我创建的概念验证阶段。当时,Wails 使用webview 项目来处理前端,而 Windows 的唯一选择是 IE11 渲染器。许多错误报告都源于这种限制:糟糕的 JavaScript/CSS 支持,没有开发工具进行调试。这是一种令人沮丧的开发体验,但几乎无法对其进行纠正。

长期以来,我一直坚信微软最终必须解决其浏览器问题。世界正在前进,前端开发正在蓬勃发展,而 IE 已经跟不上。当微软宣布将使用 Chromium 作为其新浏览器方向的基础时,我知道这只是时间问题,Wails 可以使用它并将 Windows 开发人员体验提升到一个新的水平。

今天,我很高兴地宣布:Wails v2 Beta for Windows!此版本中有很多内容需要展开,所以请准备好饮料,找个座位,我们开始吧...

没有 CGO 依赖!

不,我不是在开玩笑:没有 CGO 依赖 🤯!Windows 的问题在于,与 MacOS 和 Linux 不同,它没有默认的编译器。此外,CGO 需要一个 mingw 编译器,并且存在许多不同的安装选项。删除 CGO 要求极大地简化了设置,并使调试变得容易得多。虽然我在让它工作方面付出了不少努力,但大部分功劳应该归功于John Chadwick,他不仅启动了几个项目来实现这一目标,而且还乐于让别人接手这些项目并在此基础上进行构建。同时也要感谢Tad Vizbaras,他的winc 项目让我踏上了这条道路。

WebView2 Chromium 渲染器


最后,Windows 开发人员可以为其应用程序获得一流的渲染引擎!IE11 渲染器的时代已经过去了,您不再需要扭曲您的前端代码才能在 Windows 上工作。除此之外,您还可以获得一流的开发人员工具体验!

然而,WebView2 组件确实需要将 WebView2Loader.dll 放在二进制文件旁边。这使得分发比我们 gophers 习惯的稍微痛苦一些。我知道所有使用 WebView2 的解决方案和库都有这种依赖关系。

但是,我很高兴地宣布,Wails 应用程序没有这种要求!感谢John Chadwick 的奇思妙想,我们能够将此 dll 捆绑到二进制文件中,并让 Windows 加载它,就好像它存在于磁盘上一样。

Gophers 欢呼吧!单二进制梦想依然存在!

新功能


很多用户都要求原生菜单支持。Wails 终于满足了你的需求。应用程序菜单现已推出,并支持大多数原生菜单功能。这包括标准菜单项、复选框、单选按钮组、子菜单和分隔符。

在 v1 中,我们收到了大量关于对窗口本身进行更多控制的要求。我很高兴地宣布,为此我们提供了新的运行时 API。它功能丰富,支持多显示器配置。对话框 API 也得到了改进:现在,您可以拥有现代、原生的对话框,并提供丰富的配置以满足您所有的对话框需求。

现在可以选择在项目中生成 IDE 配置。这意味着如果您在受支持的 IDE 中打开项目,它将已经被配置为构建和调试您的应用程序。目前支持 VSCode,但我们希望很快支持其他 IDE,例如 Goland。


无需捆绑资产

v1 的一个重大痛点是需要将整个应用程序压缩成单个 JS 和 CSS 文件。我很高兴地宣布,在 v2 中,无论如何,无论如何,都不需要捆绑资产。想加载本地图片?使用带有本地 src 路径的 <img> 标签。想使用炫酷的字体?复制并将其路径添加到你的 CSS 中。

哇,这听起来像一个 Web 服务器...

是的,它的工作原理就像一个 Web 服务器,但它不是。

那么我该如何包含我的资产呢?

您只需将包含所有资产的单个 embed.FS 传递到应用程序配置中。它们甚至不需要位于顶级目录中 - Wails 会为您解决所有问题。

新的开发体验


现在资产不需要捆绑,这使得开发体验焕然一新。新的 wails dev 命令将构建并运行您的应用程序,但它不会使用 embed.FS 中的资产,而是直接从磁盘加载它们。

它还提供以下附加功能

  • 热重载 - 对前端资产的任何更改都会触发应用程序前端的自动重新加载
  • 自动重建 - 对 Go 代码的任何更改都会重建并重新启动您的应用程序

除此之外,一个 Web 服务器将在端口 34115 上启动。这将为连接到它的任何浏览器提供您的应用程序。所有连接的 Web 浏览器都将响应系统事件,例如资产更改时的热重载。

在 Go 中,我们习惯于在应用程序中处理结构体。将结构体发送到前端并在应用程序中将其用作状态通常很有用。在 v1 中,这是一个非常手动化的过程,给开发人员带来了不少负担。我很高兴地宣布,在 v2 中,在开发模式下运行的任何应用程序都会自动为所有作为绑定方法的输入或输出参数的结构体生成 TypeScript 模型。这使得在两个世界之间无缝交换数据模型成为可能。

除此之外,另一个 JS 模块是动态生成的,它包装了所有绑定的方法。这为您的方法提供了 JSDoc,在您的 IDE 中提供代码完成和提示。当您在包装 Go 代码的自动生成模块中按下 Tab 键时,自动导入数据模型真的太棒了!

远程模板


让应用程序快速启动并运行一直是 Wails 项目的关键目标。当我们推出时,我们尝试涵盖当时很多现代框架:react、vue 和 angular。前端开发的世界非常有意见,发展迅速,很难跟上!结果,我们发现我们的基本模板很快就过时了,这造成了维护上的麻烦。这也意味着我们没有针对最新、最优秀的技术栈提供酷炫的现代模板。

对于 v2,我希望通过赋予您创建和托管自己的模板的能力来赋能社区,而不是依赖 Wails 项目。因此,现在您可以使用社区支持的模板创建项目!我希望这将激励开发人员创建一个充满活力的项目模板生态系统。我对我们开发人员社区能够创造什么感到非常兴奋!

总结

Wails v2 代表着项目的新基础。此版本的目的是收集关于新方法的反馈,并在正式发布之前修复任何 bug。您的意见将非常欢迎。请将任何反馈发送至 v2 Beta 讨论区

为了达到这一步,我们经历了许多曲折、转向和 U 型转弯。部分原因是早期的技术决策需要改变,部分原因是我们花费时间构建的解决一些核心问题的变通方案,最终在 upstream 被修复了:Go 的嵌入功能就是一个很好的例子。幸运的是,所有事情都在适当的时间汇聚到了一起,今天我们有了最好的解决方案。我相信等待是值得的——即使在两个月前,这也将是不可能的。

我还要对以下人员表示衷心的感谢 🙏,因为没有他们,这个版本根本不可能存在。

  • Misite Bao - 在中文翻译方面绝对是主力,同时也是一个不可思议的 bug 发现者。
  • John Chadwick - 他在 go-webview2go-winloader 上的出色工作使得我们今天拥有的 Windows 版本成为可能。
  • Tad Vizbaras - 他对 winc 项目的实验是通往纯 Go Wails 的第一步。
  • Mat Ryer - 他的支持、鼓励和反馈真正帮助推动了项目的发展。

最后,我要特别感谢所有项目赞助商,包括JetBrains,他们的支持在幕后以多种方式推动着项目的进展。

我期待看到人们在项目的下一个激动人心的阶段使用 Wails 构建什么!

Lea。

PS:MacOS 和 Linux 用户无需感到被冷落 - 移植到这个新基础的工作正在积极进行中,大部分艰苦的工作已经完成。坚持住!

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