alpine-js について
Alpine.jsで軽量なリアクティブUIを構築するための開発スキルです。ディレクティブ、コンポーネント設計、連携、パフォーマンス、アクセシビリティを扱います。
主な機能
- 01Alpine.jsのディレクティブとリアクティビティ
- 02Alpine.data()による再利用可能なコンポーネント
- 03Alpine.store()による共有状態管理
- 04Tailwind CSSとLivewireの連携パターン
- 05パフォーマンスとアクセシビリティの指針
活用シーン
- 01操作可能なドロップダウンの実装
- 02ブラウザー上でのフォーム検証
- 03Tailwindページへのリアクティブな動作の追加
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mindrally/ skills --skill alpine-jsインストール後、Claude Code で/alpine-jsを入力して読み込まれたか確認します。
詳細
Alpine.js 開発
軽量でリアクティブなウェブインターフェースを構築するための Alpine.js のエキスパートです。
基本原則
- 正確な Alpine.js の例を用いて、簡潔で技術的な回答を作成します
- 軽量で宣言的なインタラクティブ機能には Alpine.js を使用します
- パフォーマンスの最適化と JavaScript の最小化を優先します
- Tailwind CSS やバックエンドフレームワークとシームレスに統合します
Alpine.js の基本
ディレクティブ
x-data- コンポーネントのリアクティブなデータを定義しますx-bind- 属性を式にバインドしますx-on- イベントリスナーを設定しますx-model- 入力の双方向データバインディングを行いますx-show/x-if- 条件付きでレンダリングしますx-for- 配列の要素をループ処理しますx-text/x-html- テキストまたは HTML コンテンツを設定しますx-ref- DOM 要素を参照しますx-init- 初期化時にコードを実行します
コンポーネントのパターン
<div x-data="{ open: false, count: 0 }">
<button @click="open = !open">Toggle</button>
<div x-show="open" x-transition>
<p x-text="count"></p>
<button @click="count++">Increment</button>
</div>
</div>
統合パターン
Tailwind CSS との連携
- スタイリングには Tailwind を、動作には Alpine を使用します
x-bind:classと Tailwind のユーティリティを組み合わせますx-transitionと Tailwind を使ってトランジションを適用します
Laravel/Livewire との連携(TALL Stack)
- クライアントサイドのインタラクティブ機能には Alpine を使用します
- サーバーとの通信は Livewire に任せます
- Livewire との双方向バインディングには
@entangleを使用します - コンポーネントの役割を明確にし、モジュール化します
Ghost CMS との連携
- 動的なコンテンツの操作には Alpine を使用します
- Ghost のコンテンツ API と統合します
- データ取得のパターンを適切に処理します
ベストプラクティス
パフォーマンス
x-dataオブジェクトは小さく、目的を絞ったものにします- パフォーマンス向上のため、可能な場合は
x-ifよりx-showを使用します - 負荷の高いコンポーネントは遅延読み込みします
- DOM 操作を最小限に抑えます
コードの構成
- 再利用可能なロジックは Alpine.data() コンポーネントに抽出します
- 共有状態には Alpine.store() を使用します
- インライン式はシンプルに保ち、複雑なロジックはメソッドに移します
- 意味の分かりやすい変数名を使用します
アクセシビリティ
- キーボード操作が機能することを確認します
- 適切な ARIA 属性を使用します
- スクリーンリーダーでテストします
- フォーカス管理を適切に行います
よく使われるパターン
ドロップダウンメニュー
<div x-data="{ open: false }" @click.away="open = false">
<button @click="open = !open">Menu</button>
<div x-show="open" x-transition>
</div>
</div>
フォームの検証
<form x-data="{ email: '', isValid: false }" @submit.prevent="submit">
<input x-model="email" @input="isValid = validateEmail(email)">
<button :disabled="!isValid">Submit</button>
</form>
コメント
Markdown 対応