一個常見的混淆
「我要做一個新專案,應該用 Next.js 還是 Express / NestJS?」
這個問題本身有個隱藏的前提問題沒有被問出來:你的系統是「前端應用需要 server 端支援」,還是「純後端 API service」?
這兩個的架構哲學是相反的,技術選型自然也不同。
Meta-framework 是什麼
Meta-framework(元框架)是在現有 UI library(React / Vue / Svelte)上面加一層 convention 的框架:
- Next.js:React 的 Meta-framework
- Nuxt:Vue 的 Meta-framework
- SvelteKit:Svelte 的 Meta-framework
- Remix:React,強調 web fundamentals(HTTP cache、form)
這些框架解的問題是:React / Vue 本身只是 UI library,沒有規定路由怎麼定義、資料怎麼取、static generation 怎麼做、server rendering 怎麼設定。Meta-framework 把這些 convention 加進去,讓你有一個「完整的 web 應用」起點。
React 本身:
❌ 路由(你自己決定用 React Router 哪個版本)
❌ 資料取得(fetch / axios / React Query,你決定)
❌ SSR(你自己設定 Node.js server)
❌ Static generation(你自己搞)
Next.js:
✅ 檔案系統路由(`app/users/[id]/page.tsx` 就是一個路由)
✅ Server Component / Client Component 分工
✅ Server Action(在 component 裡直接寫 server 端邏輯)
✅ Static / Dynamic / ISR 生成策略
純後端 Framework 是什麼
Express、Fastify、NestJS、FastAPI、Spring Boot——這些是純後端 API framework。它們的設計假設是:這個服務的工作是「接 HTTP 請求、處理商業邏輯、回傳資料」,UI 是別的東西(可能是 React / Vue 前端、可能是 mobile app)。
Express:
✅ 路由(URL → handler 的對應)
✅ Middleware chain
✅ JSON response
❌ UI layer(根本不管)
❌ SSR HTML(不是它的工作)
❌ Static file optimization(交給 CDN)
兩者的架構哲學是相反的
Meta-framework 的哲學:server 是 UI 的延伸。
Next.js 的 Server Component 和 Server Action 讓你在 React component 裡直接寫資料庫查詢:
// Next.js App Router — Server Component
// 這段程式碼跑在 server,直接查 DB,不需要 API endpoint
export default async function UserPage({ params }: { params: { id: string } }) {
const user = await db.user.findUnique({ where: { id: params.id } });
// user 直接傳給 component,不需要 fetch API
return <UserProfile user={user} />;
}後端 framework 的哲學:server 是獨立的服務,UI 透過明確的 API 契約和 server 溝通:
// Express — API endpoint
app.get('/users/:id', authenticate, async (req, res) => {
const user = await userService.findById(req.params.id);
res.json(user);
// 不管誰來呼叫——React 前端、Vue 前端、mobile app、第三方都可以
});什麼情況選 Meta-framework
你做的是「一個 web 應用,前端和後端緊密耦合」:
- 內容網站、行銷網站、電商前台(SEO 是需求 → SSR 很重要)
- Admin 後台(只有你的 React 前端會呼叫這個 server)
- 小型 SaaS(前後端同一個 codebase,一個 Next.js 專案全包)
- 快速 prototype(不需要分離的 API server)
Meta-framework 讓「全端工程師」可以在同一個 codebase 裡同時寫 UI 和 data layer,部署也簡單(Vercel / Netlify 一鍵)。
什麼情況選純後端 Framework
你做的是「一個 API service,服務多個 client」:
- 你的後端要同時服務 web 前端、iOS app、Android app
- B2B API(第三方開發者呼叫)
- Microservice(一個服務只做一件事,被多個其他服務呼叫)
- 效能關鍵的 API(不需要 SSR overhead,只要純 JSON)
純後端 framework 讓你的 API 有明確的 contract,任何 client 都可以呼叫,獨立 scale,獨立部署。
不懂 Node.js 去玩 Next.js 的坑
Meta-framework 把很多 server 細節藏起來了——你只要寫 React component 和 async function,不用管 HTTP header、middleware、session 怎麼工作。
這在大多數情況下是好事,但當你遇到邊界問題時會非常痛:
- CORS 問題:不懂 CORS 的人看到 “blocked by CORS policy” 完全不知道為什麼,因為 Next.js 沒有讓你明確設定 CORS middleware
- Cookie / Session:Server Action 的 cookie 操作和傳統 API server 的方式不一樣,不懂 HTTP cookie 機制的人會寫出 bug
- Streaming / Suspense:React 18 的 Suspense streaming 背後是 Node.js stream,出問題時 debug 需要懂底層
Meta-framework 是「藏複雜度」,不是「消滅複雜度」。懂底層讓你在出問題時知道去哪裡找答案;不懂底層讓你遇到框架邊界就卡住。
常見的誤用
誤用一:用 Next.js API Routes 做微服務
Next.js 的 API Routes 可以寫後端邏輯,但它是給「同一個 Next.js 應用的 server 端請求」設計的,不是給「獨立部署、被多個 client 呼叫的 API service」設計的。把 Next.js API Routes 當完整的 API server 用,會遇到 connection pool 管理、graceful shutdown、log 設計等問題,而 Next.js 的文件對這些沒有明確答案。
誤用二:用 Express 做全端
Express 做全端(API + server-side rendering HTML)可以,但你要自己實作 SSR、路由、靜態資源最佳化——這就是在重新發明 Next.js。
