Moving Railway's Frontend Off Next.js

Bài tóm tắt Railway 2026 2. Tăng trưởng Độ khó: Dễ

Railway · 2026 · 2. Tăng trưởng · Độ khó: Dễ — bài gốc

Bối cảnh

  • Next.js đưa railway.com từ số 0 tới hàng triệu user mỗi tháng, nhưng build frontend vượt 10 phút (riêng Next.js 6 phút) với một team ship nhiều lần mỗi ngày. App chủ yếu chạy phía client (dashboard có trạng thái, canvas real-time, websocket khắp nơi); các primitive server-first không dùng tới, layout trên Pages Router phải chắp vá, còn App Router thì đẩy hẳn về server-first.

Thay đổi chính

  • Chuyển sang Vite + TanStack Start/Router: route có kiểu, layout là primitive thật, HMR tức thì, SSR chỉ cho trang marketing/changelog.
  • Hai PR, không downtime (hơn 200 route): PR 1 gỡ mọi phụ thuộc riêng của Next.js (next/image, next/head, next/router) sang API trình duyệt hoặc thư viện trung lập, chưa đổi framework; PR 2 mới đổi framework, tách phần không phải routing khỏi file trang rồi sinh route từ cây trang cũ; Nitro làm lớp server, gom hơn 500 redirect, header bảo mật, luật cache vào một chỗ. Merge sáng Chủ nhật, cả team dùng thử ngay với "war room" trên Discord.
  • Từ bỏ: tối ưu ảnh dựng sẵn (thay bằng tối ưu ảnh ở edge của Fastly), vài thư viện hệ sinh thái (tự viết thay), độ trưởng thành.
  • Fastly phục vụ phần lớn traffic từ edge; mỗi module là một chunk băm theo nội dung nên đổi một phần chỉ vô hiệu chunk đó.

Kết quả (theo Railway)

  • Build từ hơn 10 phút xuống dưới 2 phút; dev server khởi động gần như tức thì.

Bài học cho SWE

  • Đổi framework theo hai bước: gỡ phụ thuộc vào framework trước (không đổi hành vi), rồi mới đổi framework.
  • Chọn framework theo hình dạng sản phẩm (client-first hay server-first), không theo mặc định của hệ sinh thái.

Liên quan