A Nuxt legnagyobb kényelmi előnye a modulrendszer: egy sor a konfigban, és kész a képoptimalizálás vagy az i18n. Csakhogy a modulok nem egyformán viselkednek edge-runtime alatt. Ez a modul nem katalógus, hanem szűrő: négy kérdés, amivel bármelyik modulról eldöntöd, hogy megy-e — plusz egy megrostált lista arról, amit ténylegesen érdemes használni.
Nem sima npm-függőség, hanem build-időben lefutó kód, ami módosítja a projektedet: hozzáad fájlokat a virtuális fájlrendszerhez, regisztrál komponenseket és composable-öket, felvesz server route-okat, átírja a Vite- vagy a Nitro-konfigot.
Ebből három gyakorlati következmény adódik:
Mielőtt beveszel egy modult, fusd át ezt a négyet. Öt perc, és megspórolja a „deploy után 500-as” estét:
| # | Kérdés | Hogyan derül ki |
|---|---|---|
| 1 | Fut-e futásidőben a szerveren? Ha csak build-time (pl. ikon-generálás, CSS), akkor Workers-en nem érdekes. | Van-e runtime/server/ könyvtára a modulnak; ad-e hozzá server handlert. |
| 2 | Van-e natív függősége? A natív addon soha nem fut a workerd-ben. |
npm ls sharp canvas bcrypt better-sqlite3 — vagy nézd meg a modul dependencies-ét. |
| 3 | Használ-e fájlrendszert futásidőben? Nincs fs. |
A modul dokumentációja említ-e cache-könyvtárat, .cache/-t, feltöltési mappát. |
| 4 | Mekkora a bundle-hatása? Van méretlimit (15. modul). | Mérd: wrangler check startup a modul előtt és után (11.3). |
| Modul | Mire | Workers-en |
|---|---|---|
nuxt-auth-utils | Session, OAuth, jelszó-helperek (10. modul) | Megy |
@vueuse/nuxt | Több száz apró composable, SSR-tudatosan | Megy — tisztán kliens/izomorf |
@nuxt/fonts | Webfont-kezelés, self-hosting, layout-ugrás nélkül | Build-idejű, nincs futásidejű kockázat |
@nuxt/image | Képoptimalizálás — de nem az alapértelmezett providerrel | Lásd a 13.4-et |
@nuxtjs/i18n | Több nyelv, path-prefix, lokalizált route-ok | Megy — a fordítások a bundle-ben |
@nuxt/test-utils | Komponens- és e2e-teszt (16. modul) | Dev-only |
nitro-cloudflare-dev | Bindingok lokálisan (18. modul) | Dev-only |
| Modul | Mire | Mérlegelés |
|---|---|---|
@pinia/nuxt | Store-kezelés | Csak ha tényleg összetett a domain-logika — a useState sokáig elég (6. modul) |
@nuxt/ui | Kész komponenskönyvtár Tailwinddel | Sok kódot spórol, de a stílusod hozzáköti. Alternatíva: sima Tailwind + néhány saját komponens |
@nuxtjs/seo (sitemap, robots, schema) | SEO-eszközök egy csomagban | Hasznos, de nézd meg, mennyi fut belőle futásidőben (a sitemap-generálás igen). A 20. modulban részletesen |
@nuxt/scripts | Harmadik fél scriptek (analitika, chat) betöltés-optimalizálva | Jó, ha sok külső scriptet töltesz — egyébben túlzás |
@vite-pwa/nuxt | PWA, service worker, offline | Ha az appod „app-szerű”. Óvatosan az SSR-rel: a service worker cache-e és az SSR-payload együtt meglepetéseket okoz |
@nuxt/content | Markdown-alapú tartalom (blog, doksi) | v3-ban Workers-en is megy, D1-gyel — lásd a 13.5-öt |
sharp-ot húz be. Képfeldolgozó, PDF-előnézet, thumbnail-generátor — a sharp natív addon, nem fut. Ha egy modul függőségei közt ott van, az nem konfigurálható meg..cache/-be írnak futásidőben. Fejlesztés közben működnek, élesben nem — a 2. modul dev-vs-prod táblája.@nuxtjs/ névtérben van néhány, ami évek óta nem frissült. Nem attól rossz, hogy régi — attól, hogy a következő majornál te fogod javítani.@nuxt/image — a leggyakoribb Workers-buktatóEz a modul kerül elő először, és itt esik szét először a „csak telepítem és megy” érzés.
Az @nuxt/image alapértelmezett providere (IPX) a szerveren dolgozza fel a képet — átméretez, formátumot vált, tömörít. Ehhez a sharp könyvtárat használja, ami natív addon. Workers-en ez nem opció, és nem is lesz az.
A jó hír: nem is kell, mert a Cloudflare ezt a réteget amúgy is adja. Két provider van:
cloudflare provider | cloudflareImages provider | |
|---|---|---|
| Mit használ | Image Transformations a zónádon (/cdn-cgi/image/…) | Cloudflare Images (feltöltött, kezelt képek) |
| A kép honnan jön | Bármilyen URL-ről, amit te szolgálsz ki (pl. R2, saját domain) | A Cloudflare Images tárolójából |
| Mikor jó | A képeid már nálad vannak (R2, statikus assetek) | Felhasználó tölt fel képeket, és kell hozzá tárolás + variánsok |
| Előfeltétel | Image Transformations bekapcsolva a zónán | Cloudflare Images előfizetés |
// nuxt.config.ts — a zóna-alapú út
export default defineNuxtConfig({
modules: ['@nuxt/image'],
image: {
provider: 'cloudflare',
cloudflare: {
baseURL: 'https://app.pelda.hu', // a zónád — a /cdn-cgi/image/ automatikusan kerül elé
},
// a szokásos méret-készlet, hogy ne kelljen minden <NuxtImg>-nél megadni
screens: { sm: 640, md: 768, lg: 1024, xl: 1280 },
},
})
<template>
<NuxtImg
src="/uploads/acme/borito.jpg"
width="960" height="540"
sizes="sm:100vw md:50vw lg:960px"
format="webp"
loading="lazy"
/>
</template>
/cdn-cgi/image/ út csak a Cloudflare-hálózaton létezik — nuxt dev alatt nincs. Fejlesztés közben ezért érdemes provider nélkül (vagy provider: 'none'-nal) dolgozni, és a képes megjelenést preview-deployon ellenőrizni. Ez a 2. modul dev-vs-prod különbségének egy konkrét esete.@nuxt/content — megy, de tudni kell, hogyanA Content v3 lecserélte a régi, fájlrendszer-alapú modellt egy SQL-alapúra, és ezzel serverless környezetben is működik: a tartalom build-időben adatbázisba kerül, futásidőben pedig onnan olvassa. Cloudflare-en ez D1.
Két dolgot érdemes tudni róla, mielőtt beveszed:
prerender: true szabálya egyszerűbb és olcsóbb — sima .vue oldalak, build-időben statikussá téve, nulla futásidejű költséggel. A Content akkor éri meg, ha a tartalom mennyisége vagy a szerkesztési folyamat (Markdown, nem-fejlesztő szerzők) indokolja.Akkor, ha ugyanazt a setupot harmadszor másolod be egy projektbe, vagy ha több appod osztozik egy konvención. Egy modul váza meglepően rövid:
// modules/tenant-context.ts — a projekt gyökerében lévő modules/ automatikusan betöltődik
import { defineNuxtModule, addServerHandler, addImports, createResolver } from '@nuxt/kit'
export default defineNuxtModule({
meta: { name: 'tenant-context', configKey: 'tenantContext' },
defaults: { headerName: 'x-tenant' },
setup(options, nuxt) {
const { resolve } = createResolver(import.meta.url)
// ① szerver middleware regisztrálása (4. modul)
addServerHandler({
middleware: true,
handler: resolve('./runtime/server/tenant'),
})
// ② composable auto-importtal
addImports({ name: 'useTenant', from: resolve('./runtime/composables/useTenant') })
// ③ konfiguráció átadása a futásidőnek
nuxt.options.runtimeConfig.public.tenantHeader = options.headerName
},
})
| Kit-segédfüggvény | Mire |
|---|---|
addServerHandler | Server route vagy middleware regisztrálása |
addImports | Composable auto-importba tétele |
addComponent | Komponens elérhetővé tétele |
addPlugin | App-plugin regisztrálása |
extendPages | Route-ok hozzáadása vagy módosítása |
addTemplate | Generált fájl a .nuxt/-ba (pl. típusok) |
wrangler check startup (11.3) megmondja, mennyit nőtt a bundle és a hidegindítás. Egy modul, ami 300 KB-ot hoz egy ritkán használt funkcióért, rossz üzlet.modules tömbben többet ér, mint egy hónap múlva a kideríteni, miért nem érvényesül valami.Mert build-időben lefutó kód, ami módosítja a projektet: fájlokat ad a virtuális fájlrendszerhez, komponenseket és composable-öket regisztrál, server route-okat vesz fel, átírja a Vite/Nitro konfigot. Ezért számít a sorrendjük, és ezért lehet egy modul teljesen ártalmatlan Workers-en (ha csak build-idejű) vagy kockázatos (ha futásidejű kódot is hoz).
① Fut-e futásidőben a szerveren, vagy csak build-time? ② Van-e natív függősége (sharp, canvas, better-sqlite3)? ③ Ír-e a fájlrendszerre futásidőben? ④ Mekkora a bundle- és hidegindítás-hatása? Plusz az ötödik, íratlan: karbantartott-e, támogatja-e a jelenlegi Nuxt-majort.
@nuxt/image alapértelmezés szerint, és mi a megoldás?
Mert az alapértelmezett IPX provider a szerveren dolgozza fel a képet a sharp natív könyvtárral, ami nem fut a workerd-ben. Megoldás: a cloudflare provider (Image Transformations a zónán, /cdn-cgi/image/) vagy a cloudflareImages provider. Így a transzformáció a Cloudflare hálózatán történik, cache-elve, a te CPU-időd nélkül.
@nuxt/content v3-ról Workers-en?
Hogy működik — a v3 SQL-alapú, és Cloudflare-en D1-et használ. Két dolgot mérlegelj: kell hozzá egy D1-adatbázis és a tartalom-frissítés deployhoz kötött; illetve a kliensoldali navigációhoz WASM SQLite töltődik a böngészőbe, ami méretben számít. Kevés statikus oldalnál a prerender: true egyszerűbb és olcsóbb.
Modult akkor, ha viselkedést osztanál meg programozottan: middleware, composable, konfigurációs konvenció — jellemzően ha harmadszor másolod ugyanazt a setupot. Layert akkor, ha fájlkészletet: oldalakat, komponenseket, layoutokat, arculatot, amit a másik projekt felül tud írni. Utóbbi a 14. modul témája.
A modul futásidejű részében: valószínűleg olyan Node-API-ra vagy natív függőségre támaszkodik, ami nuxt dev alatt (Node-ban) elérhető, a workerd-ben nem. Ezért kell minden modul-frissítést preview-deployon ellenőrizni — ez az egyetlen hely, ahol valódi Workers-runtime alatt fut a kód.