跳至主要内容
版本:v2.9.0

从 v1 迁移

概述

Wails v2 与 v1 相比发生了重大变化。本文档旨在突出显示更改以及迁移现有项目的步骤。

创建应用程序

在 v1 中,主应用程序是使用 wails.CreateApp 创建的,绑定是使用 app.Bind 添加的,然后应用程序是使用 app.Run() 运行的。

示例

v1
 app := wails.CreateApp(&wails.AppConfig{
Title: "MyApp",
Width: 1024,
Height: 768,
JS: js,
CSS: css,
Colour: "#131313",
})
app.Bind(basic)
app.Run()

在 v2 中,只有一个方法 wails.Run(),它接受应用程序选项

v2
    err := wails.Run(&options.App{
Title: "MyApp",
Width: 800,
Height: 600,
AssetServer: &assetserver.Options{
Assets: assets,
},
Bind: []interface{}{
basic,
},
})

绑定

在 v1 中,可以绑定任意函数和结构体。在 v2 中,这已简化为仅绑定结构体。以前在 v1 中传递给 Bind() 方法的结构体实例现在在应用程序选项Bind 字段中指定。

v1
  app := wails.CreateApp(/* options */)
app.Bind(basic)
v2
    err := wails.Run(&options.App{
/* other options */
Bind: []interface{}{
basic,
},
})

在 v1 中,绑定方法可通过 window.backend 在前端使用。这已更改为 window.go。``

应用程序生命周期

在 v1 中,绑定结构体中有 2 个特殊方法:WailsInit()WailsShutdown()。这些已被 3 个生命周期挂钩替换,作为应用程序选项的一部分。

注意:OnDomReady 替换了 v1 中的 wails:ready 系统事件。

这些方法可以是标准函数,但常见做法是将它们作为结构体的一部分。

v2
    basic := NewBasicApp()
err := wails.Run(&options.App{
/* Other Options */
OnStartup: basic.startup,
OnShutdown: basic.shutdown,
OnDomReady: basic.domready,
})
...
type Basic struct {
ctx context.Context
}
func (b *Basic) startup(ctx context.Context) {
b.ctx = ctx
}
...

运行时

v2 中的运行时比 v1 丰富得多,支持菜单、窗口操作和更好的对话框。方法的签名略有变化 - 请参阅运行时参考

在 v1 中,运行时 可通过传递给 WailsInit() 的结构体获得。在 v2 中,运行时已移至其自己的包中。运行时中的每个方法都采用传递给OnStartup 方法的 context.Context

运行时示例
package main

import "github.com/wailsapp/wails/v2/pkg/runtime"

type Basic struct {
ctx context.Context
}

// startup is called at application startup
func (a *App) startup(ctx context.Context) {
a.ctx = ctx
runtime.LogInfo(ctx, "Application Startup called!")
}

资产

v2 中最大的改变是资产的处理方式。

在 v1 中,资产通过 2 个应用程序选项传递。

  • JS - 应用程序的 JavaScript
  • CSS - 应用程序的 CSS

这意味着生成单个 JS 和 CSS 文件的责任在开发人员身上。这实际上需要使用像 webpack 这样的复杂打包器。

在 v2 中,Wails 对你的前端资产没有假设,就像 web 服务器一样。所有应用程序资产都作为 embed.FS 传递给应用程序选项。

这意味着没有必要捆绑你的资产,将图像编码为 Base64 或尝试使用自定义字体的捆绑器配置的黑魔法。.

在启动时,Wails 将扫描给定的 embed.FS 以查找 index.html,并使用其位置作为所有其他应用程序资产的根路径 - 就像 web 服务器一样。

示例:一个应用程序具有以下项目布局。所有最终资产都放置在 frontend/dist 目录中。

.
├── build/
├── frontend/
│ └── dist/
│ ├── index.html
│ ├── main.js
│ ├── main.css
│ └── logo.svg
├── main.go
└── wails.json

这些资产可以通过简单地创建一个 embed.FS 被应用程序使用。

资产示例
//go:embed all:frontend/dist
var assets embed.FS

func main() {
err := wails.Run(&options.App{
/* Other Options */
AssetServer: &assetserver.Options{
Assets: assets,
},
})
}

当然,如果你愿意,可以使用捆绑器。唯一的先决条件是使用应用程序选项Assets 键中的 embed.FS 将最终应用程序资产目录传递给 Wails。

项目配置

在 v1 中,项目配置存储在项目根目录下的 project.json 文件中。在 v2 中,项目配置存储在项目根目录下的 wails.json 文件中。

文件的格式略有不同。以下是比较。

v1v2注意
namename
description已移除
author / nameauthor / name
author / emailauthor / email
versionversion
binarynameoutputfilename已更改
frontend / dir已移除
frontend / installfrontend:install已更改
frontend / buildfrontend:build已更改
frontend / bridge已移除
frontend / serve已移除
tags已移除
wailsjsdir生成 wailsjs 模块的目录
assetdirdev 模式下编译的前端资产的目录。这通常是推断出来的,可以留空。
reloaddirs要监视更改以在 dev 模式下触发重新加载的其他目录的逗号分隔列表。这仅在一些更高级的资产配置中才需要。