# v3有哪些新功能? !!! note v3版本中将包含的功能可能会有所更改。 ## 多窗口 现在可以创建多个窗口,并对每个窗口进行独立配置。 ```go package main import ( _ "embed" "log" "github.com/wailsapp/wails/v3/pkg/application" ) //go:embed assets/* var assets embed.FS func main() { app := application.New(application.Options{ Name: "多窗口演示", Assets: application.AssetOptions{ FS: assets, }, }) window1 := app.NewWebviewWindowWithOptions(application.WebviewWindowOptions{ Title: "窗口1", }) window2 := app.NewWebviewWindowWithOptions(application.WebviewWindowOptions{ Title: "窗口2", }) // 从embed.FS加载嵌入的html window1.SetURL("/") window1.Center() // 加载外部URL window2.SetURL("https://wails.app") err := app.Run() if err != nil { log.Fatal(err.Error()) } } ``` ## 系统托盘 系统托盘允许您在桌面的系统托盘区域添加一个图标,并具有以下功能: - 附加窗口(窗口将居中于系统托盘图标) - 完整的菜单支持 - 亮/暗模式图标 ```go package main import ( _ "embed" "log" "runtime" "github.com/wailsapp/wails/v3/pkg/application" "github.com/wailsapp/wails/v3/pkg/icons" ) func main() { app := application.New(application.Options{ Name: "系统托盘演示", Mac: application.MacOptions{ ActivationPolicy: application.ActivationPolicyAccessory, }, }) window := app.NewWebviewWindowWithOptions(application.WebviewWindowOptions{ Width: 500, Height: 800, Frameless: true, AlwaysOnTop: true, Hidden: true, Windows: application.WindowsWindow{ HiddenOnTaskbar: true, }, }) systemTray := app.NewSystemTray() // macOS上的模板图标支持 if runtime.GOOS == "darwin" { systemTray.SetTemplateIcon(icons.SystrayMacTemplate) } else { // 亮/暗模式图标支持 systemTray.SetDarkModeIcon(icons.SystrayDark) systemTray.SetIcon(icons.SystrayLight) } // 菜单支持 myMenu := app.NewMenu() myMenu.Add("Hello World!").OnClick(func(_ *application.Context) { println("Hello World!") }) systemTray.SetMenu(myMenu) // 这将使窗口居中于系统托盘图标,偏移量为5px // 单击系统托盘图标时,它将自动显示 // 当窗口失去焦点时隐藏 systemTray.AttachWindow(window).WindowOffset(5) err := app.Run() if err != nil { log.Fatal(err) } } ``` ## 插件 插件允许您扩展Wails系统的功能。不仅可以在Go中使用插件方法,还可以从Javascript中 调用插件方法。包含的插件有: - kvstore - 键/值存储 - browser - 在浏览器中打开链接 - log - 自定义日志记录器 - oauth - 处理OAuth身份验证并支持60个提供商 - single_instance - 仅允许运行一个应用程序副本 - sqlite - 向应用程序添加SQLite数据库。使用现代纯Go库 - start_at_login - 注册/注销应用程序以在登录时启动 ## 改进的绑定生成 v3使用新的静态分析器生成绑定。这使得生成绑定非常快速,并保留了绑定中的注释和参数 名称。默认情况下,绑定使用ID而不是字符串进行调用。这提供了性能提升,并允许使用混 淆工具,如[garble](https://github.com/burrowers/garble)。 通过在项目目录中运行 `wails3 generate bindings` 来生成绑定。 ```js // @ts-check // Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL // This file is automatically generated. DO NOT EDIT import { main } from "./models"; window.go = window.go || {}; window.go.main = { GreetService: { /** * GreetService.Greet * Greet greets a person * @param name {string} * @returns {Promise} **/ Greet: function (name) { wails.CallByID(1411160069, ...Array.prototype.slice.call(arguments, 0)); }, /** * GreetService.GreetPerson * GreetPerson greets a person * @param person {main.Person} * @returns {Promise} **/ GreetPerson: function (person) { wails.CallByID(4021313248, ...Array.prototype.slice.call(arguments, 0)); }, }, }; ``` ## 改进的构建系统 在v2中,构建系统完全不透明且难以自定义。在v3中,可以使用标准的Go工具构建所有内 容。 v2构建系统完成的所有繁重工作,例如图标生成,已作为CLI中的工具命令添加。我们 将[Taskfile](https://taskfile.dev)整合到CLI中,以协调这些调用,以带来与v2相同的 开发人员体验。然而,这种方法在灵活性和易用性之间达到了最佳平衡,因为现在您可以根 据需要自定义构建过程。 您甚至可以使用make,如果那是您的菜! ```yaml title="来自Taskfile.yml的片段" build:darwin: summary: 构建应用程序 platforms: - darwin cmds: - task: pre-build - task: build-frontend - go build -gcflags=all="-N -l" -o bin/{{.APP_NAME}} - task: post-build env: CGO_CFLAGS: "-mmacosx-version-min=10.13" CGO_LDFLAGS: "-mmacosx-version-min=10.13" MACOSX_DEPLOYMENT_TARGET: "10.13" ``` ## 改进的事件 现在为许多运行时操作发出事件,允许您挂钩应用程序/系统事件。在存在常见平台事件的 地方,还发出了跨平台(通用)事件,允许您在跨平台上编写相同的事件处理方法。 还可以注册事件钩子。这些钩子类似于`On`方法,但是是同步的,并允许您取消事件。例 如,在关闭窗口之前显示确认对话框的示例。 ```go package main import ( _ "embed" "log" "time" "github.com/wailsapp/wails/v3/pkg/application" "github.com/wailsapp/wails/v3/pkg/events" ) //go:embed assets var assets embed.FS func main() { app := application.New(application.Options{ Name: "Events Demo", Description: "Events API演示", Assets: application.AssetOptions{ FS: assets, }, Mac: application.MacOptions{ ApplicationShouldTerminateAfterLastWindowClosed: true, }, }) // 自定义事件处理 app.Events.On("myevent", func(e *application.WailsEvent) { log.Printf("[Go] 收到WailsEvent事件: %+v\n", e) }) // 特定于操作系统的应用程序事件 app.On(events.Mac.ApplicationDidFinishLaunching, func(event *application.Event) { println("events.Mac.ApplicationDidFinishLaunching触发!") }) // 平台无关事件 app.On(events.Common.ApplicationStarted, func(event *application.Event) { println("events.Common.ApplicationStarted触发!") }) win1 := app.NewWebviewWindowWithOptions(application.WebviewWindowOptions{ Title: "关闭我需要3次确认!", }) var countdown = 3 // 注册钩子以取消窗口关闭 win1.RegisterHook(events.Common.WindowClosing, func(e *application.WindowEvent) { countdown-- if countdown == 0 { println("关闭!") return } println("不行!不关闭!") e.Cancel() }) win1.On(events.Common.WindowFocus, func(e *application.WindowEvent) { println("[事件] 窗口焦点!") }) err := app.Run() if err != nil { log.Fatal(err.Error()) } } ``` ## Wails标记语言(wml) 一种实验性的功能,使用纯HTML调用运行时方法,类似于[htmx](https://htmx.org)。 ```html Wails ML演示

Wails ML演示

此应用程序不包含任何Javascript!

悬停在我上面
```