HTMX連携
必要な依存関係: io.ktor:ktor-htmx
, io.ktor:ktor-htmx-html
, io.ktor:ktor-server-htmx
コード例: htmx-integration
HTMXは、HTML属性を使用して動的なクライアントサイドの動作を可能にする軽量なJavaScriptライブラリです。JavaScriptを記述することなく、AJAX、CSSトランジション、WebSocket、Server-Sent Eventsなどの機能をサポートします。
Ktorは、サーバーとクライアントの両方のコンテキストでの連携を簡素化する一連の共有モジュールを通じて、HTMXに対する実験的なファーストクラスのサポートを提供します。これらのモジュールは、HTMXヘッダーの操作、Kotlin DSLを使用したHTML属性の定義、およびサーバー上でのHTMX固有のルーティングロジックの処理のためのツールを提供します。
モジュール概要
KtorのHTMXサポートは、以下の3つの実験的モジュールで利用可能です。
モジュール | 説明 |
---|---|
ktor-htmx | コア定義とヘッダー定数 |
ktor-htmx-html | Kotlin HTML DSLとの連携 |
ktor-server-htmx | HTMX固有のリクエストに対するルーティングサポート |
すべてのAPIは@ExperimentalKtorApi
でマークされており、@OptIn(ExperimentalKtorApi::class)
を介したオプトインが必要です。
HTMXヘッダー
コアモジュールktor-htmx
の事前定義された定数を使用して、HTMXヘッダーに型安全な方法でアクセスまたは設定できます。これらの定数により、トリガー、履歴の復元、コンテンツのスワッピングといったHTMXの動作を検出する際に、マジック文字列の使用を避けることができます。
リクエストヘッダー
アプリケーションでHTMXリクエストヘッダーを読み取ったり照合したりするには、HxRequestHeaders
オブジェクトを使用します。
true
レスポンスヘッダー
HTMXレスポンスヘッダーの定数にアクセスするには、HxResponseHeaders
オブジェクトを使用できます。
スワップモード
コアモジュールktor-htmx
のHxSwap
オブジェクトを使用して、異なるHTMXスワップモードの定数にアクセスできます。
HTML DSL拡張機能
ktor-htmx-html
モジュールは、KotlinのHTML DSLに拡張機能を追加し、HTMX属性をHTML要素に直接追加できるようにします。
@OptIn(ExperimentalKtorApi::class)
html {
body {
button {
attributes.hx {
get = "/data"
target = "#result"
swap = HxSwap.outerHtml
trigger = "click"
}
+"Load Data"
}
}
}
上記の例は、HTMX属性を持つHTMLを生成します。
<button hx-get="/api/data" hx-target="#result-div" hx-swap="outerHTML" hx-trigger="click">Load Data</button>
サーバーサイドルーティング
ktor-server-htmx
モジュールは、hx
DSLブロックを介してHTMX対応ルーティングを提供します。
@OptIn(ExperimentalKtorApi::class)
routing {
route("api") {
// Regular route (both HTMX and non-HTMX requests)
get {
call.respondText("Regular response")
}
// Only matches HTMX requests (HX-Request header is present)
hx.get {
call.respondText("HTMX response")
}
// Matches HTMX requests with specific target
hx {
target("#result-div") {
get {
call.respondText("Response for #result-div")
}
}
// Matches HTMX requests with specific trigger
trigger("#load-button") {
get {
call.respondText("Response for #load-button clicks")
}
}
}
}
}
これらの機能により、アプリケーションはクライアントから送信されるHTMXヘッダーに応じて異なる応答をすることができます。