ハイパーメディア駆動型アプリケーション

カーソン・グロス

#Genesis(創世記)

テーゼ:MPA - マルチページアプリケーション

アンチテーゼ:SPA - シングルページアプリケーション

ジンテーゼ:HDA - ハイパーメディア駆動型アプリケーション

--@htmx_org

#ハイパーメディア駆動型アプリケーションアーキテクチャ

ハイパーメディア駆動型アプリケーション(HDA)アーキテクチャは、ウェブアプリケーション構築における新旧融合のアプローチです。従来のマルチページアプリケーション(MPA)のシンプルさと柔軟性と、シングルページアプリケーション(SPA)の優れたユーザーエクスペリエンスを兼ね備えています。

HDAアーキテクチャは、ウェブの既存のHTMLインフラストラクチャを拡張することにより、ハイパーメディア開発者がより強力なハイパーメディア駆動型インタラクションを作成できるようにします。

アーキテクチャ上のRESTの概念に従い制約、2つの制約がHDAアーキテクチャを特徴づけます。

これらの2つの制約を採用することにより、HDAアーキテクチャは、SPAアーキテクチャとは異なり、ウェブの元のRESTfulアーキテクチャにとどまります。

特に、HDAはHypermedia As The Engine of Application State (HATEOAS)を引き続き使用しますが、ほとんどのSPAはクライアント側のモデルとデータ(ハイパーメディアではなく)APIを優先してHATEOASを放棄します。

#HDAフラグメントの例

htmxのアクティブサーチの例を考えてみましょう。

<h3> 
  Search Contacts 
  <span class="htmx-indicator"> 
    <img src="/img/bars.svg"/> Searching... 
   </span> 
</h3>
<input class="form-control" type="search" 
       name="search" placeholder="Begin Typing To Search Users..." 
       hx-post="/search" 
       hx-trigger="keyup changed delay:500ms, search" 
       hx-target="#search-results" 
       hx-indicator=".htmx-indicator">

<table class="table">
    <thead>
    <tr>
      <th>First Name</th>
      <th>Last Name</th>
      <th>Email</th>
    </tr>
    </thead>
    <tbody id="search-results">
    </tbody>
</table>

これは、通常SPAに関連付けられるUXパターンです。ユーザーが入力すると、わずかな遅延の後、検索結果が下の結果テーブルに表示されます。しかし、この場合、HTML内で完全に、HTMLに沿った方法で実現されています。

この例は、HDAの本質的な特性を効果的に示しています。

#HDAにおけるスクリプト

Code-On-Demandは、ウェブの元のRESTfulアーキテクチャのオプションの制約です。

同様に、HDAアーキテクチャには、最終的なオプションの制約があります。

これは、ロイ・フィールディングが彼の論文で言及しているCode-On-Demandに関する懸念事項に対処しています。

しかし、(Code-On-Demand)は可視性を低下させるため、REST内ではオプションの制約に過ぎません。

Code-On-Demand(スクリプト)をHTMLに直接埋め込むことで、可視性が向上し、Locality of Behaviorソフトウェア設計原則を満たします。

この3番目の制約を満たすスクリプトへの3つのアプローチは、hyperscriptAlpineJS、およびVanillaJS(HTML要素に直接埋め込まれている場合)です。

これらのアプローチのそれぞれの例を以下に示します。

<!-- hyperscript -->
<button _="on click toggle .red-border">
  Toggle Class
</button>

<!-- Alpine JS -->
<button @click="open = !open" :class="{'red-border' : open, '' : !open}">
  Toggle Class
</button>

<!-- VanillaJS -->
<button onclick="this.classList.toggle('red-border')">
  Toggle Class
</button>

HDAでは、ハイパーメディア(HTML)がアプリケーション構築の主要な媒体であるため、

スクリプトは既存のハイパーメディア(HTML)を拡張しますが、置き換えるわけではなく、HDAの基本的なRESTfulアーキテクチャを破壊しません。

#HDAスタイルのライブラリ

次のライブラリを使用すると、開発者はHDAを作成できます。

適切に使用した場合、次のスクリプトライブラリはHDAアプローチを補完します。

#結論

HDAアーキテクチャは、先行する2つのアーキテクチャ、元のマルチページアプリケーション(MPA)アーキテクチャと(比較的)新しいシングルページアプリケーションアーキテクチャの統合です。

これは、MPAsのシンプルさと信頼性、RESTfulアーキテクチャHypermedia As The Engine Of Application Stateを使用し、多くの場合、SPAと同等の優れたユーザーエクスペリエンスを提供することを目指しています。

</>