Asuka ドキュメント
概要Episode 00

第零話

Asuka ドキュメント

Asuka を使うと、Go で書いたアプリを iOS、Android、macOS、Windows、Linux、Web で、各プラットフォーム純正のウィジェットを使って動かせます。アプリの画面は、ビューを返す Go の関数として書きます。Asuka はそれをプラットフォームのウィジェットで表示し、シグナルが変わったときは、そのシグナルを読んでいるビューだけを更新します。

Go
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 のコードは手元のコンピューターで動きます)、コンピューターそのもの、ブラウザーから選べます。

ガイド

はじめにCLI のインストールから、アプリの作成、実機・シミュレーター・コンピューター・ブラウザーでの実行まで基本概念コンポーネント、シグナル、オーナー、メインスレッド、環境レイアウトとスタイルFlexbox、サイズ、セーフエリア、色、テキスト、影、グラデーションコンポーネントテキスト、ボタン、入力欄、画像、リスト、動画、Web ビュー、描画ナビゲーションスタック、タブ、シート、アラート、メニュー、ウィンドウとメニューバー、アプリを開くリンク、ほかのアプリからの共有モーションとジェスチャーアニメーション、トランジション、共有要素、ジェスチャー、キー入力、触覚フィードバックアクセシビリティラベル、ロール、カスタムアクション、読み上げのアナウンス、文字サイズの設定に合わせて拡大するテキスト多言語対応複数形に対応した翻訳メッセージ、ユーザーの地域の書式に合わせた数値と日付、右から左(RTL)のレイアウト、言語を切り替えての確認データアプリを再起動しても残る値、ライブクエリに対応した SQLite、セキュアストレージ、ファイルの変更の監視デバイスとサービス各プラットフォームでのカメラ、コードのスキャン、写真とファイル、プレビュー、印刷と PDF、メールとメッセージの作成画面、位置情報、通知とプッシュ通知、オーディオ、再生中の情報(Now Playing)と録音、ネットワーク、メディアライブラリ、バックグラウンド処理、サインインと生体認証、画面と起動画面、地図、ストアのサービス、センサー、画像編集、音声、連絡先とカレンダー、ホーム画面ウィジェットとショートカット、クラッシュレポートデスクトップトレイアイコンと Dock メニュー、バックグラウンドで動くアプリ、グローバルショートカット、ファイルダイアログとファイルマネージャー、ファイルを開く処理、単一インスタンス、終了、最近使った書類、ログイン時の起動、アップデート、ディスプレイ、電源、アプリのアイコンでの進捗表示プラグインネイティブライブラリを各プラットフォーム向けにビルド済みの状態で持ち込み、アプリに同梱するパッケージ(SQLite もその一つです)ネイティブコードネイティブパッケージ。Go で宣言し、各プラットフォームのプロジェクトで実装する型付きのモジュールとビュー(iOS と macOS は Swift、Android は Kotlin、Web は JavaScript、Windows と Linux は 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 と、モジュール内のほかのパッケージ