← На главную

HTMX + Go: рендерим страницы и partials одним шаблонизатором

14.07.2026 19:55 · hackernews

Handling в статье с кавычками, копирую как есть.Handling

Готовый пересказ должен быть сплошным текстом, без заголовков и маркдауна. Единственное форматирование — bold внутри предложения, если нужно выделить. В статье таких случаев нет, поэтому не использую.Автор рассказывает, как использует HTMX вместе с Go. Он строит пример — страницу со списком пользователей и поиском через HTMX.

В основе лежит структура HTML-шаблонов. В assets/html/base.tmpl лежит общий каркас страницы. Там подключаются CSS (Bamboo) и HTMX через <script defer>. Контент для отдельных страниц живёт в папке pages, а переиспользуемые кусочки — в partials. Для рендеринга автор создал тип htmlRenderer. Он при старте парсит базовый шаблон и все partials в общий набор. Метод render() клонирует этот набор, добавляет дополнительные шаблоны, выполняет нужный именованный шаблон и отправляет ответ. Это позволяет одним и тем же кодом отдавать и полную страницу, и частичный ответ (partial) для HTMX.

В примере с поиском пользователей используется два маршрута: GET /users возвращает полную HTML-страницу с таблицей, а GET /users/search — только строки таблицы, которые HTMX подставляет в <tbody> при вводе текста. Проблема в том, что если открыть GET /users/search напрямую, браузер покажет голый partial. Решение — проверять заголовок HX-Request: true. Если запрос от HTMX, отдаётся только users:rows. Если нет — полная страница с теми же данными. На ответ нужно добавить заголовок Vary: HX-Request, чтобы кеши не перепутали.

Для кнопки «Назад» автор настраивает historyRestoreAsHxRequest: false через meta-тег htmx-config. Иначе при cache miss HTMX запросит URL с HX-Request: true и получит partial вместо целой страницы.

Редиректы через HTMX работают иначе. Обычный HTTP-редирект (3xx) браузер перехватит раньше HTMX. Поэтому для HTMX нужно возвращать 2xx с заголовком HX-Redirect. Это вызывает полную перезагрузку страницы. Альтернатива — HX-Location, он работает без перезагрузки, но при повторном запросе снова шлёт HX-Request: true, что может сломать логику, если роут рендерит partial. Автор рекомендует HX-Redirect как более безопасный вариант.

Обработка ошибок тоже требует настройки. По умолчанию HTMX не заменяет контент при 4xx/5xx. Автор конфигурирует responseHandling в meta-теге: для 204 — ничего не менять, для 422 — вставлять как обычно (для форм с ошибками), для всех остальных 4xx и 5xx — заменять содержимое <body>, а для остальных кодов — заменять целевой элемент. Так пользователь увидит сообщение об ошибке, а не пустую страницу.

Читать оригинал →