概要
Misagoは現在、DjangoテンプレートとReact.jsコンポーネントの二重実装による課題を抱えている。 HTMLカスタマイズが困難で、パフォーマンスや開発効率に悪影響が生じている。 HTMXの導入でサーバーサイドレンダリング中心のシンプルな構成へ移行を検討中。 React.js依存の脱却は段階的に進める予定。 移行によりJSサイズ削減や保守性向上が期待される。
Misagoの現状と課題
- 現在のMisago は、Djangoビューでスレッド一覧データを取得し、ほぼ完成したHTMLをテンプレートで出力、その中に同じデータのJSONも埋め込む構成
- JavaScript がロードされると、ページ内のJSONを読み取り、Djangoテンプレートで描画されたHTMLをReact.jsコンポーネントによるHTMLで置換
- ボタンの有効化 やUIのタイムスタンプ更新など、インタラクティブな機能がJS起動後に有効化
- 二重実装の問題
- DjangoテンプレートとReact.jsコンポーネントの両方で同じページを実装する必要
- HTMLカスタマイズ時、Djangoテンプレートのみ編集すると、React.jsのHTMLに上書きされてしまい、意図した変更が反映されない混乱
- ゲスト・ユーザー両方がアクセスするビューは、DjangoとReact.jsの双方で実装必須
- APIとJSONシリアライザの実装・メンテ負荷
- JSONシリアライズ処理によるレスポンス生成の遅延
- 翻訳メッセージがdjango.poとdjangojs.poの両方に分散し、管理が煩雑
- JavaScriptの初期ダウンロードサイズ増大
- 古い・低スペック端末でのパフォーマンス悪化
- プラグイン開発時もDjangoテンプレートとReact.js双方の知識が必要
- サイトビルド時にJavaScriptビルドステップが必須
検討中の解決策
- Djangoビューとテンプレートの最小化、SEO用にのみ残し、UIは全てReact.jsアプリ化しAPI中心運用
- DjangoをAPIのみに縮小 し、Next.jsやRemix.run等のJavaScriptフレームワークによるサーバーサイドレンダリング活用
サーバーサイドレンダリング回帰の価値
- 多くのフォーラムソフトウェアは従来通りサーバーでHTMLを生成し、必要な箇所のみJavaScriptでインタラクティブ性を付与
- この方法では、前述の二重実装やパフォーマンスの問題が発生しない
- フォーラムのインタラクティブ性は、モデレーションやスレッド監視、返信、通知、投票などページの一部に限定されている
- これらはReact.jsが登場する以前から、フルリロード無しで実現されていた
HTMX導入案
- HTMX は、HTMLの一部を「動的アイランド」として定義し、ユーザー操作時にサーバーから新しいHTMLを取得して該当部分のみ差し替える小型ライブラリ
- 例)スレッド一覧を大きなアイランドとして、カテゴリ変更時にその部分だけ新しいHTMLに置換
- Django側はHTMXリクエスト時のみ該当アイランド部分のHTMLを返却
- JSONシリアライズや専用のJavaScript/React.js記述が不要
- HTMXは宣言的なjQueryの$.get("url", "#outlet")や、RailsのTurbolinks的な役割
- シンプルな構成・保守性向上
管理画面(Admin Panel)について
- 管理画面はSPA化せず、 従来のDjangoビュー を活用
- 再利用可能なDjangoビュー群で90%の作業を自動化
- ページ追加はベースビュー選択・フォーム定義・基本テンプレート作成で完結
- SPA化による複雑化を回避
HTMX移行計画
- React.jsからHTMXへの移行は 段階的 に実施
- 例)Navbar → スレッド一覧 → スレッドページ → ユーザープロフィールの順で移行
- ただし、プラグイン・権限・新パーサーの実装が先行課題
- HTMX移行は2024年後半以降を予定
- Bootstrap最新版への移行も同時に検討中
JavaScriptサイズの現状と削減目標
- Misago 0.39のJSサイズ
- vendor.js: 679kb(214kb gzipped)
- misago.js: 615kb(124kb gzipped)
- django-i18n.js: 102kb(25.4kb gzipped)
- 遅延ロード: hljs.js 144kb(49kb gzipped)、zxcvbn.js 820kb(430kb gzipped)
- React.js等の依存削減により、これらのサイズを大幅に削減予定
HTMX移行中の一時的な挙動
- 移行期間中は、 React.jsもHTMXも未導入 な部分が「マルチページアプリケーション」化
- 例)ユーザーオプションページでリンクやフォーム送信時にフルリロード発生
- ただし、投票や「いいね」などフルリロードが不快な箇所には暫定AJAXやHTMXを適用
直近の改善事例
- 「Forum options」ページを「Account settings」ページに刷新
- Djangoビュー+一部HTMXで実装
- JSサイズ:misago.jsが578kb(107kb gzipped)に削減(旧比37kb/17kb減)
- スレッド一覧をDjangoビュー+HTMXで再実装
- JSサイズ:misago.jsが530kb(99kb gzipped)に削減(旧比48kb/8kb減)