コンテンツにスキップ

002. JavaScript依存の最小化(Minimizing JavaScript Dependency)

原理:なぜ「JSを書かない」ことが正義なのか

「便利すぎるJS」が招いた複雑さの迷宮

モダンなWeb開発において、JavaScript(JS)はもはや不可欠な存在です。しかし、皮肉なことに、JSが進化しすぎたせいで、Web開発は以前よりも「難しく、壊れやすく」なってしまいました。

ReactやVue、Next.jsといった強力なフレームワークは、確かに素晴らしいユーザー体験を実現しますが、一方で「ビルドの手間」「膨大なライブラリの管理」「複雑な状態管理(State Management)」といった、初心者には耐え難いコストを要求します。 多くの開発者は、「ボタン一つを動かすために、なぜ数千行のJSコードと、何百個もの設定ファイルが必要なのか?」という疑問を抱えながら、日々の開発を行っています。

HTMXが提唱する「制約」の美学

HTMXの「JS依存の最小化」という原理は、怠慢から生まれたものではありません。それは、「ブラウザの標準機能を最大限に活用し、アプリケーションの複雑さをサーバー側に集約させる」という高度な戦略に基づいています。

JSプログラミングは、しばしば「命令的(Imperative)」です。 「この要素を捕まえて、この値をチェックして、もしこうなら色を変えて……」と、コンピュータに事細かな手順を命令しなければなりません。この手順が複雑になればなるほど、バグが入り込む隙間が生まれます。

対して、HTMXは「宣言的(Declarative)」です。 HTMLの中に「こうなってほしい」という結果だけを書きます。実際の手続き(イベント監視、通信、DOM更新)は、HTMXという信頼できるエンジンが肩代わりします。これにより、開発者は「手順の迷路」から抜け出し、「何を作るか」という本質的な喜びに戻ることができるのです。


実践:JSのロジックをHTML属性に置き換える

1. イベントリスナーを捨てる

通常、クリックやキー入力を検知するにはJSの addEventListener が必要ですが、HTMXでは hx-trigger がその役割を果たします。

<!-- JS不要:クリックしたら即座に更新 -->
<button hx-get="/update-content" hx-trigger="click">
  更新ボタン
</button>

<!-- JS不要:マウスを乗せた時だけ情報を取る -->
<div hx-get="/tool-tip" hx-trigger="mouseenter">
  ここにマウスを置くと詳細が出ます
</div>

2. 非同期通信(Ajax)の定型文を捨てる

fetchaxios を使った非同期処理は、成功時と失敗時の処理、JSONの変換など、書かなければならない「お決まりのコード」が非常に多いです。HTMXはこれを属性1つに凝縮します。

<!-- 通信、エラー処理、画面反映。これらすべてがこの一行に。 -->
<div hx-get="/api/status" hx-trigger="load, every 30s">
  サーバーの稼働状況を確認中...
</div>
ここでは、「ページ読み込み時」と「30秒ごと」という複雑なタイミングの制御すら、JSを一文字も書かずに完結させています。

3. DOM操作の「手順」を捨てる

「サーバーからデータが届いたら、特定の要素のクラスを付け替え、中身を書き換える」という操作は、HTMXの hx-targethx-swap が自動で行います。

<!-- フォーム送信後、特定のリストだけを更新する例 -->
<form hx-post="/add-todo" hx-target="#todo-list" hx-swap="beforeend">
  <input name="task" type="text" placeholder="新しいタスク...">
  <button>追加</button>
</form>

<ul id="todo-list">
  <!-- ここに新しい <li> が自動で追加されます -->
</ul>

【コラム】JSが必要な時はいつ?

HTMXは「JSを絶滅させる」ためのツールではありません。 「ドラッグ&ドロップの複雑なアニメーション」や「ローカルでの高度な計算」など、ブラウザ側でしかできない処理には依然としてJSが最適です。HTMXの目的は、「通信や画面更新といったWebの基本動作のために、不必要にJSを書きすぎるのを防ぐ」ことにあります。


比較:コードの「重さ」と「読みやすさ」

JavaScriptによる「命令的な」実装

同じ「文字入力ごとの自動検索」をJSで書くと、以下のようになります。

let timeout;
const input = document.getElementById('search-input');
input.addEventListener('keyup', () => {
    clearTimeout(timeout);
    timeout = setTimeout(async () => {
        const query = input.value;
        const res = await fetch(`/search?q=${query}`);
        const html = await res.text();
        document.getElementById('results').innerHTML = html;
    }, 500);
});
タイマーの管理、値の取得、URLの組み立て……。本質的でないコードが多く、一箇所でも書き間違えると動きません。

HTMXによる「宣言的な」実装

<input id="search-input" 
       hx-get="/search" 
       hx-trigger="keyup delay:500ms changed" 
       hx-target="#results">
「何をするか」が英語の羅列のように並んでいるだけです。誰がいつ見ても、この入力欄の挙動を一瞬で理解できます。


まとめ:初心者のための「JS引き算」思考

JSへの依存を減らすことは、単に楽をするためではなく、「持続可能なコード」を書くための知恵です。

  • まずはHTMLで考える: 「これ、HTMXの属性だけでできないかな?」と自問自答してみてください。
  • 脳のメモリを節約する: JSの手順を覚える代わりに、Webのルール(URLとHTTPメソッド)を覚えましょう。
  • デバッグを楽にする: JSが動かない時はコンソールを見て、HTMXが動かない時はネットワークタブ(どんなHTMLが届いているか)を見れば解決します。

JSという「魔法」を使いすぎず、HTMLという「大地」にしっかりと足をつけた開発。これがHTMXが教える、プロフェッショナルへの近道です。次の記事では、この土台の上でいかにサーバーに主導権を握らせるか(003. サーバー主導UI)を探求していきます。