本文へスキップ
totonoe.tech

フレームワークを整える

初級

htmx を整える。

= HTML に属性を足すだけで動く htmx を、サーバーの代わりに JSON で応答するモックで確かめる練習場

htmx が初めての方は、先に そもそも htmx とは・どんな場面で使うか をどうぞ。

サンプルコード(クリックでエディタに挿入)

「サーバー応答」は { "パス": "HTML" } の形の JSON です。キーの先頭に GET␣ / POST␣ を付けるとメソッドを区別できます(無ければ GET)。

PREVIEW

「▶ 実行」を押すと、ここに結果が表示されます。

コンソール

console.log の出力とエラーがここに出ます。

応答は150ミリ秒ほど待ってから返ります(本物の通信のように、hx-indicator の表示を確認できます)。無限ループなど重い処理を書くと、プレビューが固まることがあります。「■ 停止」でプレビューを作り直せます。

そもそも htmx とは

JavaScript をほとんど書かず、HTML の属性だけで画面の一部を入れ替える道具。

htmx は、HTML の要素に hx-get や hx-post といった属性を付けるだけで、サーバーと通信して画面の一部だけを差し替えることができる、小さな JavaScript ライブラリです。自分で通信のコードを書く必要はほとんどありません。

React や Vue のように、サーバーから受け取ったデータをブラウザ側で組み立てる方式とは違い、サーバーが完成した HTML の断片を返し、htmx がそれを指定の場所に差し込みます。特定の言語に依存しないので、Python・Ruby・PHP・Go など、HTML を返せるサーバーなら組み合わせられます。

どこで・どんな場面で使うか

  • 検索・絞り込みの部分更新

    入力に合わせて、一覧の部分だけを書き換える画面を、少ないコードで作れます。

  • フォーム送信後の結果表示

    ページ全体を読み込み直さずに、送信結果や入力エラーをその場に表示できます。

  • もっと見る・無限スクロール

    続きの一覧を、あとから読み込んで末尾に足していく動きに使われます。

  • 既存のサーバー側アプリに動きを足す

    Django や Rails などで作った画面に、大きな作り直しなしで少しずつ動きを足したいときに向きます。

  • 管理画面・社内ツール

    画面の動きは必要だが、フロントエンドを別に作り込みたくない場面で選ばれます。

向いている場面・向いていない場面

  • 向いている:サーバー側で HTML を作る構成の画面に、ちょっとした動きを足したいとき。
  • 向いている:フロントエンド専用の仕組みを持たず、画面とサーバーのコードを近い場所に置きたいとき。
  • 注意:画面の状態が複雑に絡み合うアプリや、オフラインでも動かしたい画面には、ブラウザ側で状態を管理する道具のほうが合います。

上のプレイグラウンドで、属性を書き換えて、ボタンを押したときに画面のどこが差し替わるかを試してみてください。

htmx の考え方 — サーバーは「HTML」を返す

React や Vue はサーバーから JSON を受け取り、ブラウザ側でHTMLを組み立てます。htmx はその逆で、サーバー(このページではモック)が最初から完成した HTML の断片を返し、htmx はそれを指定された場所に差し込むだけです。

  • ①

    hx-get / hx-post — どこへ通信するか

    属性1つで通信が発生します。hx-post を書いたフォームは、送信のたびにページ全体を再読み込みしません。

  • ②

    hx-trigger — いつ通信するか

    既定は要素ごとの自然なイベント(ボタンは click、フォームは submit)ですが、hx-trigger で load(読み込み時)・every 2s(定期)・keyup changed(値が変わって離れたとき)に変更できます。

  • ③

    hx-target / hx-swap — どこを・どう差し替えるか

    hx-target が対象の要素、hx-swap が差し替え方(innerHTML/outerHTML/beforeend 等)を決めます。JavaScript の DOM 操作を自分で書く必要がありません。

  • ④

    状態はどこにある? — サーバー(この練習場ではJSON)

    React の useState のような「JavaScript 側の状態」は基本的に持ちません。次に何が表示されるかは、サーバーが返す HTML そのものが決めます。

向いている場面/向かない場面

◎ 向いている場面

  • ・サーバー側テンプレート(Django・Rails・PHP 等)で作った既存ページに、部分更新の動きだけを足したいとき
  • ・フロントエンドのビルド環境(バンドラ・状態管理)を増やしたくないとき
  • ・ページの大部分が静的で、一部だけ非同期に差し替えたいとき

△ 向かない場面

  • ・画面側だけで完結する複雑な状態(多段階のフォーム、取り消し可能な編集等)を持ちたいとき
  • ・サーバーからの応答が JSON API 前提で、HTML を返す設計に変更しにくいとき
  • ・オフラインでも動くアプリなど、通信そのものを減らしたいとき

React・Vue との違い(事実だけ)

どちらが優れているかではなく、責任の置き場所が違います。

観点 htmx React / Vue
サーバーが返すもの HTML の断片 多くは JSON(画面の組み立てはブラウザ側)
画面の状態 サーバー(または現在の DOM)が持つ JavaScript の変数(useState 等)が持つ
書き方 既存の HTML に hx-* 属性を足す コンポーネント(JSX・SFC 等)を新しく書く
ビルド環境 script タグ1本で使い始められる 多くはバンドラ(Vite 等)を使う

このページについて

ここで動くのは本物の htmx(2.0.4)です。サーバーの代わりに、htmx を読み込む前に window.XMLHttpRequest を差し替えたモックが、「サーバー応答」欄の JSON を読んで返答します。

ルート表に無いパスを叩くと 404 Not Found(見つかりません)、ルート表の JSON が壊れていると 500 Internal Server Error(サーバ内部エラー) が返ります。番号の意味はHTTPステータスコードを整えるで引けます(番号をクリックしても飛べます)。

🌐 ライブラリは cdn.jsdelivr.net から読み込みます。書いたコードと実行結果は端末内で完結し、外部へ送信しません(送信ゼロ)。 プレビューはサンドボックス化した iframe で、このページや端末のデータには触れません。

このツールについて

htmx は、HTML の属性(hx-get・hx-post 等)だけでサーバーと通信し、返ってきた HTML の断片で画面の一部を差し替える考え方です。ここではサーバーの代わりに、あなたが書いた JSON がその場で「応答」します。

HTML の属性(hx-get・hx-post など)だけでサーバー通信の動きを体験できる練習場。サーバーの代わりに自分で書いた JSON が応答します。

主な機能

  • 4課題(hx-get/hx-post とフォーム/hx-trigger/hx-target と hx-swap)
  • サーバー不要。「サーバー応答」欄の JSON を読むモックが応答(POST の項目をプレースホルダで差し込める)
  • HTML・サーバー応答・CSS の3タブとプレビュー
  • htmx.org 2.0.4 を配信元から読み込み・送信ゼロ

よくある質問

Q. htmx はサーバーが無くても動きますか?

A. このページでは、サーバーの代わりに「サーバー応答」欄に書いた JSON(パス→HTML)を読むモックが応答します。実際のアプリでは、サーバー側(Django・Rails・PHP など)が HTML の断片を返します。

Q. サーバー応答の JSON はどう書けばいいですか?

A. { "パス": "HTML" } の形が基本です。GET 以外を区別するときはキーの先頭に "POST " のようにメソッド名を付けます。POST の本文(フォームの各項目)は、項目名を二重の波括弧で囲んだプレースホルダ(name など)で応答に差し込めます。

Q. React や Vue と何が違いますか?

A. React や Vue は多くの場合サーバーから JSON を受け取り、ブラウザ側で HTML を組み立てます。htmx は逆に、サーバーが完成した HTML の断片を返し、htmx はそれを指定した場所に差し込みます。JavaScript の状態管理は基本的に持ちません。

入力値はURLの「#」以降に入るためサーバーには送信されません。リンクを開くと同じ状態を復元します。

続けて整える

運営サイト

私たちが運営するサイト