1. modulMiért Nuxt? — és miért pont Cloudflare-en
Nuxt for Devs · 1. modul

Miért Nuxt? És miért pont Cloudflare-en

Az a modul, aminek a végén el tudod dönteni, hogy egyáltalán akarod-e. Nem meggyőzni akarlak: megmutatom, mit ad hozzá a Vue SPA + Express felálláshoz, mit veszítesz vele, mikor nem éri meg, és mi az a konkrét dolog, amitől pont a Cloudflare-en lesz több, mint máshol.

1.1Mit építesz ma — és hol fáj

A jelenlegi felállás nagyjából így néz ki: egy Vue SPA, amit Vite épít statikus fájlokká, kikerül egy CDN mögé, és böngészőből hívja az Express API-t, ami külön fut. Ez működő architektúra, sok nagy termék így üzemel. Nem az a kérdés, hogy rossz-e, hanem hogy hol fizetsz érte.

Négy visszatérő költség van benne:

A Nuxt mind a négyre válaszol. Nézzük meg, hogyan — és utána azt, hogy mit kérdez cserébe.

1.2Az öt dolog, amit a Nuxt hozzáad

① Szerveroldali renderelés — és a hydration

A Nuxt alapból universal rendering módban fut: az első kérésre a szerveren lefuttatja a Vue-komponenseidet, és kész HTML-t küld. A böngésző ezt azonnal megjeleníti, majd letölti a JS-t, és „ráhidratálja” ugyanazt a komponensfát — innentől minden interakció ugyanúgy kliensoldali, mint eddig.

VUE SPA üres HTML JS letöltés + parse API-hívás tartalom itt lát először valamit a felhasználó eddig spinnert néz · a keresőrobot üres oldalt lát NUXT — UNIVERSAL RENDERING HTML, benne a tartalom itt lát először valamit JS letöltés + parse hydration interaktív az adat már a szerveren lekérdeződött · a robot kész oldalt kap · a kattintás a hydration után él
Ugyanaz az első betöltés kétféleképpen. A különbség nem a teljes betöltési idő, hanem az, hogy mikor lát a felhasználó tartalmat.
Fontos árnyalat: a hydration nem ingyenes. A JS ugyanúgy letöltődik és lefut — sőt, a HTML nagyobb lett. Amit nyersz, az az észlelt sebesség és az indexelhetőség. Ha az appod teljes egészében bejelentkezés mögött van és senki nem osztja meg linkként, az SSR haszna jóval kisebb — erről a 1.4-ben őszintén.

② Fájl-alapú routing

A route-tábla eltűnik. A könyvtárszerkezet a route-tábla:

app/pages/
  index.vue                     →  /
  login.vue                     →  /login
  projects/index.vue            →  /projects
  projects/[id].vue             →  /projects/:id
  projects/[id]/settings.vue    →  /projects/:id/settings
  [...slug].vue                 →  minden más (404 vagy CMS-oldal)

Ehhez jönnek a layoutok (app/layouts/) és a route middleware-ek (app/middleware/), amiket oldalanként rendelsz hozzá. Nincs többé „elfelejtettem regisztrálni a route-ot” hiba, viszont cserébe a fájlnevek konvenciója lesz a szabályrendszer, amit ismerned kell. A 4. modul ezt vezeti végig.

③ Adatlekérés, ami már a szerveren lefut

Ez a legnagyobb napi különbség. Ma valószínűleg így néz ki egy oldalad:

Ma — Vue SPA
<script setup>
const route   = useRoute()
const project = ref(null)
const loading = ref(true)
const error   = ref(null)

onMounted(async () => {
  try {
    const res = await fetch(`/api/projects/${route.params.id}`)
    if (!res.ok) throw new Error(res.statusText)
    project.value = await res.json()
  } catch (e) { error.value = e }
  finally { loading.value = false }
})
</script>
Nuxt
<script setup lang="ts">
const route = useRoute()

// lefut a szerveren az SSR alatt, az eredmény a HTML-lel érkezik
const { data: project, status, error } = await useFetch(
  () => `/api/projects/${route.params.id}`
)

// és a meta is szerveroldalon dől el — ez az, ami SPA-ban nem megy
useSeoMeta({
  title:       () => project.value?.name ?? 'Projekt',
  description: () => project.value?.summary,
})
</script>

Nem csak rövidebb. A lényeg, hogy a lekérés a szerveren megtörténik, mielőtt a HTML elmegy — így nincs villanó spinner, a robot látja a tartalmat, és a <title> a valódi projektnév. Az 5. modul erről szól, mert van benne bőven csapda is (például hogy mi utazik ki a HTML-be a lekérés eredményéből).

④ Egy szerver a kettő helyett — Nitro

A Nuxt saját szerver-rétege a Nitro. Ugyanabban a projektben, ugyanazokkal a típusokkal írod az API-t:

Ma — Express
// routes/projects.js
router.get('/:id', requireAuth, async (req, res, next) => {
  try {
    const project = await db.project.findFirst({
      where: { id: req.params.id, tenantId: req.session.tenantId },
    })
    if (!project) return res.status(404).json({ error: 'Not found' })
    res.json(project)
  } catch (err) { next(err) }
})
Nuxt — server route
// server/api/projects/[id].get.ts   ← a fájlnév adja az útvonalat ÉS a metódust
export default defineEventHandler(async (event) => {
  const { tenantId } = await requireSession(event)   // server/utils/, auto-import
  const id = getRouterParam(event, 'id')

  const project = await useDb(event).query.projects.findFirst({
    where: and(eq(projects.id, id), eq(projects.tenantId, tenantId)),
  })

  if (!project) throw createError({ statusCode: 404, statusMessage: 'Nincs ilyen projekt' })
  return project   // a szerializálás automatikus
})

Amit itt nyersz: a válasz típusa végigmegy a useFetch-ig, tehát a komponensben tudja a TypeScript, mi van a project-ben. Nincs kétszer leírt típus, nincs CORS, nincs külön deploy. A 8. modul a teljes Express→h3 megfeleltetést hozza.

⑤ Konvenciók és a modulrendszer

Auto-import (komponensek, composable-ok, server/utils), kész felállás a TypeScripthez, és egy modul-ökoszisztéma, ahol egy sor a nuxt.config.ts-ben elintézi a képoptimalizálást, az i18n-t vagy a fontkezelést. Ez a rész az, ami a legjobban gyorsít — és amiért cserébe a legtöbbet fizetsz kontrollban. Lásd rögtön a következő szakaszt.

1.3Mit veszítesz — az őszinte lista

Ezt a részt komolyan vedd, mert a Nuxt-marketing nem fogja elmondani.

A legdrágább tévedés: azt hinni, hogy az SSR ingyen sebességet ad. Nem ad. Több szerveridőt cserélsz gyorsabb észlelt betöltésre és indexelhetőségre. Ha az appod belső eszköz login mögött, akkor ezt a cserét megcsináltad, de a hasznot nem kaptad meg — csak a szerverterhelést és a komplexitást.

1.4Mikor ne Nuxt?

HelyzetMiért nem éri megMit csinálj helyette
Az app 100%-ban auth-fal mögött van, nulla publikus tartalom Az SSR két fő haszna (SEO, első festés idegennek) nem érvényesül. Marad a DX-nyereség és a teljes komplexitás. Vite + Vue Router + külön API. Vagy Nuxt ssr: false-szal — de akkor mérlegeld, mit adott.
A csapat React-es A keretrendszer-váltás mellé jön egy nyelvi/ökoszisztéma-váltás. Két kockázat egyszerre. Next.js OpenNext adapterrel Workers-en, vagy React Router / TanStack Start.
Kicsi belső admin vagy dashboard A Nuxt overhead-je nagyobb, mint a haszna, ha 8 oldalról és 3 felhasználóról van szó. Vite + Vue, statikusan a Workers static assetsre. Ez is egy deploy, és sokkal egyszerűbb.
Nagy, nem-JS backend (Rails, Django, Go), ami marad A Nitro fele kihasználatlan lesz; a Nuxt csak SSR/BFF réteg. Ez még lehet jó választás — de a 9. modul BFF-ágát olvasd, ne a full-stack ágat.
Tartalom-központú oldal (blog, dokumentáció, marketing) Nuxttal megoldható, de nehezebb, mint kell. Astro — kevesebb JS megy ki, egyszerűbb modell.

1.5Nuxt a mezőnyben

Röviden és elfogultság nélkül, kifejezetten a „Cloudflare-en fogok hostolni” szempontból:

KeretrendszerErősségeWorkers-en
NuxtVue, kiforrott konvenciók, a Nitro miatt kiemelkedő platform-hordozhatóságNatív Nitro-preset — nincs köztes adapter-réteg
Next.jsLegnagyobb ökoszisztéma és munkaerőpiac, ReactOpenNext adapterrel — plusz réteg, ami lemarad a Next fejlődése mögött
SvelteKitKisebb bundle, kevesebb mágia, tiszta modellVan adapter, jól működik; kisebb ökoszisztéma és kevesebb kész modul
AstroTartalom-központú oldalakra a legjobb (island architecture)Jól fut; alkalmazás-jellegű termékhez viszont kevesebbet ad

Nálad a Vue-tudás adott, tehát a valódi kérdés nem a Nuxt vs. Next, hanem a Nuxt vs. a mostani Vue SPA + Express. Erre válaszol az 1.2 és az 1.3.

1.6Miért illik pont a Cloudflare-hez

Ez az a rész, ami miatt ez a tananyag nem általános Nuxt-kurzus. Négy konkrét ok:

  1. A Workers nem „port”, hanem első osztályú cél. A Nitro preset-rendszere miatt a Cloudflare ugyanolyan build-célpont, mint bármelyik másik. A Next.js-nél ehhez egy külön adapter-projekt (OpenNext) kell, ami definíció szerint mindig egy lépéssel a keretrendszer mögött jár.
  2. Egyetlen deploy-egység. Az SSR-kód és a statikus assetek egy Workerben mennek ki, a CDN pedig nem egy külön réteg, hanem maga a hálózat. A mostani S3 + CloudFront + ALB + Beanstalk négyesből egy darab wrangler deploy lesz.
  3. A server routes közvetlenül lát bindingokat. A server/api/-ban a D1, R2, KV, Queues nem SDK-n és API-kulcson keresztül érhető el, hanem közvetlen referenciaként (event.context.cloudflare.env). Nincs hálózati ugrás, nincs kulcskezelés.
  4. Az SSR tényleg a felhasználó közelében fut. Régió-alapú hostingnál az ausztrál felhasználód kérése átmegy a fél világon, mielőtt egy pixel megjelenne. Itt a renderelés az edge-en történik — és pont az SSR az, ami ebből a legtöbbet profitál.
MA — NÉGY RÉTEG, KÉT DEPLOY böngésző CloudFront ALB S3 — statikus Beanstalk — API Aurora 2 build · 2 deploy CORS · 2× env típusok elvesznek NUXT A WORKERS-EN — EGY DEPLOY böngésző egyetlen Worker (edge) static assets + CDN SSR (Nitro) server/api — h3 handlerek D1 / R2 / KV — binding Hyperdrive → Aurora 1 build 1 deploy közös típusok
A rétegek nem tűnnek el, hanem összeolvadnak: a CDN, az SSR és az API ugyanaz a deploy-egység, és az adatréteg binding-ként kapcsolódik.
És mi ennek az ára? Négy dolog, amivel számolj — a tananyag későbbi moduljai mindegyikkel foglalkoznak: ① a Workers-runtime nem Node, tehát nem minden npm-csomag fut benne (19. modul); ② van bundle-méret limit, és egy Nuxt-app hozzá tud érni (15. modul); ③ a CPU-idő mérve van, a nehéz SSR nem ingyenes (15., 19. modul); ④ az isr / swr route rule nem úgy működik, mint Vercelen (7. modul). Egyik sem showstopper, de mindegyik meglepetés, ha deploy után derül ki.

1.7Mit jelent ez konkrétan a te SaaS-odra

Multitenant SaaS-nál három dolog számít a fentiekből igazán:

Mi a következő lépés? A 2. modulban felnyitjuk a motorháztetőt: mi történik nuxt build-kor, mi kerül a .output/-ba, és — a legfontosabb — melyik kódod hol fut. Ez a modell az, ami nélkül a későbbi SSR-hibák érthetetlenek maradnak, úgyhogy azt a modult ne ugord át.

1.8Ellenőrizd magad

  1. Mit nyersz pontosan az SSR-rel, és mit nem?
    Válasz

    Nyered: a felhasználó azonnal tartalmat lát (nem spinnert), a keresőrobot és a link-előnézet kész HTML-t kap, és a <title>/OG-tagek szerveroldalon, valós adatból generálódnak. Nem nyered: a JS ugyanúgy letöltődik és lefut, a HTML nagyobb lesz, és a szerveredre több munka kerül. Az SSR észlelt sebességet és indexelhetőséget ad, nem kevesebb kódot a kliensen.

  2. Miért nem elég önmagában az, hogy „a Nuxt kényelmesebb”, a döntéshez?
    Válasz

    Mert a kényelemért keretrendszer-kötöttséggel fizetsz: kb. 2-3 évente egy major migráció (a Nuxt 3 támogatása épp most, 2026. július 31-én járt le), nehezebb hibakeresés a szerver+kliens kettősség miatt (hydration mismatch), függés a modul-ökoszisztémától, lassabb build. Ha a hasznot nem kapod meg — például mert az app teljesen auth mögött van —, akkor csak a költséget vetted meg.

  3. Két olyan hibaosztály, ami SPA-ban nem létezik, Nuxtban viszont igen?
    Válasz

    Hydration mismatch: a szerveren és a kliensen renderelt kimenet eltér (például Date.now(), véletlenszám vagy window-függő logika miatt). ② Cross-request state pollution: modulszintű változóban tárolt állapot a szerveren megosztott a kérések között, így az egyik felhasználó adata átszivároghat a másikhoz. Mindkettőre visszatérünk (3. és 6. modul).

  4. Miért jobb a Nuxt Workers-en, mint a Next.js — és mikor nem számít ez?
    Válasz

    Mert a Nitro preset-rendszere miatt a Workers első osztályú build-célpont, míg a Next.js-hez egy külön adapter-projekt (OpenNext) kell, ami szükségszerűen követő pozícióban van. Nem számít ez viszont akkor, ha a csapat React-es: a keretrendszer-előny nem éri meg egy teljes ökoszisztéma-váltás kockázatát.

  5. Nevezz meg három dolgot, ami Cloudflare-en máshogy megy, mint egy Node-szerveren futó Nuxtnál.
    Válasz

    Bármelyik három: ① nem minden npm-csomag működik, mert a runtime nem Node (sharp, bcrypt, fájlrendszer-igényes libek); ② van bundle-méret limit; ③ a CPU-idő korlátos és mérve van, tehát a nehéz SSR-nek ára van; ④ az isr/swr route rule nem platform-natívan működik, mint Vercelen/Netlifyon; ⑤ nincs fájlrendszer, helyette useStorage() KV/R2 driverrel.

ElőzőTematika — Tematika és kiindulási pont Következő 2. modul — A Nuxt anatómiája: mi épül, és mi hol fut