初めてのアプリ
10 分で動作する Wails アプリケーションを構築する
Wails の中核となる次の概念を示す、シンプルな挨拶アプリケーションを構築します。
- ロジックを管理する Go バックエンド
- Go 関数を呼び出すフロントエンド
- 型安全なバインディング
- 開発中のホットリロード
所要時間:10 分
プロジェクトを作成する
プロジェクトを生成する
wails3 init -n myapp
cd myapp
これにより、デフォルトの Vanilla + Vite テンプレート(Vite バンドラーを使用する HTML/CSS/TypeScript)で新しいプロジェクトが作成されます。
プロジェクト構造を理解する
myapp/
├── main.go # Application entry point
├── greetservice.go # Greet service
├── frontend/ # Your UI code
│ ├── index.html # HTML entry point
│ ├── src/
│ │ └── main.ts # Frontend TypeScript
│ ├── public/
│ │ └── style.css # Styles
│ ├── package.json # Frontend dependencies
│ ├── tsconfig.json # TypeScript configuration
│ └── vite.config.ts # Vite bundler config
├── build/ # Build configuration
└── Taskfile.yml # Build tasksアプリを実行する
wails3 dev
アプリが開き、挨拶用のインターフェースが表示されます。名前を入力して「Greet」をクリックすると、Go バックエンドが入力を処理して挨拶を返します。
仕組み
この仕組みを実現するコードを見ていきましょう。
Go バックエンド
greetservice.go を開きます。
package main
import (
"fmt"
)
type GreetService struct{}
func (g *GreetService) Greet(name string) string {
return fmt.Sprintf("Hello %s, It's show time!", name)
}主要な概念:
- サービス — エクスポートされたメソッドを持つ Go 構造体
- エクスポートされたメソッド —
Greetは先頭が大文字であるため、フロントエンドから利用可能 - シンプルなロジック — 名前を受け取り、挨拶を返す
- 型安全性 — 入力型と出力型が定義されている
サービスを登録する
main.go を開き、サービスの登録箇所を探します。
err := application.New(application.Options{
Name: "myapp",
Services: []application.Service{
application.NewService(&GreetService{}),
},
// ... other options
})これにより GreetService が Wails に登録され、エクスポートされたすべてのメソッドをフロントエンドから利用できるようになります。
フロントエンド
frontend/src/main.js を開きます。
import {GreetService} from "../bindings/changeme";
window.greet = async () => {
const nameElement = document.getElementById('name');
const resultElement = document.getElementById('result');
const name = nameElement.value;
if (!name) {
return;
}
try {
const result = await GreetService.Greet(name);
resultElement.innerText = result;
} catch (err) {
console.error(err);
}
};主要な概念:
- 自動生成されたバインディング —
GreetServiceは生成されたコードからインポートされる - 型安全な呼び出し — メソッド名とシグネチャが Go コードと一致する
- デフォルトで非同期 — すべての Go 呼び出しが Promise を返す
- エラー処理 — Go からのエラーは try/catch で捕捉される
アプリをカスタマイズする
ワークフローを理解するため、新しい機能を追加してみましょう。
「Greet Many」機能を追加する
GreetService にメソッドを追加する
次の内容を greetservice.go に追加します。
func (g *GreetService) GreetMany(names []string) []string {
greetings := make([]string, len(names))
for i, name := range names {
greetings[i] = fmt.Sprintf("Hello %s!", name)
}
return greetings
}アプリは自動的に再ビルドされる
ファイルを保存すると、wails3 dev が Go コードを自動的に再ビルドし、アプリを再起動します。
フロントエンドで使用する
次の内容を frontend/src/main.js に追加します。
window.greetMany = async () => {
const names = ['Alice', 'Bob', 'Charlie'];
const greetings = await GreetService.GreetMany(names);
console.log(greetings);
};ブラウザーコンソールを開いて greetMany() を呼び出すと、挨拶の配列が表示されます。
本番環境向けにビルドする
アプリを配布する準備ができたら、次を実行します。
wails3 build
実行される処理:
- 最適化を有効にして Go コードをコンパイルする
- フロントエンドを本番環境向けにビルドする(ミニファイを実施)
bin/にネイティブ実行ファイルを作成する
出力: bin/myapp.exe
ダブルクリックして実行します。依存関係は必要ありません(WebView2 は Windows に含まれています)。
出力: bin/myapp.app
Applications フォルダーにドラッグするか、ダブルクリックして実行します。
出力: bin/myapp
./bin/myapp で実行するか、ランチャー用の .desktop ファイルを作成します。
ここまでに学んだこと
プロジェクト構成
- Go バックエンド用の
main.go - UI コード用の
frontend/ - ビルドタスク用の
Taskfile.yml
サービス
- エクスポートされたメソッドを持つ Go の構造体を作成
application.NewService()で登録- メソッドをフロントエンドから自動的に利用可能
バインディング
- TypeScript 定義を自動生成
- 型安全な関数呼び出し
- デフォルトで非同期(Promise)
開発ワークフロー
- ホットリロード用の
wails3 dev - Go の変更時に自動で再ビルドして再起動
- フロントエンドの変更を即座にホットリロード
質問がありますか? Discord に参加して、コミュニティに質問してください。