22. modulReferencia: a Nuxt-konvenciók térképe
Nuxt for Devs · 22. modul

Referencia: a Nuxt-konvenciók térképe

Ez a modul nem olvasásra készült, hanem visszakeresésre. Egy helyen a könyvtárszerkezet, a fájlnév-konvenciók, az auto-import szabályai, a beépített composable-ök és komponensek, a szerveroldali segédfüggvények, a Cloudflare-releváns konfigurációs kulcsok és a parancsok. A végén a tanfolyam térképe: melyik modul melyik kérdésre válaszol.

22.1Könyvtárszerkezet (Nuxt 4)

projekt/
├─ app/                      ← a Vue-alkalmazás
│  ├─ assets/                build által feldolgozott eszközök
│  ├─ components/            auto-import, tetszőleges mélységig
│  ├─ composables/           auto-import — csak a legfelső szint
│  ├─ layouts/               <NuxtLayout> által használt sablonok
│  ├─ middleware/            útvonal-middleware (kliens + szerver)
│  ├─ pages/                 fájlrendszer-alapú útvonalak
│  ├─ plugins/               indulási kód, sorrend fájlnév szerint
│  ├─ utils/                 auto-import — csak a legfelső szint
│  ├─ app.vue                a gyökérkomponens
│  ├─ app.config.ts          reaktív, NEM titkos konfiguráció
│  └─ error.vue              teljes képernyős hibaoldal
├─ server/                   ← a Nitro-szerver (workerd-ben fut)
│  ├─ api/                   /api/ prefixszel
│  ├─ routes/                prefix NÉLKÜL
│  ├─ middleware/            MINDEN kérésre fut, ábécésorrendben
│  ├─ plugins/               Nitro-életciklus horgok
│  ├─ tasks/                 ütemezett/kézi feladatok
│  └─ utils/                 auto-import a szerveren
├─ shared/                   ← mindkét oldalról elérhető
│  ├─ utils/                 auto-import
│  └─ types/                 auto-import
├─ layers/                   saját rétegek (14. modul)
├─ modules/                  helyi Nuxt-modulok
├─ public/                   érintetlenül kiszolgált fájlok
├─ nuxt.config.ts
└─ wrangler.jsonc            ← a Cloudflare-oldal (17. modul)
A shared/ két szigorú szabálya: (1) csak a shared/utils/ és shared/types/ tartalma importálódik automatikusan, az alkönyvtárak nem — hacsak fel nem veszed őket az imports.dirs ÉS a nitro.imports.dirs listába; (2) a shared/-ban lévő kód nem importálhat sem Vue-, sem Nitro-kódot, mert két külön bundle-be kerül. Minden más fájlt innen kézzel kell importálni a #shared aliassal.

22.2Fájlnév-konvenciók

Oldalak (app/pages/)

FájlÚtvonalMegjegyzés
index.vue/a könyvtár gyökere
rolunk.vue/rolunkstatikus szegmens
[id].vue/123dinamikus szegmens
[[slug]].vue/ és /tesztopcionális paraméter
[...slug].vue/a/b/cmindent elkapó
felhasznalo-[csoport]/[id].vue/felhasznalo-admin/123szegmensen belüli paraméter
(marketing)/rolunk.vue/rolunkútvonal-csoport — a zárójel nem kerül az URL-be
szulo.vue + szulo/gyerek.vue/szulo/gyereka szülőbe <NuxtPage /> kell
szulo/gyerek@oldalsav.vuenevesített nézeta szülő <NuxtPage name="oldalsav" />-be renderel

Egyéb utótagok

MintaHolJelentés
Valami.client.vuekomponenscsak a kliensen renderelődik
Valami.server.vuekomponenscsak a szerveren (sziget)
auth.global.tsmiddlewareminden útvonalváltásra fut
01.setup.client.tspluginsorrend + csak kliensen
termekek.get.tsserver routecsak GET
termekek.post.tsserver routecsak POST (ugyanaz az URL)
[id].delete.tsserver routemetódus + paraméter
10-auth.ts, 99-proxy.tsserver middlewareábécésorrend = futási sorrend

22.3Auto-import: mi, honnan, meddig

ForrásHovaMélység
app/components/**Vue-oldaltetszőleges — a név a útvonalból áll össze
app/composables/Vue-oldallegfelső szint + */index.ts
app/utils/Vue-oldallegfelső szint
server/utils/szerveroldallegfelső szint
shared/utils/, shared/types/mindkettőlegfelső szint
Nuxt beépített composable-ökVue-oldalmindig
h3-segédfüggvényekszerveroldalmindig
Vue API (ref, computed…)Vue-oldalmindig
Komponensnév-képzés: app/components/bolt/KosarSor.vue<BoltKosarSor />. A könyvtárnév beépül a névbe, ezért nem ütköznek az azonos nevű komponensek különböző mappákban. Ha ez zavaró, a components: [{ path: '~/components', pathPrefix: false }] kikapcsolja.

22.4Composable-referencia

TerületAmit használsz
AdatlekérésuseFetch, useLazyFetch, useAsyncData, useLazyAsyncData, $fetch, useNuxtData, refreshNuxtData, clearNuxtData
ÁllapotuseState, clearNuxtState, useCookie, callOnce
ÚtvonaluseRoute, useRouter, navigateTo, abortNavigation, definePageMeta, addRouteMiddleware, setPageLayout, useLayout
KonfigurációuseRuntimeConfig, useAppConfig, updateAppConfig
Fejléc / SEOuseHead, useHeadSafe, useSeoMeta, useServerSeoMeta
HibacreateError, showError, clearError, useError
Kérés (csak szerveren)useRequestEvent, useRequestHeaders, useRequestURL, useRequestFetch, useResponseHeader
ÉletciklususeNuxtApp, onNuxtReady, onPrehydrate, reloadNuxtApp
Betöltés / UXuseLoadingIndicator, useRouteAnnouncer, useId, usePreviewMode
ElőtöltéspreloadComponents, prefetchComponents, preloadRouteComponents
DefiniálókdefineNuxtPlugin, defineNuxtRouteMiddleware, defineNuxtComponent, defineAppConfig
A composable-kontextus szabálya (3. modul): a Nuxt composable-jei csak setup-ban, pluginben, middleware-ben vagy defineNuxtRouteMiddleware-ben hívhatók — nem egy await után, és nem eseménykezelőben. A klasszikus hibaüzenet erre a NUXT_E1001; ha mégis kell, nuxtApp.runWithContext().

22.5Komponens-referencia

KomponensMire
<NuxtPage />az aktuális oldal helye; szülőoldalban a gyerekútvonalak helye
<NuxtLayout>layout-burkoló; name proppal váltható
<NuxtLink>kliensoldali navigáció + automatikus előtöltés
<ClientOnly>csak kliensen renderel; #fallback slottal
<DevOnly>csak fejlesztésben renderel, a produkciós buildből kiesik
<NuxtErrorBoundary>lokális hibakezelés; #error slot error és clearError propokkal
<NuxtLoadingIndicator>navigációs folyamatjelző sáv
<NuxtRouteAnnouncer>képernyőolvasóknak jelzi az oldalváltást
<NuxtIsland>szerveroldali sziget, kliens-JS nélkül
<LazyValami hydrate-* />késleltetett hidratálás (15. modul)

Hidratálási stratégiák

AttribútumMikor hidratál
hydrate-on-visibleamikor a nézetbe kerül
hydrate-on-idleamikor a böngésző tétlen
hydrate-on-interactionelső interakcióra (alap: pointerenter, focus)
hydrate-on-media-queryha a média-lekérdezés illeszkedik
hydrate-aftermegadott ezredmásodperc után
hydrate-whenamikor a kifejezés igazzá válik
hydrate-neversoha — a legolcsóbb nyereség

22.6Szerveroldali segédfüggvények

TerületFüggvények
KezelődefineEventHandler, defineCachedEventHandler, defineCachedFunction, defineNitroPlugin, defineTask
BemenetgetRouterParam(s), getQuery, getValidatedQuery, readBody, readValidatedBody, readRawBody, readMultipartFormData
KérésgetRequestURL, getRequestIP, getHeader, getHeaders, getCookie, getRequestHeaders
VálaszsetResponseStatus, setResponseHeader(s), appendResponseHeader, setCookie, deleteCookie, sendRedirect, sendStream, sendNoContent
HibacreateError — API-route-ból a message nem propagál, a data igen
ProxyproxyRequest, sendProxy, getProxyRequestHeaders
KörnyezetuseRuntimeConfig(event), useStorage, useNitroApp

Cloudflare-elérés a kezelőben

// Nuxt 4 / Nitro v2
const { env, context, cf } = event.context.cloudflare
env.DB              // bindingok
context.waitUntil(p)  // utómunka a válasz után
cf.country          // geoadat

// Nitro v3-ban ez event.req.runtime.cloudflare.env lesz — tedd wrapper mögé!

22.7nuxt.config.ts: a Cloudflare-releváns kulcsok

export default defineNuxtConfig({
  // ——— renderelés ———
  ssr: true,
  routeRules: { /* 22.8 */ },

  // ——— konfiguráció (12. modul) ———
  runtimeConfig: {
    dbUrl: '',                    // szerver-only; NUXT_DB_URL írja felül
    public: { siteUrl: '' },        // kliensre is kimegy!
  },

  // ——— Nitro / Cloudflare ———
  nitro: {
    preset: 'cloudflare_module',
    sourceMap: true,                // alap: false (16.8)
    storage: { /* cache → KV mount, 7. modul */ },
    cloudflare: { wrangler: { /* inline bindingok, 18.3 */ } },
  },

  // ——— teljesítmény / hibakeresés ———
  sourcemap: { client: 'hidden' },  // Sentrynek (20.7)
  experimental: { emitRouteChunkError: 'manual' },
  tracingChannel: true,             // 4.5+ (16.10)

  // ——— környezetek ———
  $production: { /* … */ },
  $development: { /* … */ },
  $env: { staging: { /* --envName staging */ } },

  // ——— újrafelhasználás (14. modul) ———
  extends: ['./layers/alap', 'github:ceg/nuxt-alap#main'],
})

22.8routeRules referencia

SzabályHatásWorkers-en
prerender: truebuild-időben HTML-léasset lesz, ingyenes — de a middleware nem fut (17.2)
ssr: falseüres váz, kliensoldali renderelésSPA-sziget
swr: 3600elavultat szolgál, közben frissítKV-mount kell, különben isolate-memória (7. modul)
isr: 3600igény szerinti előrenderelésugyanaz a kikötés
cache: { maxAge }Nitro-szintű cachea tárolót be kell állítani
headers: {…}válaszfejlécekitt állítod a Cache-Control-t (20.6)
redirect: '/uj'átirányítás
cors: trueCORS-fejlécek
noScripts: truenincs kliens-JS az oldalontiszta HTML-oldalakhoz
appMiddleware: […]middleware ki/be útvonalanként

22.9Parancsok

ParancsMire
nuxt devfejlesztői szerver HMR-rel (18.2)
nuxt build.output/ előállítása
nuxt build --envName staging$env szerinti build-konfig
nuxt prepare.nuxt/ és a típusok újragenerálása
nuxt typechecktípusellenőrzés
nuxt module add <név>modul telepítése és bekötése
wrangler devvalódi workerd a .output-on; D = DevTools
wrangler dev -e stagingmásik környezet bindingjaival
wrangler deployfeltöltés + azonnali 100% forgalom
wrangler deploy --dry-run --outdir=.bbundle-méret mérése (15. modul)
wrangler check startupindulási profil és méret
wrangler versions uploadverzió forgalom nélkül + preview URL
wrangler versions upload --preview-alias pr-42beszédes preview URL
wrangler versions deployforgalomra állítás, akár fokozatosan
wrangler rollback <id>azonnali visszaállás
wrangler tail --status errorélő hibafolyam
wrangler secret put <KULCS>titok feltöltése
wrangler types --checkbinding-típusok naprakészsége (CI)
wrangler d1 execute <db> --local --file=…lokális seed — a --local nélkül ÉLES!

22.10„Melyik kódom hol fut?”

HolBuildSzerver (workerd)Kliens
nuxt.config.tsigennemnem
modules/igennemnem
server/**nemigennem
app/pages/, components/nemigen (SSR)igen
app/composables/, utils/nemigenigen
app/middleware/nemigen (első kérés)igen (navigáció)
app/plugins/*.tsnemigenigen
*.client.ts / .client.vuenemnemigen
*.server.ts / .server.vuenemigennem
shared/**nemigenigen
public/nem fut — statikus asset, ingyenes (17.1)
A középső sáv a veszélyzóna. Ami mindkét oszlopban zöld, az kétszer fut le: egyszer a Workerben, egyszer a böngészőben. Ide nem való titok (12. modul), nem való modul-szintű mutable állapot (6. modul), és nem való nem-determinisztikus érték (6. modul hidratálási eltérései). Ha egy kód helyét nem tudod megmondani ebből a táblából, ne írj bele semmit, ami számít.

22.11A tanfolyam térképe

ModulA kérdés, amire válaszol
1Miért Nuxt a Vue SPA + Express helyett, és mit fizetek érte?
2Mi történik a nuxt build alatt, és mi hol fut?
3Mit kell másképp csinálnom, mint Vue-ban?
4Hogyan lesz a fájlokból útvonal, és melyik „middleware” véd tényleg?
5Hogyan kérek le adatot úgy, hogy ne fusson kétszer?
6Hova tartozik az állapot, és miért látja egyik felhasználó a másikét?
7Melyik oldal renderelődjön mikor, és mit tud ebből Workers?
8Hogyan írok API-t Express helyett h3-mal?
9Full-stack Nuxt vagy megmaradó külön API?
10Hogyan oldom meg a bejelentkezést szerver-session nélkül?
11Hogyan érem el az adatbázist, és melyik ORM-mel?
12Hol lakik a konfiguráció, és mi nem szivároghat ki?
13Melyik npm-modul fog működni Workers-en?
14Hogyan használok újra kódot több projekt vagy tenant között?
15Mitől lassú, és melyik számot kell mérnem?
16Hogyan tesztelek és keresek hibát — és mit nem lát a tesztem?
17Hogyan megy ki élesbe úgy, hogy vissza is tudjak lépni?
18Hogyan fejlesztek lokálisan valódi bindingokkal?
19Miért történik ez a furcsaság? (katalógus)
20Mi kell ahhoz, hogy élesben ne érjen meglepetés?
21Hogyan költöztetem át a meglévő rendszeremet leállás nélkül?
22Hol volt az a konvenció? (ez a modul)

22.12Hova tovább

Az öt szabály, ami a huszonkét modulból megmarad

  1. Tudd, hol fut a kódod. A 22.10-es tábla középső sávja a legtöbb rejtélyes hiba forrása. Ha nem tudod megmondani, hol fut egy sor, ne bízz rá semmi fontosat.
  2. Semmi mutable a modul-scope-ban. Egy szabály, két független indok: biztonság (kereszt-kérés szivárgás) és teljesítmény (minden hidegindításkor lefut).
  3. A tesztkészleted Node-ban fut, az appod nem. Az egyetlen teszt, ami a valóságról szól, a valódi deploy ellen futó füstteszt — és a host opció miatt ez ugyanaz a fájl.
  4. Hitelesített oldalt soha ne cache-elj megosztott cache-ben. Ez a tanfolyam egyetlen olyan hibája, ami nem lassulás, hanem adatszivárgás.
  5. A korlátok nem ellenségek. A CPU-limit, a bundle-limit és az isolate-modell olyan fegyelmet kényszerít ki, ami Node-ban is jó gyakorlat lenne — csak ott semmi nem kényszerít rá.

Ami innen következik, az már nem tananyag, hanem gyakorlat. Két javaslat a folytatásra:

És egy záró megjegyzés a verziókról. Ez az anyag 2026 augusztusában készült, Nuxt 4.5-re és a Nitro v2-es vonalra. A Nitro v3 (és vele a Nuxt 5) néhány dolgot át fog nevezni — a legfontosabb az event.context.cloudflareevent.req.runtime.cloudflare váltás. Ezért javasoltam több helyen is, hogy a bindingokhoz és a Cloudflare-kontextushoz saját segédfüggvényen keresztül nyúlj. Ha ezt megfogadtad, a váltás egy fájl átírása lesz — ha nem, hetvené.
Előző21. modul — Migrációs recept: Vue SPA + Express → Nuxt KövetkezőEz az utolsó modul