Сейчас Misago работает по довольно странной схеме. Когда вы заходите на https://misago-project.org, Django собирает данные и рендерит почти готовый HTML со списком тем. В этот HTML также вшит кусок JSON с теми же данными. Затем загружается JavaScript, запускается React.js, читает этот JSON и полностью заменяет серверный HTML своим — только после этого кнопки становятся активными, а временные метки обновляются. Формы же и вовсе отключены до прихода React.js.
У подхода накопилось много проблем. Почти каждая страница существует в двух версиях: как Django-шаблоны и как компоненты React.js. Начинающие кастомизировать форум правят Django-шаблоны, видят свои изменения на секунду, а потом их затирает React.js — и люди не понимают, что нужно править ещё и его. Любое представление, доступное и гостям, и пользователям, приходится делать дважды: вид с шаблонами и роут с компонентами, плюс нужен API с JSON-сериализаторами. Сериализация JSON для предзапечённых данных тормозит генерацию ответа. Переводы дублируются в django.po и djangojs.po, а файлы переводов для JavaScript увеличивают начальную загрузку. Груды JavaScript могут убить производительность на старых и медленных мобильных устройствах. Наконец, плагины, желающие вставить или заменить кусок HTML, вынуждены реализовывать и Django-шаблоны, и компоненты React.js, а самому Misago потребовалось бы внедрить JavaScript-сборку в процесс билда сайта внутри misago-docker.
Рассматривались два пути решения. Первый — выбросить Django-шаблоны почти целиком, оставив лишь минимальные версии для поисковых ботов, а весь UI отдать React.js. Второй — свести Django к API и взять серверный рендеринг на Next.js или Remix.run. Но автор вспоминает, что куча форумного софта до сих пор рендерит максимум на сервере и добавляет немного JavaScript для интерактивности — и народ счастлив. Именно этот подход лишён всех перечисленных проблем. Интерактивность форума изолирована в конкретных местах: модерация, подписка на тему, ответ, уведомления, голосование. Всё это можно сделать без React.js и делали годами до того, как полный отказ от перезагрузок страницы стал самоцелью.
Выход — HTMX, крошечная библиотека из разряда старых добрых $.get("url", "#outlet") из эпохи jQuery или Rails Turbolinks. Разработчик размечает в HTML динамические острова, которые при взаимодействии подменяются новым серверным HTML. Например, список тем — один такой остров. При смене категории HTMX может запросить у Django только новый список тем и заменить его на странице, не трогая остальные живые части. Серверному коду остаётся лишь понять, что запрос от HTMX, и отдать HTML только для этого острова вместо полной страницы. Никакого JSON, никакого дублирования на React.js и JavaScript, просто декларативная замена фрагментов. Автор сам не верит, что пишет это, но для форума, если не нужна бесконечная прокрутка или если хочется сохранить простоту, — это самый правильный путь.