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 SSRVite SPA + Functions
RenderingSSR động mỗi request qua NitroChỉ static HTML/JS, không SSR
APIserver/api/*.ts, Nitro gộp chung vào 1 Worker với SSRfunctions/*.ts, file-based routing tách biệt khỏi frontend
Entry point1 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 output1 (hoặc vài) worker bundle tự sinhdist/ (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 fetch handler) — 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.