第零話
Asuka ドキュメント
Asuka を使うと、Go で書いたアプリを iOS、Android、macOS、Windows、Linux、Web で、各プラットフォーム純正のウィジェットを使って動かせます。アプリの画面は、ビューを返す Go の関数として書きます。Asuka はそれをプラットフォームのウィジェットで表示し、シグナルが変わったときは、そのシグナルを読んでいるビューだけを更新します。
func Counter() ui.Node {
count := signal.New(0)
label := signal.Func(func() string {
return fmt.Sprintf("Count: %d", count.Get())
})
return ui.SafeArea(ui.Style{Align: ui.AlignCenter, Justify: ui.JustifyCenter},
ui.Text(label),
ui.Button(ui.ButtonProps{
Title: ui.Val("Add"),
Variant: ui.ButtonFilled,
OnPress: func() { count.Set(count.Peek() + 1) },
}),
)
}
func main() { app.Run(Counter) }仕組み
アプリはすべて Go で書きます。コンポーネントも、状態も、そのほかのコードも Go です。Asuka のコアはコンポーネントを実行してビューをレイアウトし(flexbox と grid を Go で実装しています)、変わった部分をフレームごとに一つのバッチにまとめて、プラットフォームのホストに送ります。ホストはそれを受けて、プラットフォーム純正のビューを作成・更新します。
| プラットフォーム | ホスト | 使うビュー |
|---|---|---|
| iOS | Swift。アプリの Go コードをライブラリとして組み込む | UIKit |
| Android | Kotlin。アプリの Go コードをライブラリとして組み込む | Android Views と Material 3 |
| macOS | Go。アプリと同じプロセスで動く(purego 経由で AppKit を呼び出す) | AppKit |
| Windows | Go。アプリと同じプロセスで動く(syscall 経由で Win32 を呼び出す) |
Win32 とコモンコントロール(Windows 11 の見た目で描画) |
| Linux | Go。アプリと同じプロセスで動く(purego 経由で GTK を呼び出す) | GTK 4 と libadwaita |
| Web | JavaScript。アプリの Go コードは WebAssembly として動く | ページの DOM とブラウザー標準のコントロール |
たとえばテキストフィールドは、プラットフォームに応じて UITextField、EditText、NSTextField、EDIT コントロール、GtkEntry、<input> のいずれかになります。画面のスタックなら、UINavigationController、戻るジェスチャーに対応した Material のアプリバー、戻るボタンの付いた Mac のウィンドウのツールバー、libadwaita のナビゲーションビューのいずれかです。そのため、スタイルを何も指定しないアプリは、そのプラットフォームのほかのアプリと同じ見た目になり、アクセシビリティやテキスト入力、スクロールもほかのアプリと同じように振る舞います。デスクトップのホストは cgo を使わずに Go からシステムのライブラリを呼び出すので、Windows や Linux のアプリは Go だけで、しかもどのシステムからでもビルドできます。
状態はシグナルが保持します。コンポーネントは一度だけ実行されます。シグナルが変わると、そのシグナルを読んでいるプロパティだけが送り直されます。ツリーの差分を取ることはありません。
一つのアプリが、どのプラットフォームでもそのまま動きます。スマートフォンでは画面全体に表示され、デスクトップではユーザーがサイズを変えられるウィンドウになります。デスクトップでは、ウィンドウを追加で開いたり(ui.Window。スマートフォンにはない機能です)、キーボードショートカット付きのメニューバーを持たせたり(ui.MenuBar。スマートフォンでは無視されます)もできます。あるプラットフォームにない機能を扱うパッケージ(たとえば Mac でのセンサーやホーム画面ウィジェット)は、そのプラットフォームでは「利用できない」と答えます。そのためアプリは、使えるかどうかを確かめたうえで、その機能なしで動作できます。
Asuka には Go 1.26 以降が必要です。アプリが動作するのは、iOS 16、Android 13 (API 33)、macOS 11、Windows 10 以降と、GTK 4.14 以降および libadwaita 1.5 以降を備えた Linux、そして最新のブラウザーです。開発中は asuka dev でアプリを実行でき、ファイルを保存するたびにリロードされます。実行先は、シミュレーター、エミュレーター、実機(いずれも Go のコードは手元のコンピューターで動きます)、コンピューターそのもの、ブラウザーから選べます。
ガイド
asuka dev の詳細、デバイス、asuka vet、テスト、よくある問題テストデバイスもディスプレイも使わない、go test でのアプリの UI のテスト。タップや入力と画面の表示内容の確認、スナップショット、アプリのゴルーチンの待機配布App Store と Google Play 向けのビルド、署名・公証済みの Mac アプリ、Windows 向けのフォルダー、Linux のアーカイブと Flatpak マニフェスト、デスクトップアプリの署名付きアップデート、asuka.json に記述するアプリの情報Web同じアプリを WebAssembly とページの DOM でブラウザーで動かす仕組み、asuka dev --platform web、デプロイできる静的サイト、ほかのページへの埋め込み、まだできないことリファレンス
- asuka.json:アプリの
asuka.jsonのすべてのキーについて、型、デフォルト値、各プラットフォームでの働き - SwiftUI・Expo との比較:Asuka にあるもの、まだないもの
- Asuka と MyGo:プラットフォーム純正のウィジェットか、フレームワークが描く UI か。それぞれが動く環境(MyGo のスマートフォン対応は近日公開予定)と、どちらを使うべきか
- Go の API:
go doc -all github.com/egoist/asuka/uiと、モジュール内のほかのパッケージ