HTML Over The Wireは、Ruby on Railsのフレームワーク内で導入された新しいアーキテクチャの一部であり、クライアント側でJavaScriptをほとんど使わずに、サーバー側で生成されたHTMLを直接クライアントに送信する手法です。このアーキテクチャは、RailsのHotwireというツールセットによってサポートされており、具体的にはTurboStimulusという二つの主要なコンポーネントが中心となっています。

このアーキテクチャは、クライアント側で重いJavaScriptの処理を避けつつ、リアルタイムでインタラクティブなUIを提供することを目的としています。これにより、ページ全体をリロードせずに、必要な部分のみを効率的に更新できるようになります。

Hotwireの概要

編集

Hotwireは、RailsアプリケーションにおけるインタラクティブなUIを構築するためのツールセットです。Hotwireは、以下の二つの重要なライブラリを組み合わせて使用します。

  • Turbo: サーバー側でHTMLを生成し、ページの一部を動的に更新するためのライブラリ。
  • Stimulus: クライアント側で必要最低限のJavaScriptを使ってインタラクションを管理するライブラリ。

これらのツールは、従来のクライアントサイドJavaScriptフレームワーク(ReactやVue.jsなど)の重さを軽減し、よりシンプルな方法で動的なWebアプリケーションを実現します。

TurboによるHTML Over The Wireの実現

編集

Turboは、RailsにおけるHTML Over The Wireの中心的な役割を担っています。Turboは、サーバーサイドでレンダリングされたHTMLをクライアントに送り、ページの更新が必要な部分のみを再描画します。この仕組みにより、クライアントサイドでのJavaScriptの重い処理を避け、効率的にページを更新することができます。

Turboの主な機能

編集
  • Turbo Drive: 従来のリンクやフォーム送信をリモート操作で処理します。ユーザーがページ遷移する際に、ページ全体をリロードすることなく、新しいコンテンツを非同期で読み込みます。これにより、ページ遷移がスムーズになり、ユーザー体験が向上します。 例えば、リンクをクリックした際に以下のように処理されます:
    <a href="/posts/1" data-turbo-action="replace">Go to Post</a>
    
    Turbo Driveが有効になっていると、このリンクをクリックすることで、ページ全体をリロードすることなく、新しいポストの内容だけを更新します。
  • Turbo Frames: 特定のページ部分をターゲットとして、HTMLを差し替えることができます。これにより、ページ全体を更新するのではなく、必要な部分だけを更新することができます。例えば、コメントセクションのみを更新する場合などです。
    <turbo-frame id="comments">
      <%= render @comments %>
    </turbo-frame>
    
    上記のコードでは、comments部分が更新されますが、他の部分はそのままとなり、必要最小限の更新が行われます。
  • Turbo Streams: サーバー側から送られるリアルタイムのHTML更新を処理します。サーバーからTurbo Streamメッセージが送信されると、対応する部分のHTMLを即座に更新します。これにより、ユーザーがページをリロードすることなく、他のユーザーのアクション(コメント投稿やメッセージ送信など)をリアルタイムで反映させることができます。 例として、コメントが追加された際に、それをリアルタイムで表示するコードは次のようになります:
    <turbo-stream target="comments" action="append">
      <template>
        <%= render @comment %>
      </template>
    </turbo-stream>
    
    サーバー側で新しいコメントを生成し、Turbo Streamがそのコメントをページに追加します。

Stimulusによるインタラクションの補完

編集

Stimulusは、Turboと連携して動作する軽量なJavaScriptフレームワークです。Stimulusは、DOMの変更に反応するためのコントローラーを提供し、ページの特定の部分に対してインタラクションを追加します。TurboがHTMLの差し替えや更新を行う一方、StimulusはUIコンポーネントに対するインタラクション(クリックイベントやフォームの送信など)を管理します。

例えば、Turboによって動的に更新された部分に対して、Stimulusを使ってインタラクションを追加することができます:

<div data-controller="counter">
  <button data-action="click->counter#increment">Increment</button>
  <p data-target="counter.output">0</p>
</div>

ここでは、counterというStimulusコントローラーが、ボタンをクリックするとカウンターをインクリメントする動作を提供します。これにより、ページが更新されるたびに、動的な操作を簡単に追加できます。

HTML Over The Wireの利点

編集
  • パフォーマンスの向上: ページ全体をリロードすることなく、必要な部分だけを更新できるため、アプリケーションのパフォーマンスが向上します。特に大規模なWebアプリケーションでは、リソースの無駄を省けます。
  • シンプルな開発: JavaScriptを大量に書くことなく、サーバーサイドで処理されたHTMLを直接クライアントに送ることで、開発の負担が軽減されます。特に、ReactやVueのようなクライアントサイドフレームワークを使わなくても、インタラクティブなアプリケーションを構築できます。
  • リアルタイムのUI更新: Turbo Streamsを利用することで、サーバー側からリアルタイムにUIを更新することができ、例えばチャットアプリやリアルタイム通知などの機能が簡単に実現できます。

結論

編集

HTML Over The Wireは、Ruby on Railsにおいて、サーバーサイドで生成されたHTMLを直接クライアントに送信し、ページの一部を動的に更新するアーキテクチャを提供します。TurboとStimulusという強力なツールセットを活用することで、インタラクティブでパフォーマンスに優れたWebアプリケーションを簡単に構築することができます。このアプローチは、フロントエンドの複雑さを排除し、サーバーサイドの処理に集中することで、開発効率とセキュリティの向上に寄与します。

附録

編集

HTML Over The Wireと仮想DOM

編集

HTML Over The Wire仮想DOM(Virtual DOM)は、どちらも動的なユーザーインターフェース(UI)の更新に関係していますが、それぞれのアプローチと背後にある考え方には大きな違いがあります。以下で、それぞれの違いを説明します。

仮想DOM(Virtual DOM)とは

編集

仮想DOMは、主にクライアントサイドJavaScriptフレームワーク(例えば、React)で使用される概念です。仮想DOMは、実際のDOM(Document Object Model)の軽量なコピーです。この仮想DOMを使うことで、WebページのUIの変更を効率的に管理できます。

仮想DOMの仕組みは次のようになります:

  • 状態変更: アプリケーションの状態(データ)が変更されると、仮想DOM内で変更が行われます。
  • 差分計算: 仮想DOMと実際のDOMとの違い(差分)を計算し、どの部分を更新するべきかを決定します。
  • DOM更新: 計算された差分を基に、実際のDOMを最小限に更新します。これにより、DOMの直接操作を避け、パフォーマンスを向上させます。

仮想DOMの特徴:

  • クライアントサイドでの変更を管理する。
  • 状態が変わるたびに仮想DOMを再計算し、最適化された差分だけを実際のDOMに適用する。
  • 複雑なUIや状態管理を効率的に扱うことができるが、これにはJavaScriptの計算と再レンダリングが関与します。

HTML Over The Wire とは

編集

HTML Over The Wireは、主に**サーバーサイドレンダリング(SSR)**の手法に基づくアプローチです。このアーキテクチャでは、クライアントサイドでの状態管理やJavaScriptの多用を避け、代わりにサーバー側でHTMLを生成し、それをクライアントに送信してUIを更新します。

HTML Over The Wireの仕組み:

  • サーバーサイドレンダリング: サーバーがクライアントからのリクエストに基づいて、必要なHTMLを動的に生成します。これをクライアントに送信します。
  • 部分的な更新: TurboやStimulusなどのツールを使って、ページの一部を必要に応じて動的に更新します。サーバーがHTMLの差分を送ることで、クライアントでJavaScriptを多用せずにページの内容を更新できます。

HTML Over The Wireの特徴:

  • クライアントサイドのJavaScriptの利用を最小限に抑える。
  • サーバーがHTMLを生成して送り、クライアントでの処理は基本的に最小限にとどめる。
  • 主にページの一部を更新することで、パフォーマンスを向上させる。
  • JavaScriptフレームワーク(ReactやVue)と違い、サーバーがUIの状態を管理します。

仮想DOMとHTML Over The Wireの違い

編集
  • 更新の方法:
    • 仮想DOMでは、アプリケーションの状態が変わるたびに、仮想DOMを更新し、その差分を計算して実際のDOMに適用します。UI更新はクライアントサイドで行われます。
    • HTML Over The Wireでは、サーバーサイドがHTMLを生成してクライアントに送信します。クライアント側でHTMLを差し替えたり、部分的に更新することで、UIが更新されます。JavaScriptは最小限であり、主にTurboやStimulusが利用されます。
  • クライアントサイドとサーバーサイドの役割:
    • 仮想DOMは、クライアントサイドでアプリケーションの状態を管理し、UIの更新を効率化します。JavaScriptを多用し、クライアントサイドのロジックが中心です。
    • HTML Over The Wireは、サーバーサイドがHTMLを動的に生成し、クライアント側でそのHTMLを差し替えることでUIを更新します。クライアント側のロジックは少なく、主にHTMLの差し替えが行われます。
  • パフォーマンスのアプローチ:
    • 仮想DOMでは、クライアントサイドで仮想DOMの再計算や差分更新を行うため、ブラウザ側のリソースを利用します。
    • HTML Over The Wireでは、サーバーがレンダリングを担当し、クライアントでの作業は最小限に抑えられます。これにより、サーバーサイドが負担を持つ反面、クライアント側でのパフォーマンス負担が減ります。

結論

編集
  • 仮想DOMは、クライアントサイドでJavaScriptを利用してUIを動的に更新するための手法です。Reactなどのフレームワークでは、仮想DOMを用いてDOMの更新を最適化します。
  • HTML Over The Wireは、サーバーサイドでHTMLを生成し、クライアントに送信してUIを更新する手法です。RailsのTurboなどのツールを使って、HTMLの差し替えや部分的な更新を行います。

両者の大きな違いは、更新が行われる場所と、JavaScriptをどれだけ使用するかという点です。仮想DOMは主にクライアントサイドで動作しますが、HTML Over The Wireはサーバーサイドが主導でHTMLを生成し、クライアントでそのまま差し替える形で動的なUIを提供します。