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.
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:
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.
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 / API | Pages Functions (korlátozott Workers) | teljes értékű Worker |
| Bindings | részleges választék | teljes (DO, Queues, Workflows, Containers…) |
| Release-eszközök | preview deployments | versions, preview URL-ek, gradual deploy, rollback |
| Fejlesztési irány | karbantartás | ide érkezik minden új funkció |
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.
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.
A Cloudflare-világ a defineEventHandler kontextusán át érhető el — itt ér össze az 1. modul bindings-modellje a megszokott Nuxt-kódoddal:
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.
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.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-feladat | Workers-megfelelő |
|---|---|
| Distribution + origin-ök konfigurálása | nincs — a deploy maga a „distribution" |
| Cache invalidation deploy után | nem 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ályok | SSR-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 |
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
},
});
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.
run_worker_first, és mondj rá konkrét példát a saját appodból.
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/*"].
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.
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.
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.