概要
- モバイル性能重視 のフレームワーク選定の経緯
- 主要10フレームワーク で同一機能のアプリを構築・比較
- バンドルサイズとFCP で大きな差異を確認
- MarkoやSolidStart など次世代型の優位性
- ビジネス観点からも遅延は致命的 であることを強調
なぜこの検証を始めたか
- 現場で使う不動産エージェント向け アプリのため、モバイル実用性が最重要要件
- Next.js、SolidStart、SvelteKit で比較開始も、React系の根本的な限界に直面
- VueやAngularも含めた主要フレームワーク全体 を検証対象に拡大
- 同一機能・同一DB・同一UI で10種類のKanbanアプリを実装し、徹底比較
- 単なる趣味ではなく、実務上の意思決定 として本気で性能を測定
主要な発見・結論
- Marko, SolidStart, SvelteKit, Nuxt はFCP 35〜39msで「体感即時」表示
- Next.jsは467ms、12〜13倍遅い
- 次世代と旧世代の間に圧倒的な差
- バンドルサイズ最小はMarko (88.8kB raw/28.8kB圧縮)、Next.jsの1/6.36
- SolidStartも41.5kB圧縮で優秀
- Qwik CityはResumabilityパターン で即時インタラクティブを実現
- Nuxt(Vue3)は正しく設定すれば次世代並み性能 を達成
- React・Angularは根本的に性能上限あり
- TanStack Start(React19)はNext.jsより1.5倍マシだが、Solid版の2倍サイズ
- Analog(Angular20)はさらに重い
- MPA型(Marko, HTMX)はページごとに最小のJS出荷
- SPA型は初回でルーティング等も含めて多めに出荷、コード分割してもベースが重い
モバイルWeb性能が重要な理由
- モバイルWebは世界の主流。URLがあれば、必ずスマホでアクセスされる現実
- 30kB vs 170kBの違い は「見た目の良さ」や「信頼感」まで直結
- 遅い=ユーザー離脱率28% (ダウンタイムの3倍以上、SpeedCurve調査)
- 遅延はブランドイメージ全体を損なう。単なる数値ではなく心理的ダメージも大
- 実測で113kB差=3Gで1.5〜2秒遅延。キャッシュもデプロイごとに無効化され現実的には毎回ダウンロード発生
実験のセットアップ
- 10フレームワークで同一Kanbanアプリ を実装
- Next.js 16 (React19)
- TanStack Start (React19)
- TanStack Start + Solid (SolidJS 1.9)
- Nuxt 4 (Vue3)
- Analog (Angular20)
- Marko (@marko/run)
- SolidStart (SolidJS 1.9)
- SvelteKit (Svelte5)
- Qwik City
- Astro + HTMX
- 全て同じ機能・同じDB(SQLite+Drizzle ORM)・同じUI(Tailwind CSS+DaisyUI)
- 全実装で約17コンポーネント、CRUD・ドラッグ&ドロップ・コメント・タグ管理・サーバーサイドバリデーション等を網羅
- 依存ライブラリは極力最小限 (ドラッグ&ドロップなど必要最小限のみ)
レベル別Webアプリ設計の示唆
- 本記事はLevel 5(高度なクライアント状態管理やナビゲーションが必要な場合)向け
- 実はLevel 3(HTMXやバニラJS強化のサーバーレンダリング)やLevel 4(Lit等Web Components追加)で十分なケースが多い
- シンプルな設計ほどバンドルも小さく、保守性も高い
まとめ・重要ポイント
- フレームワーク選択=ビジネスインパクト。特にモバイルでは1kBごとに体感が変わる
- React/Angularは根本的なアーキテクチャの壁 があり、今後も劇的な改善は難しい
- Marko, SolidStart, SvelteKit, Nuxt 等の新世代フレームワークが「即時表示・軽量」を両立
- Vue(Nuxt)は設定次第で新世代に食い込む が、React/Angularは脱落
- 現実のプロダクションアプリは依存追加で5〜10倍重くなる ため、フレームワーク選定時の差はさらに拡大
- モバイルWeb最適化=全ユーザー体験の底上げ。デスクトップ最適化ではモバイル利用者が必ず犠牲になる
この知見が、フレームワーク選定やアーキテクチャ設計時の指針となることを願います。