Bundler — egy build-eszköz, amely több JavaScript-modult egyesít egy vagy több fájlba a böngészőben vagy mobilalkalmazásban való használatra. A modern bundlerek (Webpack, Metro, Vite) nemcsak összeragasztják a fájlokat, hanem transpilációt, minifikációt és erőforrás-optimalizálást is végeznek. A Webpack Concepts (2026) szerint a bundler helyes beállítása 40–60%-kal csökkenti a build méretét funkcionalitásvesztés nélkül.
Főbb pontok
Bundler (modul-összecsomagoló) — egy parancssori eszköz, amely bemenetként egy belépési pontot (entry point) — az alkalmazás fő fájlját — fogad, és rekurzívan bejárja annak összes függőségét, modulgráfot építve. Kimenetén a bundler egy vagy több fájlt generál, amelyek HTML-oldalhoz csatlakoztathatók vagy mobilalkalmazásban futtathatók.
A böngészők hosszú ideig nem támogatták a moduláris JavaScript-rendszert platformszinten. A Bundler ezt a problémát oldotta meg, száznyi import és require utasítást egyetlen fájllá alakítva. Ma, még a natív ES-modul-támogatás mellett is a böngészőkben, a bundlerek további feladatokat látnak el: transpiláció JSX és TypeScript, minifikáció kód, code splitting lusta betöltéshez és hot module replacement (HMR) a fejlesztés felgyorsításához.
A mobilalkalmazás-fejlesztésben a React Native a Metro-t használja alapértelmezett bundlerként, a Flutter pedig a saját, Dart-alapú buildrendszerét. A bundler kiválasztása közvetlenül befolyásolja a fejlesztési sebességet, az alkalmazás méretét és a futásidejű teljesítményt.
Bundling több szakaszon megy keresztül: a bemeneti fájlok elemzése, függőségi gráf építése, modulok átalakítása és kimeneti fájlok generálása. Minden szakaszban a bundler loadereket alkalmaz a forráskód átalakításához és plugineket az optimalizáláshoz.
A bundler a belépési ponttól kezdi, beolvassa a fájlt és AST-t (absztrakt szintaxisfát) épít. Az AST-ből kinyerésre kerül minden import és require utasítás. Minden megtalált import esetén a bundler rekurzívan megismétli a folyamatot, amíg az összes függőség egyetlen gráfba nem gyűlik.
// Egy bundler egyszerűsített implementációja
const fs = require('fs');
const path = require('path');
function buildGraph(entry) {
const content = fs.readFileSync(entry, 'utf-8');
const imports = content.match(/require\(['"](.+?)['"]\)/g);
const modulePath = path.resolve(path.dirname(entry), imports[0]);
return { entry, content, deps: [buildGraph(modulePath)] };
}
A gráf felépítése után a bundler loadereket alkalmaz — olyan átalakításokat, amelyek a fájlokat JavaScript-be konvertálják: TypeScript → JS, SCSS → CSS, JSX → JSX-függvények. Ezután a pluginek további átalakításokat végeznek: minifikáció, képek beágyazása, service worker generálása.
A bundlerek három generációra oszthatók: klasszikus, specializált és új generációs ES-modul-alapú. Minden típusnak saját architektúrája és alkalmazási területe van.
Webpack — a legelterjedtebb bundler hatalmas ökoszisztémával. Fő előnye a rugalmasság: több ezer loader és plugin fed le gyakorlatilag minden build-forgatókönyvet. Parcel zero-config megközelítést kínál, automatikusan meghatározva a szükséges átalakításokat a fájlkiterjesztések alapján. Mindkét bundler támogatja a code splittinget és a HMR-t.
Metro kifejezetten a React Native számára készült, és csak JavaScript-tel és TypeScript-tel működik. Architektúrája mobilfejlesztésre optimalizált: inline requires támogatás, modulok aszinkron betöltése és integráció a Hermes engine-nel. Rollup könyvtárakra és npm-csomagokra összpontosít, tiszta ES-modul-kimenetet generálva felesleges csomagolás nélkül.
A bundler kiválasztása a platformtól és a projekt követelményeitől függ. Webpack univerzális, de részletes beállítást igényel. Metro helyettesíthetetlen a React Native számára. Vite biztosítja a leggyorsabb fejlesztést a natív ES-moduloknak köszönhetően.
| Jellemző | Webpack | Metro | Vite |
|---|---|---|---|
| Platform | Web, univerzális | React Native | Web, univerzális |
| Dev-build sebessége | Közepes | Magas | Nagyon magas |
| Code splitting | Igen | Igen | Igen |
| HMR | Igen | Fast Refresh | Azonnali HMR |
| Plugin-ökoszisztéma | Hatalmas | Korlátozott | Növekvő |
| Beállítás | Összetett | Egyszerű | Egyszerű |
| TypeScript-támogatás | Loadereken keresztül | Beépített | Beépített |
Vite esbuild-öt használ a függőségek előzetes bundlingjéhez és Rollup-ot a production buildhez, ami 5–10-szeres sebességnövekedést eredményez a Webpack-hez képest fejlesztési módban. Metro nem támogatja a webes célokat, de zökkenőmentes integrációt biztosít a React Native bridge-szel és a Turbo Modules-szel.
A bundler konfigurációja határozza meg, hogyan kerülnek feldolgozásra a különböző fájltípusok, hol generálódik a build, és milyen optimalizálások kerülnek alkalmazásra. Egy tipikus konfigurációs fájl tartalmazza a belépési pontot, a modulokra vonatkozó szabályokat, plugineket és kimeneti beállításokat.
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
entry: './src/index.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: '[name].[contenthash].js',
clean: true,
},
module: {
rules: [
{
test: /\.(js|jsx|ts|tsx)$/,
exclude: /node_modules/,
use: { loader: 'babel-loader', options: { presets: ['@babel/preset-react'] } },
},
{ test: /\.css$/, use: ['style-loader', 'css-loader'] },
],
},
plugins: [new HtmlWebpackPlugin({ template: './public/index.html' })],
devServer: { port: 3000, hot: true },
};
Metro külön fájlokat használ a konfigurációhoz: metro.config.js és babel.config.js. A Webpack-kel ellentétben a Metro konfigurációja sokkal egyszerűbb, mivel a bundler a React Native-ra specializálódott, és nem igényel loader-beállítást stílusokhoz vagy képekhez.
Még tapasztalt fejlesztők is találkoznak bundling-hibákkal. Duplicate module — az egyik leggyakoribb probléma, amikor ugyanaz a függőség többször kerül a bundle-be verzió-inkompatibilitás miatt a package.json-ban. Module not found akkor fordul elő, ha az import elérési útja helytelen, vagy a csomag nincs telepítve.
Metro korlátozott a bundle mérete szempontjából mobil eszközökön. A 2–5 MB-os határ túllépésekor Unable to resolve module hiba lép fel az eszköz memóriahiánya miatt. Megoldás — használjon inline requires-t és RAM bundles-t a modulok lusta betöltéséhez. A Metro érzékeny a symlink-ekre is, ezért monorepozitóriumok esetén további watchFolders beállítás szükséges a konfigurációban.
Webpack esetén tipikus probléma a Module parse failed, amikor a fájl váratlan formátumú, vagy hiányzik a szükséges loader. A fájlkiterjesztés ellenőrzése és a megfelelő szabály hozzáadása a module.rules-ban megoldja a problémát. A source-map-explorer használata segít megtalálni a duplikált modulokat és a felesleges függőségeket a végső bundle-ben.
Lassú build — az egyik fő probléma a bundlerekkel való munkában. A gyorsításhoz használjon persistent caching-et, amely megőrzi a modul-átalakítások eredményeit a futtatások között. A Webpack 5 támogatja a fájlrendszer-gyorsítótárat a cache: { type: 'filesystem' } segítségével, a Vite esbuild-öt használ az előzetes bundlinghez, a Metro pedig a RAM-beli modul-gyorsítótárra támaszkodik. Ezenkívül állítsa be az exclude-ot a node_modules számára a loaderekben, hogy ne dolgozza fel újra a már kész csomagokat.
Code splitting — a bundle felosztása igény szerint betöltődő részekre. Különböző bundlerek különbözőképpen valósítják meg ezt a stratégiát. A Webpack támogatja a dinamikus importot import(), amely különálló részeket hoz létre minden modulhoz. A Metro inline requires-t használ a késleltetett betöltéshez. A Vite automatikusan felosztja a vendor-részeket és a dinamikus importokat további konfiguráció nélkül. A stratégia kiválasztása a projekt követelményeitől függ: mobilalkalmazások esetén a kisebb kezdeti bundle-ok lusta betöltéssel előnyösebbek.
A code splitting helyes működéséhez a React Native-ben további konfiguráció szükséges: a Metro-t be kell állítani az aszinkron részekkel való munkára az inlineRequires segítségével. A Webpack-ben és Vite-ben a code splitting azonnal működik a dinamikus import() szintaxis használatakor, amely automatikusan hozza létre a felosztási pontokat. A maximális hatékonyság érdekében kombinálja a code splittinget preload-utasításokkal a <link rel="preload"> segítségével a kritikus részekhez.
Gyakran Ismételt Kérdések
Egyszerű projektekhez JSX, TypeScript vagy CSS-modulok nélkül meg lehet elégedni a natív ES-modulokkal a böngészőben. A production buildhez azonban a bundler biztosítja a minifikációt, a tree shakinget és a code splittinget, amelyek kritikusak a teljesítmény szempontjából. Bundler nélkül nehéz moduláris architektúrát fenntartani nagy projektekben.
React Native esetén — Metro (az egyetlen támogatott opció). Webes alkalmazásokhoz — Vite új projektekhez (a sebessége miatt) vagy Webpack meglévő projektekhez gazdag ökoszisztémával. Könyvtárakhoz és npm-csomagokhoz — Rollup, mivel tiszta ES-modul-kimenetet generál.
Bundler közvetlenül meghatározza a végső JS bundle méretét. A Webpack tree shakinggel 30–50%-kal csökkentheti a méretet. A Metro a React Native számára támogatja a Hermes bytecode-ot, amely 20–30%-kal csökkenti a méretet a hagyományos JavaScript-hez képest. A code splitting lehetővé teszi a modulok igény szerinti betöltését, csökkentve a kezdeti bundle-t.
A web esetén a bundler különböző böngészőkkel kompatibilis kódot generál, és támogatja a CSS-t, képeket és betűtípusokat. Mobil platformok esetén a Metro a JavaScript-motorhoz (Hermes vagy JSC) generál kódot, nem dolgoz fel CSS-t vagy HTML-t, és optimalizálja a buildet az eszköz korlátozott erőforrásaihoz.
Igen, léteznek olyan projektek, amelyek a Webpack-et használják a webes részhez és a Metro-t a React Native-hoz — például monolitikus tárolókban megosztott kódbázissal. Ez azonban bonyolítja a CI/CD konfigurációt és a függőségi verziók szinkronizálását igényli. Ajánlott egyetlen bundlert használni minden célhoz, ha lehetséges.
Összefoglalás
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is