3. modulFull-stack és frontend: Nuxt a Workers-en
Cloudflare for Devs · 3. modul

Full-stack és frontend: Nuxt a Workers-en

Ebben a modulban a te fő stackedet tesszük át fejben: hogyan lesz a CloudFront + S3 + ALB + Beanstalk négyesből egyetlen deploy-egység, és pontosan hogyan fut egy Nuxt-alkalmazás a Cloudflare-en.

3.1A nagy egyszerűsödés: négy rétegből egy

Idézzük fel, mi kell ma egy éles Nuxt apphoz AWS-en: a statikus buildet S3-ba teszed, elé CloudFront distributiont konfigurálsz (origin-ök, behavior-ök, invalidation deploykor), az SSR-hez Node-szerver fut Beanstalkon ALB mögött, és a kettő határvonalát a CDN routing-szabályaiban kézzel húzod meg. Négy szolgáltatás, négyféle konfiguráció, és a „melyik réteg cache-el most rosszul?" típusú hibakeresés.

A Workers-modellben ugyanez egyetlen egység: a Worker deploy tartalmazza az SSR-kódot és a statikus asseteket (Static Assets), a CDN-viselkedés pedig a platform beépített tulajdonsága. A kérés-útvonal döntési logikája így néz ki:

Kérés a PoP-ba GET /about, /api/… run_worker_first illeszkedik? (pl. /api/*) Statikus asset match? /_nuxt/*.js, képek, css Worker fut Nitro SSR / API route kiszolgálás cache-ből, ingyen Response HTML / JSON nem igen van nincs
3. ábra — Alapértelmezés: az asset-találat a Worker futtatása nélkül, cache-ből megy ki; minden más az SSR Workerhez kerül. A run_worker_first-tel kivételeket adsz meg (pl. auth-védett útvonalak).

Két szabályt érdemes megjegyezni. Egy: asset először — ha az URL statikus fájlra illeszkedik, a Worker el sem indul (nem is fizetsz érte: az asset-kérések ingyenesek és korlátlanok). Kettő: ha a Worker kap egy kérést, bármikor vissza is dobhatja az asseteknek az env.ASSETS.fetch(request) hívással.

3.2Pages vs. Workers — tegyük rendbe egyszer s mindenkorra

Keresgélés közben két párhuzamos világot fogsz látni a docsban és a tutorialokban: Cloudflare Pages (a „Netlify-szerű" frontend-hosting, saját Git-integrációval, *.pages.dev domainnel) és Workers Static Assets. A történet egyszerű: a Pages volt az első full-stack válasz, de a platform két lábon állt — a Pages Functions valójában Workers volt, korlátozott képességekkel. 2024–25-ben a Cloudflare összevonta a két világot: a Workers megkapta a statikus asset-kiszolgálást, és minden új képesség oda érkezik (gradual deployments, teljes bindings-választék, observability, Durable Objects…). A Pages működik és támogatott, de funkcionálisan lezárt — új projektet Workersre építs, meglévő Pages-projekthez pedig van hivatalos migrációs útmutató.

Pages (örökség)Workers + Static Assets (ajánlott)
Statikus fájlok✔ (ingyenes asset-kérések)
SSR / APIPages Functions (korlátozott Workers)teljes értékű Worker
Bindingsrészleges választékteljes (DO, Queues, Workflows, Containers…)
Release-eszközökpreview deploymentsversions, preview URL-ek, gradual deploy, rollback
Fejlesztési iránykarbantartáside érkezik minden új funkció

3.3Nuxt a Workers-en: hogyan áll össze

A jó hír: a Nuxt szerveroldali motorja, a Nitro, natívan ismeri a Cloudflare-t. A cloudflare_module preset a buildkor két részre bontja az appot: a kliens-bundle és a statikus fájlok mennek a Static Assets-be, a szerveroldal (SSR + a server/ mappád API route-jai) pedig egyetlen Worker-modullá fordul. Vagyis a Nuxt-kódod nem változik — a route-ok, a defineEventHandler-es API-k, a middleware-ek ugyanazok maradnak; a build-cél változik.

nuxt.config.ts
export default defineNuxtConfig({
  nitro: {
    preset: "cloudflare_module",   // Worker-modul + Static Assets build
  },
  modules: ["nitro-cloudflare-dev"], // bindings lokális dev alatt is
});
wrangler.jsonc
{
  "name": "my-nuxt-app",
  "main": "./.output/server/index.mjs",   // a Nitro által generált Worker
  "compatibility_date": "2026-08-02",
  "compatibility_flags": ["nodejs_compat"],
  "assets": {
    "directory": "./.output/public",      // kliens-bundle, képek, css
    "binding": "ASSETS"
  },
  // és ide jönnek majd a bindings: hyperdrive, r2_buckets, queues…
}

Új projektnél az egészet a generátor összerakja (npm create cloudflare@latest -- my-app --framework=nuxt); meglévő projektnél a fenti két fájl a lényeg. A deploy innen már ismerős: npm run build && wrangler deploy.

Bindings elérése a Nuxt server route-okban

A Cloudflare-világ a defineEventHandler kontextusán át érhető el — itt ér össze az 1. modul bindings-modellje a megszokott Nuxt-kódoddal:

server/api/upload.post.ts
export default defineEventHandler(async (event) => {
  const { env, context } = event.context.cloudflare;

  // R2-be írás — mintha lokális objektum lenne (6. modul)
  await env.UPLOADS.put(`u/${crypto.randomUUID()}`, event.node.req);

  // háttérmunka a válasz után (2. modul!)
  context.waitUntil(trackUpload(env));

  return { ok: true };
});

Típusokhoz futtasd a wrangler types-t, és deklaráld az env-et a H3EventContext-en — így az env.UPLOADS teljesen típusos. Lokális fejlesztésnél a nitro-cloudflare-dev modul a Wrangler-konfigod alapján szimulálja a bindingokat a megszokott nuxt dev alatt — tehát marad a HMR-es, gyors Nuxt-élmény, miközben R2/KV/D1 hívásaid működnek.

Mire figyelj Node-háttérrel: a szerveroldali kódod mostantól a workerd runtime-ban fut (2. modul szabályai élnek): nincs process-szintű global cache, nincs lokális diszk, a nehéz npm-függőségeket (pl. puppeteer, sharp natív binárissal) edge-kompatibilis alternatívára kell cserélni. A gyakorlatban egy „átlagos" Nuxt app (API route-ok, DB-hívások, auth) gond nélkül átmegy — a kivételek szinte mindig natív binárisos csomagok.

3.4Cache és CDN: amit a CloudFrontnál konfiguráltál, itt alapértelmezés

A statikus assetek cache-elése automatikus: az első kérés után az asset a legközelebbi PoP-ban cache-elődik, a tiered caching pedig gondoskodik róla, hogy távoli PoP-ok is egymástól, ne a tárolótól kérjék. Amit a CloudFrontnál kézzel csináltál, itt így alakul:

CloudFront-feladatWorkers-megfelelő
Distribution + origin-ök konfigurálásanincs — a deploy maga a „distribution"
Cache invalidation deploy utánnem kell: a deploy atomikus, az új verzió assetjei azonnal konzisztensek (a fingerprintelt /_nuxt/* fájlok pedig örökre cache-elhetők)
Behavior-önként cache-szabályokSSR-válaszoknál te adod a Cache-Control headert; a Nuxt routeRules (pl. swr, isr, cache) Nitro-szinten intézi
Custom headers / redirects a CDN-en_headers és _redirects fájlok az asset-mappában — natívan támogatott
nuxt.config.ts — route-szintű cache-stratégia
export default defineNuxtConfig({
  routeRules: {
    "/":          { swr: 600 },       // stale-while-revalidate 10 percig
    "/blog/**":   { isr: 3600 },      // generálás után 1 óráig cache
    "/admin/**":  { cache: false },   // soha ne cache-eld
  },
});
A gondolkodásbeli váltás: CloudFrontnál a cache egy előtted álló, külön konfigurált réteg volt, aminek a viselkedését distribution-szabályokkal vezérelted. Itt a cache ott van, ahol a kódod fut — assetekre automatikus, dinamikus válaszokra pedig ugyanabban a kódban döntesz róla (header vagy routeRule), ahol a választ előállítod. Egy réteggel kevesebb, aminek a konfigurációja elcsúszhat a kódtól.

3.5Ellenőrizd magad

  1. Mi történik alapértelmezés szerint, ha egy kérés URL-je statikus assetre illeszkedik — és miért jó ez a számládnak?
    Válasz

    Az asset a Worker meghívása nélkül, cache-ből szolgálódik ki. Az asset-kérések ingyenesek és korlátlanok, tehát a forgalmad statikus része se requestet, se CPU-t nem fogyaszt.

  2. Mikor kell a run_worker_first, és mondj rá konkrét példát a saját appodból.
    Válasz

    Ha a Workernek az assetek előtt kell futnia — tipikusan auth-ellenőrzés védett útvonalakon (pl. /app/* mögötti SPA-fájlok), kérés-naplózás, A/B tesztelés. Mintaillesztéssel adod meg, kivételekkel: ["/app/*", "!/app/public/*"].

  3. Miért nem kell a Workers-en CloudFront-féle cache invalidation deploy után?
    Válasz

    A deploy atomikus egységként cseréli a Worker-kódot és az asseteket — nincs „régi origin, friss CDN" állapot. A buildelt assetek ráadásul fingerprintelt nevűek, így tartalomváltozáskor az URL is változik.

  4. Hogyan éred el az R2 bucketedet egy Nuxt server route-ból, és mi biztosítja hozzá a típusokat?
    Válasz

    event.context.cloudflare.env.MY_BUCKET — a binding a wrangler-konfigból jön; a wrangler types generálja az Env-típust, amit a H3EventContext-re deklarálsz.

  5. Meglévő Cloudflare Pages projektet találsz egy csapatnál 2026-ban. Mi a helyes tanács?
    Válasz

    Működik, nem kell pánik-migrálni — de új funkciók (gradual deploy, teljes bindings) csak Workersen érhetők el, ezért érdemes a hivatalos Pages→Workers migrációs útmutatóval áttérni, új projektet pedig eleve Workersre tenni.

Előző2. modul — Workers mélyebben: runtime, limitek, lokális fejlesztés Következő 4. modul — Adatbázis I: maradó Postgres + Hyperdrive