はじめに
デスクトップアプリを作りたいと思ったとき、まず思い浮かぶのはElectronだと思います。ただ、Electronってメモリ消費が大きいし、アプリサイズも肥大化しがちなんですよね。
個人的にGoが好きで、サーバーサイドやCLIツールをGoで書くことが多いんですが、「Goでデスクトップアプリってできないのかな」と思って調べたところ、Wailsというフレームワークを見つけました。
Wailsは、GoをバックエンドにしつつHTML/CSS/JavaScriptでUIを構築できるデスクトップアプリフレームワークです。GitHubスター数は31,500以上で、かなり活発に開発されています。
Wailsの特徴・メリット
Electronの軽量代替として
Wailsの最大の特徴は、ブラウザエンジンを埋め込まないという点です。
Electronは内部にChromiumを丸ごと抱えているので、シンプルなアプリでも100MB以上になることがあります。一方Wailsは、OSのネイティブWebViewを使うので、バイナリサイズがかなりコンパクトになります。
GoとWeb技術のいいとこ取り
- バックエンド: Goの高速性、並行処理、豊富なライブラリを活用
- フロントエンド: React、Vue、Svelte、Preactなど好きなフレームワークが使える
- TypeScript対応: Go構造体からTypeScript定義を自動生成してくれる
これ、意外と便利なんですよ。Go側で定義した構造体がそのままTypeScriptで型として使えるので、フロントエンドとバックエンドの型の不整合が起きにくい。
クロスプラットフォーム対応
Windows、macOS、Linuxに対応しています。一つのコードベースで3プラットフォーム向けにビルドできるのはやはり魅力ですね。
ネイティブ機能のサポート
- ネイティブダイアログ(ファイル選択、確認ダイアログなど)
- システムメニュー
- ダークモード対応
- システムトレイ
インストール方法
前提条件
- Go 1.18以上
- Node.js 15以上
- npm
Wails CLIのインストール
go install github.com/wailsapp/wails/v2/cmd/wails@latest
インストール後、環境チェックを実行しておくと安心です。
wails doctor
これで依存関係に問題がないか確認できます。
基本的な使い方
プロジェクトの作成
wails init -n myapp -t react-ts
-tオプションでテンプレートを選択できます。用意されているテンプレートは以下の通り。
vanilla/vanilla-tsreact/react-tsvue/vue-tssvelte/svelte-tspreact/preact-tslit/lit-ts
個人的にはReact + TypeScriptの組み合わせが多いですが、VueやSvelteが好みならそちらでも問題ありません。
プロジェクト構成
myapp/
├── build/ # ビルド設定
├── frontend/ # フロントエンドコード
│ ├── src/
│ └── package.json
├── app.go # Goのアプリケーションロジック
├── main.go # エントリーポイント
└── wails.json # Wails設定ファイル
Go側のコード例
// app.go
package main
import "context"
type App struct {
ctx context.Context
}
func NewApp() *App {
return &App{}
}
func (a *App) startup(ctx context.Context) {
a.ctx = ctx
}
// フロントエンドから呼び出せるメソッド
func (a *App) Greet(name string) string {
return "Hello " + name + "!"
}
// 構造体を返すことも可能
type User struct {
Name string `json:"name"`
Email string `json:"email"`
}
func (a *App) GetUser(id int) User {
return User{
Name: "田中太郎",
Email: "tanaka@example.com",
}
}
フロントエンド側のコード例
// フロントエンドから Go のメソッドを呼び出す
import { Greet, GetUser } from '../wailsjs/go/main/App';
async function handleClick() {
const message = await Greet("World");
console.log(message); // "Hello World!"
const user = await GetUser(1);
console.log(user.name); // "田中太郎" - 型も効いている
}
Goで公開したメソッドはwailsjsディレクトリに自動生成されるので、それをインポートして使います。TypeScriptの型定義も自動生成されるので、型安全に開発できます。
開発サーバーの起動
wails dev
ホットリロードが効くので、フロントエンドを変更すると即座に反映されます。Go側のコードを変更した場合は自動でリビルドが走ります。
本番ビルド
wails build
プラットフォームに応じた実行ファイルが生成されます。
実践的なユースケース
社内ツール
正直なところ、Wailsが最も活きるのは社内ツールの開発だと思います。
- ログビューアー
- 設定ファイルエディタ
- データベース管理ツール
- 業務効率化ツール
Go側でファイル操作やAPI通信を行い、フロントエンドで見やすく表示する。この分担がスムーズにできるのがWailsの強みです。
CLIツールのGUI化
既存のCLIツールをGUI化したいケースにも向いています。Goで書いたCLIツールがあれば、そのロジックをほぼそのまま流用してGUI版を作れます。
Electronからの移行
メモリ使用量やバイナリサイズを削減したい場合、Electronからの移行先としても候補になります。ただし、ElectronほどWeb技術に特化していない部分もあるので、機能の対応状況は確認が必要です。
注意点
いくつか知っておいたほうが良い点もあります。
- Electronほどの機能はない: Electronは長い歴史があり、プラグインエコシステムも充実しています。Wailsはまだ発展途上の部分もあります
- WebViewの違い: OSごとにWebViewエンジンが異なるため、ブラウザ間の差異に注意が必要な場合があります
- 日本語の情報が少なめ: 英語ドキュメントが中心なので、そこは覚悟が必要です
Wails v3について
現在v3がアルファ版として開発中で、すでに本番環境で動いているアプリもあるようです。APIはある程度安定しているとのことですが、新規プロジェクトでは安定版のv2を選ぶのが無難でしょう。
まとめ
Wailsは、GoプログラマーがデスクトップアプリをWeb技術で構築するための選択肢として、かなり実用的なフレームワークだと思います。
- Electronより軽量でコンパクト
- GoとWeb技術のいいとこ取り
- TypeScript定義の自動生成で型安全
- クロスプラットフォーム対応
「Goが好きだけどデスクトップアプリも作りたい」という人には一択ですね。まずはwails initでプロジェクトを作って、開発体験を試してみることをおすすめします。