# 从 v1 迁移

## 概述

Wails v2 与 v1 相比有重大变化。 本文档旨在重点介绍迁移现有项目的更改和步骤。

### 创建应用程序

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

示例：

```go title="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()` 方法接受 [应用程序参数选项](../reference/options#应用程序参数选项)。

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

### 绑定

在 v1 中，可以绑定任意函数和结构。 在 v2 中，这已被简化为仅绑定结构体。 以前 v1 传递给 `Bind()` 中的方法的结构实例现在在 [应用程序参数选项 ](../reference/options#应用程序参数选项)`Bind` 字段中指定：

```go title="v1"
  app := wails.CreateApp(/* options */)
  app.Bind(basic)
```

```go title="v2"
    err := wails.Run(&options.App{
        /* other options */
        Bind: []interface{}{
            basic,
        },
    })
```

在 v1 中，绑定方法可用于前端的 `window.backend`。 这已更改为 `window.go`。

### 应用程序生命周期

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

- [应用启动回调](../reference/options.mdx#onstartup)
- [应用退出回调](../reference/options.mdx#onshutdown)
- [前端 Dom 加载完成回调](../reference/options.mdx#ondomready)

注意：[ 前端 Dom 加载完成回调](../reference/options#前端-dom-加载完成回调)替换了 v1 中的 `wails:ready` 系统事件。

这些方法可以是标准函数，但通常的做法是让它们成为结构的一部分：

```go title="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 丰富得多，支持菜单、窗口操作和更好的对话框。 方法的签名略有变化 - 请参阅 [运行时](../reference/runtime/intro)。

在 v1 中，[运行时](../reference/runtime/intro) 可通过传递给 `WailsInit()`。 在 v2 中，运行时已移出到它自己的包。 运行时中的每个方法都采用 `context.Context` 传递给了 [应用启动回调](../reference/options#应用启动回调)方法。

```go title="Runtime Example"
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 不对您的前端资源做任何预设，就像网络服务器一样。 您的所有应用程序资源都作为 `embed.FS`。

**这意味着不需要捆绑您的资产、将图像编码为 Base64 或尝试使用捆绑器配置的黑暗艺术来使用自定义字体**。

在启动时，Wails 将扫描给定的`embed.FS`的`index.html`并将其位置用作所有其他应用程序资源的根路径 - 就像网络服务器一样。

示例：应用程序具有以下项目布局。 所有最终资源都放在 `frontend/dist`目录中：

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

应用程序可以通过简单地创建一个 `embed.FS` 来使用这些资源：

```go title="Assets Example"
//go:embed all:frontend/dist
var assets embed.FS

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

当然，如果您愿意，也可以使用打包工具。 唯一的要求是在 Wails 中使用 `embed.FS` 将最终的程序资源目录传递给 [应用程序参数选项](../reference/options#应用程序参数选项) 的 `Assets` 键。

### 项目配置

在 v1 中，项目配置存储在项目根的 `project.json` 文件中。 在 v2 中，项目配置存储在项目根部的 `wails.json` 文件中。

文件的格式略有不同。 下面是区别：

<p align="center">

| v1                 | v2               | 记录                                                                                                                                                                      |
| ------------------ | ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| name               | name             |                                                                                                                                                                            |
| description        |                  | 移除                                                                                                                                                                    |
| author / name      | author / name    |                                                                                                                                                                            |
| author / email     | author / email   |                                                                                                                                                                            |
| version            | version          |                                                                                                                                                                            |
| binaryname         | outputfilename   | 变更                                                                                                                                                                   |
| frontend / dir     |                  | 移除                                                                                                                                                                    |
| frontend / install | frontend:install | 变更                                                                                                                                                                    |
| frontend / build   | frontend:build   | 变更                                                                                                                                                                    |
| frontend / bridge  |                  | 移除                                                                                                                                                                    |
| frontend / serve   |                  | 移除                                                                                                                                                                    |
| tags               |                  | 移除                                                                                                                                                                    |
|                    | wailsjsdir       | 生成 wailsjs 模块的目录                                                                                                                                 |
|                    | assetdir         | 为开发模式编译的前端资产的目录。 这通常是推断的，可以留空。                                                           |
|                    | reloaddirs       | 以逗号分隔的附加目录列表，用于监视更改并在开发模式下触发重新加载。 只有一些更高级的资产配置才需要这样做。 |

</p>
