世界を動かす技術を、日本語で。

HTMXをGoでどのように使うか

2026年7月15日原文(alexedwards.net)

概要

  • HTMXGo を組み合わせたWebアプリ開発手法の紹介
  • HTMLテンプレート構成部分・全体HTMLレスポンス の返却パターン解説
  • リダイレクトやエラー処理、HTMXの標準設定にも言及
  • Goのhtml/templateファイル埋め込み の活用方法
  • 小規模アプリ 構築を通じて具体例を提示

GoとHTMXによるインタラクティブWebアプリ開発

  • HTMX は最小限のJavaScriptで、アプリのような滑らかなインタラクションを実現
  • サーバーサイドHTMLレンダリング の一貫性と安全性を維持
  • Goのhtml/templateパッケージ との相性が良い
  • HTMLテンプレートの構造化部分HTML(パーシャル)・全体HTML の返却パターンを採用
  • リダイレクトやエラー処理 もHTMX利用時に工夫が必要
  • HTMXの標準設定 (CDNではなく静的ファイルとして配布)を推奨
  • Bamboo(CSSフレームワーク)Gopher画像 も静的アセットに追加

プロジェクト構成

  • ディレクトリ構成
    • assets/static/css, img, js:静的ファイル格納
    • assets/html/pages, partials:HTMLテンプレート格納
    • cmd/web:Goのエントリポイントやハンドラ
  • HTMLテンプレート
    • base.tmpl:全ページ共通のレイアウト
    • pages/home.tmpl:個別ページの内容
    • partials/images.tmpl:再利用可能なパーシャル

HTMXの導入と静的アセット管理

  • HTMX/Bamboo/Gopher画像 を静的ディレクトリにダウンロード
  • 静的ファイルサーバ で配信
  • <script defer> 属性でHTMXを読み込み、DOM構築後に実行
  • HTMLテンプレートは必ず{{define}}で名前定義
  • パーシャルテンプレート は再利用性向上に有効

Goによるファイル埋め込みとテンプレートレンダリング

  • Go 1.16以降のembedパッケージ で静的ファイル・テンプレートをバイナリに埋め込み
  • HTMLFiles/StaticFiles として分離管理
  • htmlRenderer型 の導入
    • 初期化時に共有テンプレートをパース
    • 必要に応じて追加テンプレートをパースし、指定テンプレートをHTTPレスポンスとして返却
  • カスタムテンプレート関数 (例:now)も利用可能

アプリケーション初期化とルーティング

  • application構造体 にloggerとhtmlRendererを保持
  • main.go でhtmlRendererを初期化し、ベーステンプレートとパーシャルをパース
  • 静的ファイルサーバ/(ホーム)ハンドラ を登録
  • handlers.go でhomeハンドラを実装し、baseテンプレート+ページテンプレートをレンダリング

HTMXによるインタラクションの例

  • home.tmpl のボタンに
    • hx-get="/gopher"
    • hx-swap="outerHTML"
  • クリック時 にHTMXが/gopherへGETリクエストを送信し、レスポンスHTMLでボタンを置換
  • パーシャルテンプレート (partial:image:gopher)で画像表示

埋め込みとテンプレート管理のメリット

  • 静的ファイルとHTMLテンプレートの明確な分離
  • ファイルパスの簡素化 (パスプレフィックス不要)
  • 再利用性・保守性の向上

まとめ

  • HTMXとGo の組み合わせで、 サーバーサイドHTMLレンダリング を最大限活かしたインタラクティブWebアプリ開発が可能
  • テンプレート構造の工夫ファイル埋め込み により、効率的かつ安全な運用が実現
  • HTMXの部分更新Goの型安全なテンプレート管理 が大きな強み
  • 小規模から中規模アプリ まで、同様のパターンで拡張可能

Hackerたちの意見

最近のプロジェクトでHTMXを使ってみたんだけど、めっちゃ楽しかった!AngularJSやReactが出る前のWebの仕組みを知ってるから、実際のページを作れて、必要なJSの量を減らせるのがすごくありがたい。バニラJSでも問題ないけど、HTMXは繰り返し同じイベントハンドラーのために作らなきゃいけないボイラープレートをかなり省いてくれるんだよね。もし興味があって、「モダンフロントエンド」哲学にあまり魅力を感じてないなら、HTMXを試してみることをおすすめするよ。HTMXサイトの最初の例は本当に基本的だけど、もう少し学ぶともっとパワフルになるよ。

もし興味があって、「モダンフロントエンド」哲学にあまり魅力を感じてないなら、私も慎重にsveltekitについて言及するつもり。外から見ると、また別のJSフロントエンドフレームワークに見えるけど、最近使わざるを得なくなって、実際にはHTMXやその仲間たちが提唱するハイパーテキスト中心のデザイン哲学に対する素晴らしいサポートがあることを学んだ。

GoとHTMXの組み合わせが大好き!テンプレートやコンポーネント、パーシャルの型安全性を高めるために、a-h/templと一緒に使ってる。自分のツールキットも共有したよ[1]、これを「GUSスタック」って呼んでるんだ。Go、Unix、SQLiteの組み合わせで、exe.devの「GUTS」スタック[2]から大きな影響を受けてるけど、Typescriptの代わりにHTMXを使ってる。キットには他にもGoのコンポーネントがいくつか入ってるよ… - cockroachdb/errors(スタックトレース付きのエラー用) - templ(型安全なHTMLテンプレート用、反応性のためにhtmxとCSS用にtailwindcssを使用) - fuego(Webハンドラーから生成されたOpenAPI仕様) - sqlc(SQLから生成された型安全なコード) - modernc.org/sqlite(純粋なGoのsqliteライブラリ) - goose(SQLとGoのマイグレーション用) - dbos(SQLiteでの耐久性のあるワークフロー用) - rod(Chrome / CDPのテストと自動化用)このスタックでコーディングするのがすごく生産的で、エージェンティックなコーディングができて、バイナリを構築・デプロイするのが楽しい!

HUGSスタックに改名するのもいいかもね -- HTMX(またはハイパーテキスト)、Unix、Go、SQLite。

templを使おうとしたけど、使い勝手が悪くてイライラした。あの時点では、むしろReactを使った方がマシだと思った(Reactは嫌いだけど)。基本的な標準テンプレートにHTMXをちょっと加えるだけで、私のニーズには十分だね。

これをGoTHスタック、つまりGo Templ Htmxって呼んでるよ。そこにsqlcを加えればGoTHsかGHosTスタックになる。これの組み合わせが大好きで、「go generate ./...」をビルドステップに取り入れると、すごく便利になるよ。sqlcモデルとテンプレートオブジェクト、戻り値の間を変換するためにgoverterも追加してる。ボイラープレートの50%が生成されるから、型安全性がすごく良くなるんだ。

最近、タイプセーフなSQLのためにjet[1]がすごく気に入ってる。コードを生成するのにライブDBが必要だけど、それもポジティブだと思ってる。コードを書く前にマイグレーションを適用しなきゃいけないからね。[1] https://github.com/go-jet/jet

hyperscript[1]がHTMXの話をする時にもっと評価されてほしいなって少し悲しい。hyperscriptはGo + HTMXスタックにぴったりで、サーバーとの往復なしでDOM操作ができるんだ。こういう宣言型プログラミングが好きな人は少ないのは分かるけど、すでにHTMLファイルがある時には、hyperscriptはそれの延長みたいに感じる。複数の決済ゲートウェイを扱うOpen Payment Host[2]に取り組んでいて、hyperscriptだけで複雑なDOM操作ができたよ。[1] https://hyperscript.org/ [2] https://openpaymenthost.com/

アレックス・エドワーズが大好き!彼の本や「Learn Go with Tests」は、私がこの言語に初めて触れたきっかけだった。今でもおすすめだよ。古いものをHTMXに変換したくなってきた。

アレックス・エドワーズのファン、賛成!Web開発のためにGoを学ぼうとしている人は、ぜひ「Let's Go」と「Let's Go Further」を手に取ってみて。プログラミング言語の入門書としては、すごくアプローチしやすくて、楽しくて、実用的だと思う。

自分用にKotlin + HTMXを使ったフレームワークを書いたよ - https://github.com/reubenfirmin/zoned。目標は、完全に型付けされたウェブアプリを作れるか試すことだった。Kotlinx.htmlを使ってて、HTMLを書くためのjsxっぽいDSLを提供してる。最初の90%は手作業でやって、残りの10%(とREADME)はClaudeを使って仕上げた。とにかく出したかったんだ。

GoもAlexも大好きなんだけど、HTMXとの経験はいつも残念な結果になっちゃうんだよね。言い換えると、HTMXを使ってると、コードベースの複雑さがアプリ自体の2倍の速さで増えていく感じがする。いつも変なエッジケースにハマって、変なハックなしには抜け出せないんだ。Nodeパッケージが嫌われる理由は分かるけど、HTMXはそれに対する過剰な反応みたいに感じる。でも、JSONと格闘しなくて済む分、アプリを実際に見た目や使い心地を良くするのにかかる時間は3倍になるよ。Mantineのテンプレートを組み合わせるのに2分もかからないし、最高のUIコンポーネントを使えるから、ビルドした静的アセットを埋め込んで、同じGoのバイナリが得られるんだ。[1] https://github.com/mantinedev/vite-min-template

Hacker Newsで議論の続きを見る