跳至主要内容

5 个带有 "wails" 标签的文章

查看所有标签

·阅读时长 9 分钟
Lea Anthony

介绍

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

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

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

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

这篇文章旨在探讨该项目目前的现状以及我们如何改进它。

我们现在处于什么阶段?

自从 v2 版本发布以来,看到 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 调用。当前执行此操作的方法有点像黑客。它涉及使用特殊标志构建应用程序,然后运行生成的二进制文件,该二进制文件使用反射来确定哪些内容已绑定。这导致了一种鸡和蛋的困境:如果没有绑定,就无法构建应用程序;如果没有构建应用程序,就无法生成绑定。有很多方法可以解决这个问题,但最好的方法是根本不使用这种方法。

已经有一些尝试为 Wails 项目编写静态分析器,但它们没有进展太远。在最近的几年里,随着有关此主题的更多材料出现,这变得稍微容易了一些。

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

构建系统

与 API 的声明式方法一样,构建系统是为了隐藏构建桌面应用程序的复杂性而创建的。当您运行 wails build 时,它在后台做了很多事情

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

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

为了解决 v3 中的这个问题,我想将构建系统迁移到 Wails 之外的系统。在使用 Task 一段时间后,我非常喜欢它。它是一个用于配置构建系统的绝佳工具,对于任何使用过 Makefile 的人都应该比较熟悉。

构建系统将使用 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 背景。
  • 轻松生成NSIS 安装程序,用于 Windows 部署。
  • 丰富的运行时库,提供用于窗口操作、事件、对话框、菜单和日志记录的实用程序方法。
  • 支持使用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 版本的测试版!很有意思的是,v2 的最初实验是在 Linux 上进行的,但它最终成为最后一个发布版本。话虽如此,我们今天所拥有的 v2 与那些最初的实验相比已经大不相同了。所以,事不宜迟,让我们来看看新功能吧。

新功能


很多人要求原生菜单支持。Wails 终于满足了您的需求。应用程序菜单现在可以使用了,并且支持大多数原生菜单功能。这包括标准菜单项、复选框、单选组、子菜单和分隔符。

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

无需捆绑资产

v1 的一个巨大痛点是需要将您的整个应用程序压缩成单个 JS 和 CSS 文件。我很高兴地宣布,在 v2 中,无论以何种方式、形状或形式,都无需捆绑资产。想要加载本地图像?使用带有本地 src 路径的<img> 标签。想要使用酷炫的字体?将它复制进来,并在 CSS 中添加它的路径。

哇,听起来像个 web 服务器...

是的,它就像一个 web 服务器一样工作,只是它不是 web 服务器。

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

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

新的开发体验

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

它还提供了以下附加功能:

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

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

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

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

远程模板


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

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

交叉编译到 Windows

由于 Wails v2 for Windows 是纯 Go 的,因此您可以在没有 docker 的情况下针对 Windows 构建进行编译。


总结

正如我在 Windows 版本说明中所说,Wails v2 代表了该项目的一个新基础。此版本的目的是获得对新方法的反馈,并在正式发布之前消除任何错误。您的输入将非常受欢迎!请将任何反馈意见发送到 v2 测试版 讨论板。

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

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

期待看到人们在这个激动人心的项目新阶段中使用 Wails 构建了什么!

Lea。

PS:v2 版本即将发布!

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

·阅读时间:6 分钟
Lea Anthony

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

你是说这还没有准备好用于生产环境?对于您的用例,它可能已经准备好了,但仍然存在一些已知问题,因此请密切关注 这个项目看板,如果您想贡献,我们将非常欢迎!

那么,与 v1 相比,Wails v2 for Mac 的新功能是什么?提示:它与 Windows 测试版非常相似 😉

新功能


很多人要求原生菜单支持。Wails 终于满足了您的需求。应用程序菜单现在可以使用了,并且支持大多数原生菜单功能。这包括标准菜单项、复选框、单选组、子菜单和分隔符。

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

Mac 特定选项

除了常见的应用程序选项之外,Wails v2 for Mac 还带来了一些 Mac 独有的功能。

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

无需捆绑资产

v1 的一个巨大痛点是需要将您的整个应用程序压缩成单个 JS 和 CSS 文件。我很高兴地宣布,在 v2 中,无论以何种方式、形状或形式,都无需捆绑资产。想要加载本地图像?使用带有本地 src 路径的<img> 标签。想要使用酷炫的字体?将它复制进来,并在 CSS 中添加它的路径。

哇,听起来像个 web 服务器...

是的,它就像一个 web 服务器一样工作,只是它不是 web 服务器。

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

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

新的开发体验

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

它还提供了以下附加功能:

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

除此之外,还会在端口 34115 上启动一个 web 服务器。它将为连接到它的任何浏览器提供您的应用程序。所有连接的 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 的,因此您可以在没有 docker 的情况下针对 Windows 构建进行编译。


WKWebView 渲染器

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

总结

正如我在 Windows 版本说明中所说,Wails v2 代表了该项目的一个新基础。此版本的目的是获得对新方法的反馈,并在正式发布之前消除任何错误。您的输入将非常受欢迎!请将任何反馈意见发送到 v2 测试版 讨论板。

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

期待看到人们在这个激动人心的项目新阶段中使用 Wails 构建了什么!

Lea。

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

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

·阅读时长 9 分钟
Lea Anthony

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

很明显,人们对在 Go 项目中添加 web 前端很感兴趣,并且几乎立即将该项目推向了我的概念验证阶段。当时,Wails 使用 webview 项目来处理前端,而 Windows 唯一的选项是 IE11 渲染器。许多错误报告都源于此限制:JavaScript/CSS 支持很差,并且没有调试工具。这是一种令人沮丧的开发体验,但并没有什么办法可以解决它。

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

今天,我很高兴地宣布:Wails v2 for Windows 测试版!此版本中有很多内容需要讲解,所以,准备好饮料,坐下来,我们开始吧……

没有 CGO 依赖项!

不,我不是在开玩笑:没有 CGO 依赖项 🤯!Windows 的问题在于,与 MacOS 和 Linux 不同,它没有默认的编译器。此外,CGO 需要 mingw 编译器,并且有很多不同的安装选项。删除 CGO 依赖项极大地简化了设置,同时也使调试变得容易得多。虽然我为使它正常工作付出了很多努力,但大部分功劳应该归功于 John Chadwick,他不仅开始了一些项目来实现这一点,而且还愿意让其他人利用这些项目并在此基础上进行构建。同样要感谢 Tad Vizbaras,他的 winc 项目让我走上了这条道路。

WebView2 Chromium 渲染器


终于,Windows 开发者可以为他们的应用程序获得一流的渲染引擎了!那些为使前端代码在 Windows 上正常工作而绞尽脑汁的日子已经一去不复返了。最重要的是,您还可以获得一流的开发者工具体验!

然而,WebView2 组件需要将WebView2Loader.dll 放在二进制文件旁边。这使得分发比我们这些 Gopher 习惯的要稍微痛苦一些。所有使用 WebView2 的解决方案和库(据我所知)都有此依赖项。

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

Gopher 们欢呼吧!单二进制文件梦想继续存在!

新功能


很多人要求原生菜单支持。Wails 终于满足了您的需求。应用程序菜单现在可以使用了,并且支持大多数原生菜单功能。这包括标准菜单项、复选框、单选组、子菜单和分隔符。

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

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


无需捆绑资产

v1 的一个巨大痛点是需要将您的整个应用程序压缩成单个 JS 和 CSS 文件。我很高兴地宣布,在 v2 中,无论以何种方式、形状或形式,都无需捆绑资产。想要加载本地图像?使用带有本地 src 路径的<img> 标签。想要使用酷炫的字体?将它复制进来,并在 CSS 中添加它的路径。

哇,听起来像个 web 服务器...

是的,它就像一个 web 服务器一样工作,只是它不是 web 服务器。

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

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

新的开发体验


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

它还提供了以下附加功能:

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

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

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

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

远程模板


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

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

总结

Wails v2 代表了该项目的全新基础。此版本的目的是收集对新方法的反馈,并在正式发布之前消除任何错误。您的意见将受到高度重视。请将任何反馈发送到 v2 Beta 讨论区。

一路走来,我们经历了许多曲折、转折和 U 形转弯。这部分是由于早期的技术决策需要改变,部分是因为我们花费时间构建的某些核心问题的解决方法已在上游得到修复:Go 的嵌入功能就是一个很好的例子。幸运的是,所有事情都在适当的时候汇聚在一起,今天我们拥有了最好的解决方案。我相信等待是值得的——这甚至在两个月前都是不可能实现的。

我还要对以下人士表示衷心的感谢 🙏,因为没有他们,这个版本就不会存在

  • Misite Bao - 在中文翻译方面是一位绝对的劳模,也是一位令人难以置信的错误发现者。
  • John Chadwick - 他在 go-webview2go-winloader 上的出色工作使得我们今天拥有的 Windows 版本成为可能。
  • Tad Vizbaras - 他对 winc 项目的实验是迈向纯 Go Wails 的第一步。
  • Mat Ryer - 他的支持、鼓励和反馈真正推动了该项目的发展。

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

期待看到人们在这个激动人心的项目新阶段中使用 Wails 构建了什么!

Lea。

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

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