
2026/07/27 18:58
React.js をコードベースから削除し、UI のインタラクティブ性を Htmx で対応させる(2023 年)
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
Misago プロジェクトは、複雑な Django/React 双アーキテクチャをサーバーサイドレンダリングおよび HTMX に置換することにより、パフォーマンスの大幅な向上とメンテナンスの簡素化を目指しています。この戦略的転換では、重厚な JavaScript フレームワークの使用ではなく、軽量な HTML ベースの動的「アイランド」——つまりページ内の小規模でインタラクティブなセクション——の利用を優先します。このアプローチを採用することで、チームは現在アプリケーションの低速化を引き起こしている不要な大規模な JavaScript ファイルと冗長なコードの重複を取り除きます。コアとなる管理パネルは標準的な Django ビューのまま、フォームの自動処理機能を維持する一方で、フォーラムのような外部公開領域は HTMX へ移行し、フルページの再読み込みなしで動的に更新を可能にします。テストでは既に成功が見られ、例えば HTMX を用いてスレッドリストを書き換えることで、主要な JavaScript ファイルサイズを 615KB から 530KB に削減することに成功しました(同様の傾向は圧縮サイズおよびベンダーライブラリにも見られます)。以前検討されていた Django ビューの完全廃止や、Next.js とようなフル SPA フレームワークへの切り替えは、このソフトウェアが部分的インタラクティブ性において既に成功を収めているため、不要と判断されました。移行は 2024 年後半を通じて小さなステップで進行し、ユーザーオプション更新などのフルページ再読み込みが必要なアクションに対して一時的な期間を設けつつ、スムーズな移行を確保します。結果として、この変化は利用者にはローディング速度の向上、開発者には 2 つの別々のコードベースを維持する必要性の削減をもたらすほか、フォーラムソフトウェアにおける軽量ウェブデザインの強力な先例を確立します。
本文
Misago のアーキテクチャ再構築:React.js から HTMX と Django ビューへ移行する
Misago の既存アーキテクチャは**「サーバー側レンダリング(Django)」と「クライアント側インタラクション(React.js)」のハイブリッド構成**でした。しかし、このアプローチには重大な問題点があり、現在は技術スタックを抜本的に見直しています。
既存の実装仕組み
現在の Misago が動作するプロセスは以下の通りです:
- 初期リクエスト: ユーザーがサイトをアクセスすると、Django のビューがデータ収集と HTML テンプレートの生成を行います。
- JSON データの返却: ダミーのフォーム alongside HTML に加えて、JSON 形式でデータを返します(この段階ではインタラクションは不可)。
- クライアントサイド処理: JavaScript がダウンロードされ、ページ内の Django 生成 HTML をReact.js コンポーネントによる HTML に置き換えます。
- UI の有効化: ボタンが機能し始め、タイムスタンプなどが更新されます。
React.js アプローチの課題
この「ダブルレンダリング(二重実装)」の手法には以下の明確な問題点があります:
- コード重複: 多くのページが Django テンプレートと React コンポーネントの両方で実装されています。
- カスタマイズの困難さ: HTML カスタマイズを始めた者が失敗しやすくなります。Django テンプレートを修正しても、表示直後に React による置換が行われるため効果が薄れます。
- 全ビューでの重複実装: ユーザー公開ページはすべて Django と React の両方を必要とし、API と JSON シリアライザーの整備も別途求められます。
- パフォーマンス低下: 事前データ生成のための JSON シリアライゼーションにより応答が遅くなります。
- 翻訳ファイルの肥大化:
とdjango.po
に重複する翻訳メッセージがあり、JS ファイルサイズが増大します。djangojs.po - モバイルでの重さ: 大量の JavaScript が古くて動作の遅いデバイスでパフォーマンスを悪化させます。
- プラグイン開発の複雑化: カスタム HTML の挿入には Django と React の両方への対応が必要で、ビルドプロセスも複雑になります。
検討された代替案と HTMX の選定
上記課題に対処するために検討された解決策は以下の 2 つでした:
- フル SPA 化: SEO を考慮した最小限のサーバーサイドレンダリングを残し、UI 全体を React.js に依存させる(API ファースト)。
- ハイブリッドフレームワークの採用: Django を API として使い、Next.js や Remix.run などを導入する。
しかし、これらは過剰でした。現在でも「サーバー側でレンダリングし、必要最小限のクライアントサイド処理を行う」という手法に満足しているフォーラムソフトウェアは多数存在します。モデレーション、ウォッチ登録、返信作成など、重要な機能はフルページリロードなしで実装可能です。
その代わりとして選定されたのが HTMX です。
HTMX とは?
- 小さなライブラリ: 開発者が HTML の特定部分を「動的アイル」として指定し、インタラクションによってサーバーから新しい HTML を取得する仕組みを提供します。
- 実装例: スレッドリストのカテゴリ変更で、選択したカテゴリのリストのみを Django から取得新 HTML で取り替え、他の要素(ナビゲーションや検索結果)は維持できます。
- バックエンドの簡素化: 特定のアイル用 HTML を返すだけでよく、JSON シリアライゼーションも不要です。
- 直感的な API:
のような jQuery の宣言的スタイルや Rails の Turbolinks に似た挙動を提供します。$.get("url", "#outlet") - メリット: スクロールエンドレスの複雑さを避けつつ、シンプルさを保ちます。
移行による改善と数値データ
Misago から React.js 系ライブラリを削除し、Django ビューと HTMX を採用することで大幅な軽量化が図られました。
JavaScript サイズの削減状況(移行前 → 移行後)
| ファイル | 移行前 (圧縮後) | 移行後 (圧縮後) | 削減量 |
|---|---|---|---|
| misago.js | 615 KB (124 KB) | 530 KB (99 KB) | -25 KB |
| vendor.js | 679 KB (214 KB) | - | (削除) |
| django-i18n.js | 102 KB (25.4 KB) | - | (統合/削減) |
スレッドリストの書き直しによる改善
スレッドリストを HTMX ベースに完全に再実装した結果:
- misago.js: 615 KB → 530 KB(圧縮後 99 KB)
- 削減率: 約 -48 KB (圧縮後 -8 KB)
フォーラムオプションページの統合
「フォーラムオプション」ページを「アカウント設定」ページに統合し、HTMX を活用しました:
- misago.js: 578 KB → 530 KB(圧縮後 99 KB)
- 削減率: 約 -37 KB (圧縮後 -17 KB)
オンデマンド読み込みライブラリの削減
React.js を除去したことで、不要な依存ライブラリも排除できました:
- hljs.js: 144 KB → 必要な時にのみ読み込み可能(削減傾向)。
- zxcvbn.js: 820 KB (圧縮後 430 KB) をオンデマンドから除外・軽量化。
移行期間中の注意喚起
完全に切り替わるまでの移行期には、以下の点にご注意ください:
- 一部機能の一時的制限: React.js および一部の HTMX 機能が一時的に利用できない可能性があります。
- マルチページアプリケーション(MPA)の運用:
- ユーザー設定などの一部ページでは、リンククリックやフォーム送信時にフルページの再読み込みが発生します。
- 投稿への「いいね」やアンケート投票など、リロードが許容できない箇所には、AJAX や HTMX を活用したプレースホルダーの配置を準備中です。
この再構築により、Misago はシンプルさを維持しつつ、より軽量で保守しやすいシステムへと進化しています。