gpui について
gpui は、GPUI でデスクトップアプリを開発する人向けの実践ガイドです。描画、状態、イベント、非同期処理、アンチパターンのルールを影響度順に整理しています。
主な機能
- 018 分野のルールを収録
- 02影響度に基づく優先順位
- 03描画とコンポーネントの指針
- 04状態管理とイベント処理の解説
- 05非同期タスクの注意点
活用シーン
- 01GPUI のビューやコンポーネント開発
- 02Entity による状態管理の実装
- 03イベントとキーボードショートカットの処理
- 04GPUI アプリのテスト
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ aprilnea/ gpui-skills --skill gpuiインストール後、Claude Code で/gpuiを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
rules/_sections.mdanti-circular-reference.mdanti-drop-subscription.mdanti-drop-task.mdanti-missing-notify.mdanti-silent-error.mdanti-unwrap.mdasync-background-spawn.mdasync-debounce.mdasync-task-lifecycle.mdasync-weak-entity.mdcomp-dialog.mdcomp-focus-ring.mdcomp-stateless.mdcomp-traits.mdcore-context-types.mdcore-entity-operations.mdcore-ownership-model.mdcore-weak-entity.mdevent-actions.mdevent-focus.mdevent-listener.mdrender-builder-pattern.mdrender-conditional.mdrender-element-composition.mdrender-render-vs-renderonce.mdstate-notify.mdstyle-elevation.mdstyle-flexbox.mdstyle-theme-colors.md詳細
GPUI のベストプラクティス
Zed エディターを支える UI フレームワーク、GPUI を使ってデスクトップアプリケーションを構築するための包括的なガイドです。影響度に基づいて優先順位付けされた、8 つのカテゴリにわたる 40 以上のルールを収録しています。
適用する場面
次の作業を行う際に、これらのガイドラインを参照してください。
- 新しい GPUI ビューやコンポーネントを作成するとき
- Entity を使った状態管理を実装するとき
- イベントやキーボードショートカットを処理するとき
- 非同期タスクやバックグラウンド処理を扱うとき
- フォーム、リスト、ダイアログを構築するとき
- Tailwind のような API でコンポーネントのスタイルを設定するとき
- GPUI アプリケーションをテストするとき
優先度別のルールカテゴリ
| 優先度 | カテゴリ | 影響度 | プレフィックス |
|---|---|---|---|
| 1 | コアコンセプト | 重大 | core- |
| 2 | レンダリング | 重大 | render- |
| 3 | 状態管理 | 高 | state- |
| 4 | イベント処理 | 高 | event- |
| 5 | 非同期処理と並行処理 | 中〜高 | async- |
| 6 | スタイリング | 中 | style- |
| 7 | コンポーネント | 中 | comp- |
| 8 | アンチパターン | 重大 | anti- |
クイックリファレンス
1. コアコンセプト(重大)
core-ownership-model- GPUI の単一所有権モデルを理解するcore-entity-operations- read/update/observe/subscribe を正しく使うcore-weak-entity- WeakEntity を使って循環参照を解消するcore-context-types- App、Context、AsyncApp を使う場面を把握する
2. レンダリング(重大)
render-render-vs-renderonce- 状態を持つ場合は Render、コンポーネントには RenderOnce を選ぶrender-element-composition- div() とメソッドチェーンで要素ツリーを構築するrender-conditional- 条件付きスタイリングには .when() と .when_some() を使うrender-shared-string- 文字列のコピーを避けるために SharedString を使うrender-builder-pattern- ビルダーパターンでコンポーネントを設計する
3. 状態管理(高)
state-notify- 状態を変更した後は、必ず cx.notify() を呼び出すstate-observe- Entity の変更に応じて処理するには cx.observe() を使うstate-subscribe- 型付きイベントには cx.subscribe() を使うstate-global- アプリ全体で共有する状態には Global トレイトを使うstate-keyed-state- 永続的な状態には window.use_keyed_state() を使う
4. イベント処理(高)
event-actions- キーボードショートカット用のアクションを定義して登録するevent-listener- ビューに紐づくイベントハンドラーには cx.listener() を使うevent-focus- FocusHandle と key_context でフォーカスを管理するevent-propagation- イベントのバブリングと stop_propagation を理解する
5. 非同期処理と並行処理(中〜高)
async-task-lifecycle- キャンセルを防ぐため、タスクを保持するかデタッチするasync-debounce- タイマーとタスクの置き換えでデバウンスを実装するasync-background-spawn- CPU 負荷の高い処理には background_spawn を使うasync-weak-entity- await をまたぐ安全なアクセスには WeakEntity を使うasync-error-handling- .log_err() と .detach_and_log_err() を使う
6. スタイリング(中)
style-flexbox- レイアウトには h_flex() と v_flex() を使うstyle-theme-colors- 色には必ず cx.theme() を使うstyle-spacing- レスポンシブな間隔には DynamicSpacing を使うstyle-elevation- レイヤー化されたサーフェスにはエレベーションシステムを使う
7. コンポーネント(中)
comp-stateless- #[derive(IntoElement)] を使った RenderOnce を優先するcomp-traits- Disableable、Selectable、Sizable トレイトを実装するcomp-focus-ring- アクセシビリティのためにフォーカスリングを追加するcomp-dialog- ダイアログの管理には WindowExt を使うcomp-variant- コンポーネントのスタイルにはバリアント列挙型を使う
8. アンチパターン(重大)
anti-silent-error- let _ = でエラーを黙って破棄しないanti-drop-task- Task を保持もデタッチもせずに破棄しないanti-drop-subscription- サブスクリプションは必ずデタッチするか保持するanti-circular-reference- Entity の循環を避け、WeakEntity を使うanti-missing-notify- 状態変更後の cx.notify() を忘れないanti-unwrap- unwrap() を避け、? または明示的なエラー処理を使う
アーキテクチャの概要
┌─────────────────────────────────────────────────────────┐
│ Application (App) │
│ (Single owner of all Entities) │
└─────────────────────────────────────────────────────────┘
│
┌───────────────────┼───────────────────┐
│ │ │
┌───────────┐ ┌───────────┐ ┌──────────┐
│ Entity<A> │ │ Entity<B> │ │ Global<C>│
└───────────┘ └───────────┘ └──────────┘
│ │ │
│ read/update │ read/update │ via App
│ via Context<A> │ via Context<B> │
│
┌─────────────────────────────────────────────────┐
│ UI Rendering (Render trait) │
│ Each frame: fn render(&mut self, ...) │
│ Returns: impl IntoElement (Element tree) │
└─────────────────────────────────────────────────┘
│
├─ observe() → changes trigger render
├─ subscribe() → events trigger reactions
├─ notify() → signal changes
└─ emit() → send typed events
使用方法
詳しい説明やコード例については、各ルールファイルをお読みください。
rules/core-ownership-model.md
rules/render-render-vs-renderonce.md
rules/anti-silent-error.md
各ルールファイルには、以下が含まれています。
- 重要な理由の簡単な説明
- 説明付きの誤ったコード例
- 説明付きの正しいコード例
- 追加の背景情報と参考資料
コメント
Markdown 対応