たった1行のscriptタグで動く軽量JSフレームワーク「Alpine.js」使い方まとめ

2026年7月29日水曜日

Alpine.jsとか… JavaScriptとか…

t f B! P L

「ボタンを押したらメニューが開くだけの、たったそれだけの機能」のために、わざわざVueやReactを導入して、npmを叩いて、ビルドツールを設定して……という経験、ありませんか。正直、これがかなり面倒です。

かといって素のJavaScriptでaddEventListenerを書き並べていくと、コードはあっという間にごちゃごちゃになり、どこで何が起きているのか自分でも分からなくなります。この「帯に短し襷に長し」問題を、驚くほどあっさり解決してくれるのがAlpine.jsです。

この記事では、Alpine.jsがなぜ「拍子抜けするほど簡単」なのかという理由から、実際の導入手順、そして日常的によく使う書き方の「いろは」までを、できるだけ網羅的にまとめました。読み終える頃には、自分のサイトに小さな動きを1つ追加してみたくなっているはずです。

この記事のポイント

  • Alpine.jsとは何か、なぜ「導入が簡単」と言われるのかがわかる
  • CDNを使った最速の導入手順が具体的にわかる
  • x-data、x-show、x-model、x-forなど、よく使う基本の書き方が一通りわかる
  • 導入前に知っておくべき注意点や向き・不向きもあわせてわかる

そもそもAlpine.jsとは何なのか

Alpine.jsは、公式サイトが自らを「rugged, minimal JavaScript framework(無骨で最小限のJavaScriptフレームワーク)」と表現している、軽量なJavaScriptライブラリです。

考え方はVue.jsによく似ています。ただしVueのような単一ファイルコンポーネントも、仮想DOMも、複雑なビルドツールチェーンも持ちません。その代わりに、HTMLの属性(ディレクティブ)として直接「状態」と「振る舞い」を書き込み、その状態が変化するとAlpine.jsの小さなリアクティブエンジンが自動的にDOMを更新してくれる、という仕組みになっています。

つまり、あなたがすでに持っているHTMLに、少しだけ「魔法の属性」を振りかけるだけで、宣言的で動きのあるページが作れてしまう。まさに「サーバーサイドで組んだページに、必要な場所だけ小さな島(アイランド)のように機能を足していく」というスタイルにぴったりのライブラリです。

なぜ「拍子抜けするほど」導入が簡単なのか

フロントエンドのライブラリやフレームワークを導入するとき、多くの人が身構えるのは次のような手間です。

  • ⚠️Node.jsやnpmの環境構築
  • ⚠️Webpack・Viteなどのビルドツールの設定
  • ⚠️コンポーネント設計やJSXなど、新しい書き方そのものの学習

Alpine.jsの場合、これらの手間がほぼゼロで済みます。極端な話、HTMLファイルに<script>タグを1行足すだけで使い始められるからです。この「気軽さ」こそが、Alpine.jsが多くの開発者に選ばれている最大の理由と言ってよいでしょう。

他のライブラリと簡単に比較してみると、その立ち位置がよくわかります。

項目 Alpine.js Vue.js / React
ビルドツール 不要(CDNのみで完結) 基本的に必要(Vite、webpackなど)
記述場所 既存のHTMLに直接属性として追加 専用のコンポーネントファイルを作成
学習コスト 低め(HTML属性の延長で理解しやすい) やや高め(JSX、SFC、状態管理設計など)
得意な規模感 サーバーサイドで組んだページへの部分的な機能追加 画面全体をJSで組み立てる大規模SPA

この表からもわかる通り、Alpine.jsは「アプリ全体を作るためのフレームワーク」ではなく、「今あるページに、必要な分だけ動きを足すための道具」と捉えると、その良さがしっくりきます。

実際に導入してみる:CDNで始める最速の手順

ここからは実際に手を動かしていきましょう。npmでのインストールも可能ですが、まずは一番手軽なCDN経由での導入から紹介します。

  1. HTMLファイルの<head>タグ内に、Alpine.jsの<script>タグを1行追加する
  2. 本文中に、Alpine.jsのディレクティブ(x-dataなど)を書いたHTMLを用意する
  3. ブラウザでページを開いて、動きを確認する

コードにすると、これだけです。

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>Alpine.js サンプル</title>
  <script defer src="https://unpkg.com/alpinejs@3.x.x/dist/cdn.min.js"></script>
</head>
<body>

  <div x-data="{ open: false }">
    <button x-on:click="open = !open">メニューを開く</button>
    <div x-show="open">
      これがAlpine.jsで開閉するメニューです。
    </div>
  </div>

</body>
</html>

この短いコードだけで、ボタンをクリックすると要素が表示・非表示になる、れっきとした「動くWebページ」が完成します。ビルドも設定ファイルも一切必要ありません。

💡 @3.x.xの部分は実際のバージョン番号に置き換えて使う

@3.x.xのままではAlpine.jsは動きません。必ず公式サイト(https://alpinejs.dev/)のインストールページで最新のバージョン番号を確認し、実際の数字に置き換えてから使ってください。バージョンは頻繁に更新されるため、この記事の数字をそのままコピーするのではなく、必ずその都度公式サイトを確認する癖をつけると安心です。

また、GitHubリポジトリではnpmを使ったインストール方法も提供されています。ビルド環境がすでにあるプロジェクトに組み込みたい場合は、こちらの方法も選択肢になります。

npm install alpinejs

ただ、正直なところ「まず試してみたい」という段階であれば、CDNで十分です。むしろこの気軽さこそがAlpine.jsの魅力なので、最初からnpm環境を整える必要はまったくありません。

Alpine.jsの基本のいろは:よく使うディレクティブ一覧

ここからは、実際によく使う書き方を1つずつ紹介していきます。どれも覚えることは少なく、HTMLの延長線上で理解できるものばかりです。

x-data:状態を宣言する出発点

x-dataは、その要素とその子要素が使う「状態(データ)」を定義する、すべての出発点になるディレクティブです。JavaScriptのオブジェクトをそのまま書き込みます。

<div x-data="{ count: 0, message: 'こんにちは' }">
  <!-- この中でcountやmessageが使える -->
</div>

x-show / x-if:要素の表示・非表示を切り替える

x-showはCSSのdisplayを切り替えることで表示・非表示をコントロールします。一方x-if<template>タグと組み合わせ、要素そのものをDOMから追加・削除します。

<div x-data="{ open: false }">
  <button x-on:click="open = !open">切り替え</button>

  <p x-show="open">display:noneで消えます</p>

  <template x-if="open">
    <p>DOMごと消えます</p>
  </template>
</div>

x-on:イベントを拾う(@click省略記法もあり)

クリックや入力といったイベントを扱うディレクティブです。x-on:click@clickという省略記法でも書けます。実務ではこの省略記法の方がよく使われます。

<div x-data="{ count: 0 }">
  <button @click="count++">+1</button>
  <span x-text="count"></span>
</div>

x-model:フォームの入力値と状態を連動させる

入力フォームの値とデータを双方向に結びつけるディレクティブです。入力するたびに、リアルタイムで状態が更新されます。

<div x-data="{ name: '' }">
  <input type="text" x-model="name" placeholder="お名前を入力">
  <p>こんにちは、<span x-text="name"></span>さん</p>
</div>

x-bind:属性の値を動的に変える(:class省略記法もあり)

classstylehrefといったHTML属性の値を、状態に応じて動的に切り替えたいときに使います。省略記法として:だけで書くことも可能です。

<div x-data="{ active: false }">
  <button
    @click="active = !active"
    :class="active ? 'btn-active' : 'btn-default'"
  >
    切り替えボタン
  </button>
</div>

x-for:配列をもとに繰り返し表示する

リストやカードなど、配列データをもとに同じ構造を繰り返し出力したいときに使います。<template>タグと組み合わせるのがポイントです。

<ul x-data="{ items: ['りんご', 'みかん', 'ぶどう'] }">
  <template x-for="item in items" :key="item">
    <li x-text="item"></li>
  </template>
</ul>

x-text / x-html:テキストを出し分ける

x-textは状態の値をそのままテキストとして表示します。x-htmlはHTMLタグを含んだ文字列をそのまま描画できますが、扱いには注意が必要です。

外部から受け取った文字列や、ユーザーが入力した値をx-htmlにそのまま渡すのは避けてください。信頼できないテキストをHTMLとして描画してしまうと、意図しないスクリプトが実行される「XSS(クロスサイトスクリプティング)」の原因になります。表示するだけでよい場合は、基本的にx-textを使うようにしましょう。

x-transition:表示・非表示にふわっとした動きをつける

x-showと組み合わせることで、要素が現れたり消えたりする際にフェードやスライドといったアニメーションを簡単に追加できます。

<div x-data="{ open: false }">
  <button @click="open = !open">開閉</button>

  <div x-show="open" x-transition>
    ふわっと表示されるボックスです
  </div>
</div>

覚えておくと便利な「マジックプロパティ」

ディレクティブ以外にも、Alpine.js独自の便利な変数(マジックプロパティ)がいくつか用意されています。よく使うものだけ簡単に紹介します。

  • 💡$el:今の要素そのものを参照できる
  • 💡$refsx-refで名前をつけた別の要素を参照できる
  • 💡$watch:特定の値が変化した瞬間の処理を書ける
  • 💡Alpine.store():複数のコンポーネントをまたいで共有できるグローバルな状態を作れる

特にAlpine.store()は、ヘッダーとフッターなど離れた場所で同じ状態(ログイン中かどうか、カートの中身など)を共有したいときに便利です。とはいえ、こうした複雑な状態管理が必要になってきた場合は、そもそもVueなど別のツールへの切り替えを検討するタイミングかもしれません。

実践編:よくある「小さな動き」をAlpine.jsで作ってみる

ここまでの知識だけで、実務でよく使う定番のUIパーツはほとんど作れます。タブ切り替えの例を見てみましょう。

<div x-data="{ tab: 'a' }">
  <div>
    <button @click="tab = 'a'" :class="tab === 'a' ? 'is-active' : ''">タブA</button>
    <button @click="tab = 'b'" :class="tab === 'b' ? 'is-active' : ''">タブB</button>
  </div>

  <div x-show="tab === 'a'">タブAの中身です</div>
  <div x-show="tab === 'b'">タブBの中身です</div>
</div>

「クリックしたボタンによって状態を切り替え、その状態に応じて表示を出し分ける」という考え方さえ掴んでしまえば、モーダルウィンドウやアコーディオン、ドロップダウンメニューなども、基本的には同じパターンの応用で作れてしまいます。ここまで来れば、もう身構える必要はありません。

導入前に知っておきたい注意点

ここまで良いことずくめのように紹介してきましたが、正直に言うと、Alpine.jsにも向き・不向きがあります。過度な期待をしてしまう前に、押さえておきたいポイントです。

  • ⚠️画面全体を丸ごとJavaScriptで組み立てるような大規模なSPAには不向き。あくまで既存ページへの「部分的な機能追加」が得意分野です
  • ⚠️複雑な状態管理やコンポーネント間の連携が増えてくると、記述が煩雑になりがちです
  • 逆に言えば「今あるサーバーサイドのページに、ちょっとした動きを足したい」という用途では、これ以上ないほど相性が良いということでもあります

CDNのURLに含まれるバージョン番号は必ず公式サイトで最新のものを確認してから使ってください。古いバージョン番号のままコピーして使ってしまうと、修正済みの不具合にわざわざ遭遇してしまう可能性があります。

まとめ

Alpine.jsは、「重量級のフレームワークを導入するほどではないけれど、素のJavaScriptだけで頑張るのはしんどい」という、多くの人が感じていたモヤモヤをちょうどよく解消してくれるライブラリです。CDNから1行のscriptタグを読み込むだけで導入でき、x-datax-showx-modelといった直感的なディレクティブをHTMLに書き足していくだけで、動きのあるページがすぐに作れます。

まずは今あるページの中で、「ここにちょっとした開閉ボタンがあったら便利だな」と感じる場所を1つ見つけて、この記事のコードをそのまま貼り付けて試してみてください。想像していたより簡単に動くその感覚が、Alpine.jsの一番の魅力だと思います。

このブログを検索