コンテンツにスキップ

108. Optimistic Updates(楽観的更新:成功を「信じて」先に進む、究極の高速化)

原理:未来をハッピーに予測する

サーバーを待たないという勇気

現代のインターネットは速いとはいえ、ボタンを押してからサーバーが「OK」と返してくるまでには、どうしてもわずかな時間がかかります。この「待ち時間」がユーザーの満足度を下げる原因になります。

「楽観的更新(Optimistic Updates)」は、文字通り楽観的(ポジティブ)な考え方です。 「どうせ通信は成功するはずだ!それなら、サーバーからの返事を待たずに、今すぐに画面を『成功した後の見た目』に変えてしまおう」という手法です。

もし万が一失敗したら、その時だけ「ごめん、失敗したから元に戻すね」と謝ればいい……そんな潔い設計が、アプリを圧倒的に「サクサク」と感じさせます。


実践:「即レス」の感動を作る

1. 「いいね!」ボタンの即時点灯

「いいね」を押した瞬間、サーバーに届く前にハートを赤くしてしまう例です。

<!-- 
  hx-on:click: 
  通信が始まる「瞬間」に、JavaScriptで見た目を変えてしまいます。
-->
<button id="like-btn" 
        hx-post="/api/like" 
        hx-on:click="this.classList.add('is-active')">
    <i class="heart-icon"></i>
</button>

2. もし失敗したら?(ロールバック)

通信がエラーになった時は、HTMXのイベント(099.解説)を使って、赤くしたハートを元の色にそっと戻します。

3. ステップ・バイ・ステップ解説

  1. 「成功」の姿をイメージ: 「いいね」なら「赤くなる」、「削除」なら「薄くなる」といった見た目をCSSで作っておきます。
  2. 先行してクラスを付ける: hx-on:click などを使って、通信が完了する前にそのCSSクラスを要素に付加します。
  3. 結果で上書き: 通信が終わればサーバーから「本当の最終結果のHTML」が届くので、それによって画面は整合性のとれた状態に自然と落ち着きます。

比較:慎重な更新 vs 楽観的な更新

慎重な更新(デフォルト)

  • 流れ: クリック → ぐるぐる(待機) → 成功! → 画面変化。
  • 感覚: 「確実だけど、一瞬の間がある」。

楽観的な更新

  • 流れ: クリック → 即座に画面変化 → 裏で通信。
  • 感覚: 「爆速!一瞬も待たされない」。

まとめ:初心者のための「ハッピー」な設計

楽観的更新は、あなたのWebアプリを「ただの良いサイト」から「一流のプロフェッショナルなツール」へと進化させます。

  • 成功率 99% の場所で使う: ほとんど失敗しないことがわかっている「いいね」や「チェックボックス」などに最適です。
  • 「Undo」との合わせ技: この楽観的更新と、後ほど学ぶ Undo(取り消し)機能を組み合わせれば、ユーザーは一瞬の迷いもなく作業を進められるようになります。
  • 視覚のトリック: 実際には通信に1秒かかっていても、画面が1ミリ秒で変われば、ユーザーは「このアプリは神速だ」と信じてくれます。

未来を先取りし、感動を作る。楽観的更新という少し大胆な魔法を使って、通信の壁を感じさせない、最高にダイナミックなユーザー体験を提供してください。次の記事では、操作をさらに自在に操る「取り消し・やり直し(109. Undo/Redo)」をご紹介します。