参与贡献

编辑此文档

翻译文档,或在您的计算机上打开完整项目。

在您选择提交工作成果之前,不会发布任何内容。

博客

Wails v2 Windows 测试版

Wails 的发行说明和公告

leaanthony阅读时长 2 分钟

Wails 截图

就在 2 年多前,我在悉尼的一列火车上首次于 Reddit 宣布 Wails 时,并没想到它会受到太多关注。几天后,一位高产的科技视频博主发布了一段教程视频,给予了积极评价;从那时起,人们对该项目的兴趣便急剧上升。

很明显,人们对于为 Go 项目添加 Web 前端感到兴奋,并且几乎立刻就将这个项目推进到了我所创建的概念验证之外。当时,Wails 使用 webview 项目处理前端,而 Windows 上唯一的选择是 IE11 渲染器。许多错误报告都源于这一限制:JavaScript/CSS 支持不佳,也没有可用于调试的开发者工具。这种开发体验令人沮丧,但当时几乎没有什么办法可以解决。

很长一段时间以来,我一直坚信 Microsoft 最终不得不解决其浏览器问题。世界在不断前进,前端开发蓬勃发展,而 IE 已经无法满足需要。当 Microsoft 宣布转而采用 Chromium 作为其新浏览器发展方向的基础时,我知道 Wails 用上它只是时间问题,届时 Windows 上的开发体验也将提升到一个新水平。

今天,我很高兴地宣布:Wails v2 Windows 测试版!此版本包含大量值得详细介绍的内容,所以拿杯饮料坐下来,我们开始吧……

不再依赖 CGO!

没错,我不是在开玩笑:不再依赖 CGO 🤯!Windows 的问题在于,它与 MacOS 和 Linux 不同,并未自带默认编译器。此外,CGO 需要 mingw 编译器,而安装方式又多种多样。移除 CGO 要求极大地简化了设置,也让调试容易了许多。尽管我为实现这一点投入了不少精力,但大部分功劳应归于 John Chadwick:他不仅发起了几个项目,使之成为可能,还愿意让别人接手这些项目并在此基础上继续开发。也要感谢 Tad Vizbaras,正是他的 winc 项目引领我走上了这条路。

WebView2 Chromium 渲染器

开发者工具截图

Windows 开发者终于能为自己的应用程序使用一流的渲染引擎了!为了让前端代码能在 Windows 上运行而费尽周折的日子已经一去不复返。此外,你还能获得一流的开发者工具体验!

不过,WebView2 组件确实要求将 WebView2Loader.dll 放在二进制文件旁边。这让分发过程比我们 Go 开发者所习惯的稍微麻烦一些。据我所知,所有使用 WebView2 的解决方案和库都有这项依赖。

不过,我非常兴奋地宣布,Wails 应用程序没有这项要求!多亏了 John Chadwick 的高超技艺,我们可以将这个 dll 打包进二进制文件,并让 Windows 像它实际存在于磁盘上一样加载它。

Go 开发者们,欢呼吧!单一二进制文件的梦想依然延续!

新功能

Wails 菜单截图

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

v1 中有大量请求,希望能够更精细地控制窗口本身。我很高兴地宣布,现在已有专门用于此目的的新运行时 API。它功能丰富,并支持多显示器配置。对话框 API 也得到了改进:现在,你可以使用配置丰富的现代原生对话框,满足各种对话框需求。

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

VSCode 截图

无需捆绑资源

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讨论区。

走到这一步,过程经历了许多波折、方向调整,甚至推倒重来。一部分原因是早期的一些技术决策需要更改;另一部分原因是,我们曾花时间构建变通方案来应对的某些核心问题,后来在上游得到了解决,Go 的 embed 功能就是一个很好的例子。幸运的是,一切都在恰当的时机水到渠成,如今我们已经拥有了现阶段所能实现的最佳解决方案。我相信这段等待是值得的——即使在2个月前,这一切也不可能实现。

我还要向以下各位致以衷心的感谢 :pray:,因为没有他们,这个版本根本不会问世:

  • Misite Bao——不辞辛劳地完成了大量中文翻译工作,同时也是一位极其出色的错误发现者。
  • John Chadwick——他在go-webview2和go-winloader上的杰出工作,让我们今天所拥有的 Windows 版本成为可能。
  • Tad Vizbaras——对他的winc项目进行试验,是 Wails 迈向纯 Go 实现道路上的第一步。
  • Mat Ryer——他的支持、鼓励和反馈极大地推动了项目发展。

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

我期待看到大家在 Wails 项目这个激动人心的新阶段中构建出怎样的作品!

Lea。

附言:MacOS 和 Linux 用户不必觉得自己被冷落了——迁移到这一新基础的工作正在积极推进,而且大部分艰巨工作已经完成。请再耐心等待!

再附言:如果你或你的公司觉得 Wails 很有用,请考虑赞助本项目。谢谢!