Tổng hợp Q&A (kiến thức cơ bản & dễ nhầm lẫn)
Q: Nitro là gì? A: Nitro là server engine của Nuxt — một build tool/compiler đa target. Nó không gắn cứng với "local" hay "static". Tùy preset cấu hình, Nitro sẽ đóng gói server logic thành output khác nhau: Node.js server, AWS Lambda, Vercel Function, Deno, hoặc Cloudflare Worker.
Q: Nuxt build static (nuxi generate, preset static) thì Nitro làm gì?
A: Nitro chạy ở local/CI, pre-render toàn bộ route ra HTML/JS tĩnh, rồi "biến mất". Không có server nào tồn tại lúc runtime. Cloudflare Pages lúc này chỉ đóng vai trò CDN phục vụ file tĩnh — bản chất giống hệt một SPA.
Q: Nuxt build với SSR preset (cloudflare_pages / cloudflare_module) thì khác gì?
A: Nitro compile chính nó (SSR renderer + toàn bộ route trong server/api/) thành một file JS (_worker.js) chạy trên Workers runtime. File này không chạy ở local — nó được deploy và thực thi trên mỗi request tại edge của Cloudflare.
Q: Vậy trong trường hợp SSR, Nitro có phải chính là Worker không?
A: Đúng. Nitro server = Worker script thật sự = entry point (fetch handler) mà Cloudflare gọi mỗi khi có request. Mọi request (page SSR lẫn /api/...) đều đi vào cùng một Worker đó, Nitro tự route nội bộ. Static assets (ảnh, css, JS bundle client) vẫn được CDN serve trực tiếp, không qua Worker.
Q: So với Vite SPA + Cloudflare Pages Functions thì sao? A:
| Nuxt SSR | Vite SPA + Functions | |
|---|---|---|
| Rendering | SSR động mỗi request qua Nitro | Chỉ static HTML/JS, không SSR |
| API | server/api/*.ts, Nitro gộp chung vào 1 Worker với SSR | functions/*.ts, file-based routing tách biệt khỏi frontend |
| Entry point | 1 Worker duy nhất xử lý mọi thứ (page + API) | CDN serve static asset trực tiếp; chỉ /functions/* mới là Worker riêng theo path |
| Build output | 1 (hoặc vài) worker bundle tự sinh | dist/ (static) + Functions riêng, Cloudflare tự ghép routing |
Q: Vậy về bản chất backend, cả hai target ra có giống nhau không?
A: Có — cả hai đều chạy trên cùng một nền tảng: Cloudflare Workers runtime (workerd, V8 isolates). Cùng bindings (KV, D1, R2, Durable Objects), cùng giới hạn CPU time/memory, cùng cơ chế wrangler.toml. Khác biệt chỉ nằm ở kiến trúc/tổ chức code: Nitro tự động hoá và gộp SSR + API vào 1 Worker; SPA thì bạn tự viết tay từng Function riêng.
Q: Khái niệm Worker, Pages, Pages Functions khác nhau thế nào? A:
- Worker = đơn vị runtime cơ bản của Cloudflare (V8 isolate chạy
fetchhandler) — nền tảng gốc. - Pages = sản phẩm cho static site + CI/CD (git integration).
- Pages Functions = lớp "đường tắt" viết Worker code (file trong
functions/) mà không cần tự quản lý Worker project riêng — Cloudflare tự build thành 1 Worker ẩn, gắn vào route của Pages project đó.
→ Bản chất: Pages Functions = một Worker, chỉ khác là được Cloudflare tạo/quản lý tự động, gắn chết vào 1 Pages project, không tồn tại độc lập.
Q: Tại sao Pages Functions/Worker ẩn khỏi dashboard, không hiện như 1 "Worker project" riêng? A: Đây là chủ đích thiết kế — nó là managed/internal Worker, sinh tự động mỗi lần deploy, không nhằm để quản lý trực tiếp như Worker service độc lập. Nó:
- Không có tên riêng, không xuất hiện ở tab "Workers & Pages → Workers"
- Không có route/domain binding riêng để chỉnh tay
- Chỉ sống/chết theo vòng đời của Pages project (mỗi deployment tạo bản mới)
Mục đích: đơn giản hoá trải nghiệm, ẩn khái niệm Worker khỏi người dùng Pages thông thường. Muốn full control (routes, triggers, versioning, observability riêng) → phải tạo Worker project thật sự, tách biệt khỏi Pages.