A legfontosabb konfigurációs beállítások a `next.config.js` fájlban

Üdvözlünk a Next.js konfigurációjának mélyebb világában! Ha valaha is építettél webalkalmazást a Next.js keretrendszerrel, valószínűleg találkoztál már a next.config.js fájllal. Ez a fájl nem csupán egy egyszerű beállítási pont; ez az a központi agy, ahol a Next.js alkalmazásod viselkedését, teljesítményét és integrációit szabályozhatod. A fejlesztők gyakran alábecsülik a benne rejlő potenciált, pedig a helyes konfiguráció kulcsfontosságú lehet az optimalizált, skálázható és biztonságos Next.js alkalmazások létrehozásához. Ebben a cikkben részletesen bemutatjuk a next.config.js fájl legfontosabb beállításait, segítve téged abban, hogy a legtöbbet hozd ki Next.js projektjeidből.

A next.config.js fájl egy Node.js modul, ami azt jelenti, hogy JavaScript kódot tartalmazhat, és dinamikusan generálhatja a konfigurációt, akár környezeti változók alapján is. Ez rendkívül rugalmassá teszi, de egyben odafigyelést is igényel. Lássuk tehát, melyek azok a kulcsfontosságú beállítások, amiket minden Next.js fejlesztőnek ismernie kell.

Alapvető és Általános Konfigurációk

reactStrictMode: Fejlesztés Biztonságosan

A reactStrictMode beállítás aktiválása erősen ajánlott minden új Next.js projektben. Ez egy fejlesztési segédprogram, amely segít azonosítani a lehetséges problémákat az alkalmazásban, például a nem biztonságos életciklus metódusok használatát, vagy a nem várt side-effekteket. Habár a produkciós buildben nincs hatása a teljesítményre, a fejlesztési fázisban rendkívül értékes eszköz lehet a robusztus és hibamentes kód írásához.

/** @type {import('next').NextConfig} */
const nextConfig = {
  reactStrictMode: true,
};

module.exports = nextConfig;

A Strict Mode duplán rendereli a komponenseket fejlesztési módban, ami segít észrevenni a váratlan mellékhatásokat. Ez hozzájárul a jobb kódminőséghez és a stabilabb alkalmazásokhoz.

swcMinify: Villámgyors Minifikálás

A Next.js 12-es verziója óta az SWC (Speedy Web Compiler) a keretrendszer alapértelmezett fordítója és minifikálója. Az swcMinify beállítás alapértelmezetten true, és ez az egyik legfontosabb oka annak, hogy a Next.js buildelése és frissítése ilyen hihetetlenül gyors. Az SWC egy Rust nyelven írt fordító, amely jelentősen felgyorsítja a fejlesztési folyamatot és a produkciós buildek elkészítését.

/** @type {import('next').NextConfig} */
const nextConfig = {
  swcMinify: true, // Alapértelmezett, de érdemes tudni róla
};

module.exports = nextConfig;

Ezt a beállítást általában nem szükséges módosítani, de fontos tudni a létéről, mivel ez az alapja a Next.js modern, nagy teljesítményű fordítási láncának.

Képek Optimalizálása: Az images Objektum

A weboldalak teljesítményének egyik legnagyobb akadálya a nem optimalizált képek. A Next.js beépített next/image komponense forradalmasította a képkezelést, de ehhez a next.config.js fájlban meg kell adnunk a szükséges beállításokat. Az images objektummal szabályozhatjuk, hogyan működik a Next.js képoptimalizálója, különösen külső forrásból származó képek esetén.

domains és remotePatterns: Külső Képek Kezelése

Ha az alkalmazásod külső forrásból (pl. CDN, CMS) tölt be képeket, azokat explicite engedélyezned kell. A régi módszer a domains tömb volt, ahol egyszerűen felsoroltad a domain neveket:

/** @type {import('next').NextConfig} */
const nextConfig = {
  images: {
    domains: ['example.com', 'anothercdn.io'],
  },
};

module.exports = nextConfig;

A Next.js 13-tól kezdve azonban a sokkal rugalmasabb és biztonságosabb remotePatterns használata ajánlott. Ez lehetővé teszi, hogy glob mintákkal és protokollokkal pontosabban meghatározd az engedélyezett képforrásokat.

/** @type {import('next').NextConfig} */
const nextConfig = {
  images: {
    remotePatterns: [
      {
        protocol: 'https',
        hostname: '**.example.com', // Engedélyezi az összes aldomaint
        port: '',
        pathname: '/my-images/**', // Engedélyezi a /my-images útvonalat
      },
      {
        protocol: 'https',
        hostname: 'images.unsplash.com',
      },
    ],
  },
};

module.exports = nextConfig;

A remotePatterns használatával pontosan szabályozhatod, honnan érkezhetnek képek, ezzel növelve az alkalmazás biztonságát és elkerülve a váratlan képhibákat. Mindig vedd figyelembe, hogy minden külső képforrást engedélyezned kell!

deviceSizes és imageSizes: Reszponzív Képek

A Next.js képoptimalizálója automatikusan generál különböző méretű képeket (srcset), hogy a böngésző a felhasználó eszközének és a viewport méretének leginkább megfelelő képet tudja betölteni. A deviceSizes és imageSizes tömbökkel testre szabhatod ezeket a méreteket.

  • deviceSizes: Azok a méretek, amelyeket a Next.js alapértelmezett képbetöltője figyelembe vesz a különböző eszközökön való megjelenítéshez (pl. telefon, tablet, desktop).
  • imageSizes: Ezek a méretek elsősorban a next/image komponens sizes attribútumával együtt használatosak, hogy finomhangolják a generált képméreteket.
/** @type {import('next').NextConfig} */
const nextConfig = {
  images: {
    deviceSizes: [320, 640, 768, 1024, 1280, 1600, 1920, 2048, 3840],
    imageSizes: [16, 32, 48, 64, 96, 128, 256, 384],
  },
};

module.exports = nextConfig;

Ezeknek a beállításoknak a gondos megválasztása jelentősen javíthatja az alkalmazás Core Web Vitals értékeit, különösen a Largest Contentful Paint (LCP) metrikát.

formats: Képformátumok

Az formats opcióval megadhatod, hogy milyen modern képformátumokat szeretnél használni, például a webp vagy az avif. Ezek a formátumok jobb kompressziót kínálnak, miközben megtartják a képminőséget, így gyorsabb betöltést eredményeznek.

/** @type {import('next').NextConfig} */
const nextConfig = {
  images: {
    formats: ['image/webp', 'image/avif'],
  },
};

module.exports = nextConfig;

Az AVIF és WebP használata erősen ajánlott, mivel jelentősen csökkenthetik a képek fájlméretét anélkül, hogy a felhasználói élmény romlana. A Next.js automatikusan kiválasztja a böngésző által támogatott legjobb formátumot.

Nemzetköziesítés (i18n): Az i18n Objektum

A globális közönséget megcélzó alkalmazásokhoz elengedhetetlen a többnyelvű támogatás. A Next.js beépített i18n routing támogatása jelentősen leegyszerűsíti a nemzetköziesítési folyamatot. A next.config.js fájlban konfigurálhatod a támogatott nyelveket és az alapértelmezett locale-t.

/** @type {import('next').NextConfig} */
const nextConfig = {
  i18n: {
    locales: ['en-US', 'hu', 'de'], // Támogatott nyelvek
    defaultLocale: 'en-US',       // Alapértelmezett nyelv
    localeDetection: false,       // Kikapcsolja a böngésző nyelvérzékelését
  },
};

module.exports = nextConfig;
  • locales: Egy tömb, amely tartalmazza az alkalmazásod által támogatott összes locale azonosítót.
  • defaultLocale: Az alapértelmezett nyelv, amelyet akkor használ a Next.js, ha a felhasználó nyelvi preferenciája nem szerepel a locales listában.
  • localeDetection: Ha true (alapértelmezett), a Next.js automatikusan megpróbálja detektálni a felhasználó preferred nyelvét a böngésző beállításai alapján. Néha érdemes ezt kikapcsolni, és saját logikát implementálni.

A megfelelő i18n beállítások kritikusak a jó felhasználói élmény és a SEO szempontjából, mivel lehetővé teszik a nyelvi alapú URL-ek (pl. /hu/rolunk, /de/ueber-uns) generálását.

Útvonal Kezelés: rewrites, redirects és headers

A next.config.js fájl lehetőséget biztosít az alkalmazásod útvonalainak finomhangolására, átirányítások kezelésére és egyedi HTTP fejlécek hozzáadására, amelyek mind a felhasználói élményt, mind a SEO-t, mind a biztonságot javítják.

rewrites: URL Maszkolás és Belső Átirányítások

A rewrites segítségével „maszkolhatod” az URL-eket, így a felhasználó számára más URL jelenik meg, mint amit az alkalmazás belsőleg használ. Ez például akkor hasznos, ha egy régi API végpontot szeretnél elérni anélkül, hogy a felhasználónak látnia kellene a teljes URL-t, vagy ha egy „szép” URL-t szeretnél megjeleníteni egy komplex belső útvonalhoz.

/** @type {import('next').NextConfig} */
const nextConfig = {
  async rewrites() {
    return [
      {
        source: '/blog/:path*',
        destination: '/posts/:path*', // A felhasználó látja a /blog-ot, de valójában a /posts-t hívjuk meg
      },
      {
        source: '/api/:path*',
        destination: 'https://external-api.com/api/:path*', // Proxy külső API-hoz
      },
    ];
  },
};

module.exports = nextConfig;

Fontos megjegyezni, hogy a rewrites nem változtatja meg a böngésző URL-jét, csak a belső útválasztást befolyásolja. Ezzel ellentétben a redirects valóban átirányítja a böngészőt egy új URL-re.

redirects: Állandó és Ideiglenes Átirányítások

A redirects kulcsfontosságú a SEO szempontjából, amikor régi URL-eket új címekre irányítasz át, vagy ideiglenes átirányításokat állítasz be karbantartás idejére. Kétféle átirányítás létezik:

  • permanent: true (308 Permanent Redirect): A keresőmotorok számára jelzi, hogy az oldal véglegesen átköltözött.
  • permanent: false (307 Temporary Redirect): Ideiglenes átirányításokra használatos.
/** @type {import('next').NextConfig} */
const nextConfig = {
  async redirects() {
    return [
      {
        source: '/old-page',
        destination: '/new-page',
        permanent: true,
      },
      {
        source: '/admin',
        destination: '/login',
        permanent: false,
      },
    ];
  },
};

module.exports = nextConfig;

A redirects helyes használata megakadályozza a törött linkeket és megőrzi a SEO rangsorolást, amikor változtatsz az URL struktúrán.

headers: Egyedi HTTP Fejlécek Hozzáadása

A headers opcióval egyedi HTTP fejléceket adhatsz hozzá a Next.js alkalmazásodhoz. Ez rendkívül hasznos lehet biztonsági beállítások (pl. Content Security Policy, HSTS), cache beállítások vagy cross-origin kérések (CORS) kezeléséhez.

/** @type {import('next').NextConfig} */
const nextConfig = {
  async headers() {
    return [
      {
        source: '/(.*)', // Minden útvonalra vonatkozik
        headers: [
          {
            key: 'X-Frame-Options',
            value: 'DENY', // Megakadályozza a clickjacking-et
          },
          {
            key: 'Content-Security-Policy',
            value: "default-src 'self'; script-src 'self' 'unsafe-eval'; style-src 'self' 'unsafe-inline';",
          },
        ],
      },
    ];
  },
};

module.exports = nextConfig;

A biztonsági fejlécek megfelelő beállítása elengedhetetlen a modern webes alkalmazások védelméhez a gyakori támadásokkal szemben. Emellett a cache-elési fejlécek optimalizálhatják a betöltési sebességet.

Környezeti Változók Kezelése: Az env Objektum

Bár a Next.js támogatja a .env fájlok használatát, a next.config.js fájlban az env objektum is használható környezeti változók definiálására. Ez akkor lehet hasznos, ha a buildelés során statikus, nyilvánosan elérhető változókat szeretnél beállítani, amelyeknek nem feltétlenül kell titkosnak lenniük.

/** @type {import('next').NextConfig} */
const nextConfig = {
  env: {
    CUSTOM_VAR: 'ez egy egyedi változó',
    API_URL: process.env.NODE_ENV === 'production' ? 'https://api.example.com' : 'http://localhost:3001',
  },
};

module.exports = nextConfig;

Ezeket a változókat az alkalmazáson belül a process.env.CUSTOM_VAR módon érheted el. Fontos hangsúlyozni, hogy ide soha ne tegyél titkos információkat, mint API kulcsokat vagy adatbázis jelszavakat! Az env objektumban definiált változók a kliens oldalon is elérhetővé válnak a JavaScript bundle-ben. A titkos változókat mindig a .env.local vagy a .env.production fájlokban tárold, és a szerver oldalon (pl. API routes) használd fel azokat.

Fejlett Konfiguráció: A webpack Függvény

A Next.js alapértelmezett beállításai a legtöbb projekt számára elegendőek, de ha speciális igényeid vannak, a webpack funkcióval közvetlenül hozzáférhetsz a belső Webpack konfigurációhoz, és módosíthatod azt. Ez hatalmas rugalmasságot biztosít, de nagy óvatosságot is igényel, mivel könnyen tönkreteheti az alkalmazás buildjét.

/** @type {import('next').NextConfig} */
const nextConfig = {
  webpack: (config, { buildId, dev, isServer, defaultLoaders, webpack }) => {
    // Példa: SVG fájlok betöltésének módosítása
    config.module.rules.push({
      test: /.svg$/,
      use: ['@svgr/webpack'],
    });

    // Példa: Egyedi Webpack plugin hozzáadása
    config.plugins.push(
      new webpack.DefinePlugin({
        __MY_CUSTOM_VAR__: JSON.stringify('Hello from Webpack!'),
      })
    );

    return config;
  },
};

module.exports = nextConfig;

A webpack függvény paraméterként kapja meg a jelenlegi Webpack konfigurációt, valamint további segédobjektumokat (pl. isServer, dev), amelyekkel környezetfüggő módosításokat hajthatsz végre. Használd ezt a funkciót, ha például egyedi betöltőkre (loaders) van szükséged (pl. GraphQL fájlok, egyedi CSS előfeldolgozók), vagy speciális Webpack pluginokat szeretnél használni, amik nem részei az alapértelmezett Next.js konfigurációnak.

Egyéb Hasznos Beállítások

assetPrefix: CDN Integráció

Ha egy Content Delivery Network (CDN) mögött üzemelteted a Next.js alkalmazásodat, az assetPrefix beállítással megadhatod a CDN URL-jét. Ez biztosítja, hogy a statikus fájlok (képek, CSS, JS) a CDN-ről legyenek kiszolgálva, ezzel felgyorsítva a betöltési időt és csökkentve a fő szerver terhelését.

/** @type {import('next').NextConfig} */
const nextConfig = {
  assetPrefix: process.env.NODE_ENV === 'production' ? 'https://mycdn.example.com' : undefined,
};

module.exports = nextConfig;

Gondoskodj arról, hogy a CDN-re feltöltött statikus fájlok elérési útvonala megegyezzen az alkalmazásban használt útvonalakkal.

distDir: Egyedi Build Mappa

Alapértelmezetten a Next.js a .next mappába építi be az alkalmazást. A distDir beállítással ezt a mappát átnevezheted, ha például a CI/CD pipeline-od vagy a hosting szolgáltatód más mappanevet igényel.

/** @type {import('next').NextConfig} */
const nextConfig = {
  distDir: 'build', // A .next helyett a build mappába épül be
};

module.exports = nextConfig;

generateBuildId: Egyedi Build Azonosító

Ha speciális caching stratégiákat vagy deployment folyamatokat használsz, az generateBuildId funkcióval egyedi azonosítót generálhatsz minden buildhez. Ez hasznos lehet, ha biztosítani szeretnéd, hogy a CDN cache-e invalidálódjon egy új deployment során.

/** @type {import('next').NextConfig} */
const nextConfig = {
  generateBuildId: async () => {
    // Egyedi azonosító generálása például a Git commit hash alapján
    return 'my-custom-build-id';
  },
};

module.exports = nextConfig;

Konklúzió

A next.config.js fájl a Next.js keretrendszer szíve és lelke, amely hatalmas kontrollt biztosít az alkalmazásod működése felett. A bemutatott beállítások ismerete és helyes alkalmazása kulcsfontosságú az optimalizált teljesítményű, biztonságos és karbantartható Next.js alkalmazások építéséhez.

Fontos, hogy mindig alaposan dokumentáld a next.config.js módosításait, és körültekintően járj el, különösen a Webpack konfiguráció vagy az experimental beállítások módosításakor. A Next.js dokumentációja mindig a legjobb forrás a legfrissebb információkért és a részletesebb példákért. Használd ki a benne rejlő erőt, és emeld Next.js projektjeidet a következő szintre!

Leave a Reply

Az e-mail címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük