概要
RailwayのフロントエンドはNext.jsからVite + TanStack Routerへ全面移行。 移行は2つのPRで無停止で完了、ビルド時間は10分超から2分未満に短縮。 Next.jsのサーバー中心設計がRailwayのクライアント主導開発と合わず、独自実装が増加。 Vite + TanStack Routerは型安全なルーティングや高速な開発体験を提供。 一部機能やエコシステムを手放すも、将来性と開発効率を重視した決断。
Railway フロントエンドのNext.js卒業
- Railwayの全プロダクションフロントエンド をNext.jsから Vite + TanStack Router へ移行
- ダッシュボード、Canvas、railway.com など全てのUIが新スタックで稼働
- 2つのPRで移行を完了、ユーザーへの ダウンタイムはゼロ
- Next.jsは初期の成長を支えたが、 ビルド時間の長期化 や 設計思想の不一致 で限界
- ビルド時間が10分超、うちNext.js関連だけで6分を占有
- 頻繁なデプロイ を行う開発体制にとって、 長いビルドは大きな障害
- Railwayのアプリは クライアントサイド中心、リアルタイムなUIとWebSocket活用
- Next.jsの サーバー優先設計 やPages Routerの制約で 独自実装や回避策が増加
- App Routerも サーバー中心 でRailwayのニーズに合わず、全面的な再設計が必要に
Vite + TanStack Router選定理由
- 明示的・クライアントファースト ・高速な開発ループに適合
- 型安全なルーティング、パラメータ推論やオートコンプリートがルート全体で機能
- パスレスレイアウト で従来のハックを排除し、 予測可能なレイアウト構成 を実現
- 爆速の開発ループ、HMR即時反映・起動ほぼゼロ秒
- SSRは必要なページのみ、他は完全クライアントサイド
- フレームワークの隠蔽よりも制御性重視、内部挙動の把握が容易
- チーム全員が開発体験を高評価、Railwayのダッシュボードに最適
2つのPRによる無停止移行
- PR1: Next.js固有のAPI(next/image, next/head, next/router)を全て排除
- ブラウザ標準APIやフレームワーク非依存な代替手段 へ置換
- フレームワーク自体は未変更、依存性だけをクリアに
- PR2: フレームワーク本体のVite + TanStack Routerへの全面切り替え
- 200以上のルートを移行、ページファイルからロジックをReactコンポーネントへ分離
- ルートツリーから自動生成
- Nitroをサーバーレイヤーに導入、リダイレクトやセキュリティヘッダー・キャッシュルールを一元管理
- Node.js APIのpolyfillも排除、ブラウザ標準APIで統一し コードが簡潔化
- 日曜朝にマージ、Discordでライブ監視し即日修正対応、 完全なゼロダウンタイム移行
失ったものと得たもの
- next/imageのビルトイン画像最適化を放棄、imgタグ+Fastlyのエッジ最適化へ移行
- next-seoやnext-sitemap等のエコシステムも自作ツールで代替
- TanStack Startは新しい技術、未成熟な部分もあるが 方向性とメンテナの対応力 を評価
- ViteとTanStackにスポンサー支援、今後の発展に期待
Railway自身によるRailwayの運用
- 本番フロントエンドもRailway上で運用
- PRごとのプレビュー、ヘルスチェック、ゼロダウンタイムロールアウト を実現
- インフラには一切手を入れず、コード変更のみで完結
- Fastlyでエッジ配信、マーケティングページはキャッシュ、ダイナミックページはISR
- Viteのアセットモデル でチャンク単位のキャッシュ制御、変更範囲のみ再配信
- ユーザーへの配信は数KB単位に最適化
フロントエンド開発の今後
- ビルド時間は10分超から2分未満に短縮
- 開発サーバー即時起動、ルート変更も型安全にチェック
- レイアウトもワークアラウンド不要で柔軟に構成
- 「書いたコードが即ユーザーに届く」体験を最重視
- Vite + TanStack Routerでほぼリアルタイムなフロントエンド開発 を実現
- この体験を自社・ユーザー双方に提供することが目標