A Metro Bundler egy specializált JavaScript bundler a Meta-tól, amely kizárólag a React Native számára készült és a framework magját képezi. A React Native 0.76 (2025) hivatalos dokumentációja szerint a Metro inkrementális építést biztosít Fast Refresh funkcióval és modulfeloldást a .native.js, .ios.js és .android.js platformkiterjesztések figyelembevételével. A Webpack-től eltérően a Metro nem használ hosszú élettartamú module graph gyorsítótárat — ehelyett minden egyes fájlváltozáskor újraépíti a gráfot, ami azonnali Hot Reload-ot biztosít fejlesztés közben.
Főbb pontok
Metro Bundler egy nyílt forráskódú JavaScript bundler, amelyet a Meta fejlesztett ki a React Native számára, és alapértelmezés szerint használatos a framework összes projektjében. A Metro feladata, hogy a projekt JavaScript-kódját a függőségekkel együtt vegye, és egy vagy több bundle-t építsen, amelyek az eszközön futnak. Az univerzális bundlerektől (Webpack, Rollup, Parcel) eltérően a Metro a mobilfejlesztés sajátosságaira van optimalizálva: minimális építési idő, inkrementális frissítések fejlesztés közben és helyes működés a platformmodulokkal (Objective-C, Swift, Java, Kotlin natív modulok). A Metro a React Native CLI részeként érkezik, és nem igényel külön telepítést. A React Native 0.72-től kezdve a Metro 0.80+ verziója támogatja a modulok párhuzamos transpilációját, ami akár 40%-kal gyorsítja az építést a többmagos processzorokon.
A Metro architektúrája három független komponensre oszlik: Resolver, Transformer és Bundler. A Resolver felelős a modulok kereséséért és feloldásáért — olvassa az import/require kifejezéseket, megtalálja a megfelelő fájlokat a platformkiterjesztések figyelembevételével, és abszolút útvonalakat ad vissza. A Transformer végzi a transpilációt: alkalmazza a Babel-t presetekkel és pluginekkel, JSX-et, TypeScript-et vagy Flow-t tiszta JavaScript-té alakítva. A Bundler a végső szakasz: megkapja a függőségi gráfot a Resolver-től és a transzformált fájlokat a Transformer-től, majd egy vagy több bundle-ba szerializálja őket (module bundles). A három lépésre bontás lehetővé teszi a Metro számára, hogy gyorsítótárazza az egyes szakaszok eredményeit: ha csak egy fájl változott, a Resolver és a Bundler használhatja a gyorsítótárat a többi modulhoz, ami akár 10-szeres sebességnövekedést biztosít fejlesztési módban.
Resolver a Metro-ban részben kompatibilis a Node.js module resolution-nel. A legfontosabb különbség a Node.js-hez képest — a platformkiterjesztések támogatása: require('./Component') a megadott prioritási sorrendben keresi a Component.native.js, Component.ios.js, Component.android.js fájlokat. A Resolver támogatja továbbá a package.json "react-native" mezőt a modulok alternatív implementációkra való leképezéséhez — ez a szabványos mechanizmus a platformkódot tartalmazó könyvtárak számára. Ha a fájl nem található, a Resolver hibát dob a teljes keresési veremmel.
Transformer a Metro-ban a Babel-t használja a metro-react-native-babel-preset preset-tel. A standard konfiguráció tartalmazza: JSX transzformációja React.createElement-ré, TypeScript támogatás (típusok eltávolítása), Flow támogatás és polyfill-ek a modern JavaScript szabványokhoz (async/await, optional chaining, nullish coalescing). A Transformer párhuzamos módban működik: minden modul függetlenül transpilálódik, worker folyamatok pool-ját használva (alapértelmezés szerint a szám megegyezik a CPU-k számával). A Metro 0.80-tól kezdve támogatott a Granular Transformer Cache — a gyorsítótár érvénytelenítése egyedi fájl szinten.
A Metro egyik kulcsfontosságú jellemzője a platform fájlkiterjesztések támogatása. Egy React Native projekt tartalmazhat három verziót egy modulból: Component.ios.js (iOS), Component.android.js (Android) és Component.native.js (mindkét platform). Az require('./Component') importálásakor a Resolver automatikusan kiválasztja a megfelelő verziót a célépítési platformtól függően. Ez lehetővé teszi a platformfüggő kód írását Platform.OS feltételes konstrukciók nélkül. A prioritási sorrend: név.platform.js > név.native.js > név.js. A .native.js kiterjesztés a mindkét platformon működő, de a webbel nem kompatibilis közös kódhoz használatos. A .ios.js és .android.js kiterjesztések specifikus funkciók implementálására szolgálnak — navigáció, gesztusok, fájlrendszerrel való munka. A Metro egyéni kiterjesztéseket támogat a resolver.sourceExts konfiguráción keresztül.
// metro.config.js — sourceExts és watchFolders beállítása
const config = {
resolver: {
sourceExts: ['jsx', 'js', 'tsx', 'ts', 'json'],
platformExtensions: ['ios', 'android', 'native'],
},
transformer: {
babelTransformerPath: require('metro-react-native-babel-transformer'),
},
watchFolders: [path.resolve('../shared')],
};
Fast Refresh a React Native forró újratöltési mechanizmusa, amely a Metro-ra épül. Amikor a fejlesztő megváltoztat egy fájlt, a Metro csak a megváltoztatott modult transpilálja újra, és elküldi a frissítést az alkalmazásnak WebSocketen keresztül. A Fast Refresh frissíti a felületet anélkül, hogy újratöltené a teljes alkalmazást, és megőrzi a React komponensek állapotát, ha csak JSX vagy stílusok változtak. Ha hook-okat vagy állapotot tartalmazó kód változott, a Fast Refresh csak a megváltoztatott komponens újracsatolását végzi el. A Metro két módot támogat: Hot Module Replacement (HMR) a modulok helyben történő cseréjéhez és Live Reload az alkalmazás teljes újratöltéséhez natív modulok vagy konfiguráció változásakor. A Fast Refresh alapértelmezés szerint be van kapcsolva a React Native 0.76-ban, és nem igényel további konfigurációt — elég futtatni a npx react-native start parancsot.
| Mód | Sebesség | Megőrzi az állapotot | Trigger |
|---|---|---|---|
| Fast Refresh | 200-500ms | Igen | JS/TS fájlok változása |
| HMR | 100-300ms | Igen | CSS/stílusok változása |
| Live Reload | 1-3s | Nem | Native config változása |
| Full Rebuild | 10-60s | Nem | podspec/build.gradle változása |
metro.config.js a Metro konfigurációs fájlja, amely a React Native projekt gyökerében található. Itt konfigurálható: resolver (sourceExts, platformExtensions, extraNodeModules), transformer (babelTransformerPath, minifierConfig), server (port, host, enableFastRefresh) és watcher (watchFolders, healthCheck). A standard Metro konfiguráció a @react-native/metro-config (React Native 0.76+) csomagtól öröklődik. Monorepozitóriumos projektek esetén adja hozzá a watchFolders-t — ez lehetővé teszi a Metro számára, hogy kövesse a változásokat a projekt gyökerén kívüli csomagokban. A sourceExts konfigurálásához adja hozzá a 'svg', 'png', 'gql' értékeket egyéni transzformátorokhoz. A Metro támogatja az aszinkron konfigurációkat async function segítségével — ez hasznos a konfiguráció dinamikus generálásához a környezet alapján.
Az építés optimalizálása a Metro-nál a megfelelő gyorsítótár konfigurációval kezdődik. Állítsa a maxWorkers értékét a CPU-k számának mínusz 1-re. Disztribúciókhoz használja a resetCache-et CI-ban. Minimalizálja a sourceExts-t — a további kiterjesztések lassítják a modulfeloldást. Nagy projektek esetén a watchFolders-t csak a szükséges könyvtárakra konfigurálja. A Metro támogatja a Hermes bytecode minification-t, ami kisebb bundle méretet ad, mint a standard Terser — használja a minifierPath: 'metro-minify-terser' beállítást.
A Metro támogatja a közvetlen Hermes bytecode-ba építési módot — kihagyva a JavaScript AST szakaszt. HermesTransformer-rel építve a modulok HBC-be (Hermes ByteCode) fordulnak a sima JavaScript helyett. Ez a következőket nyújtja: kisebb bundle méret (30-40%-kal), gyorsabb alkalmazásindítás (20-30%-kal) és kisebb memóriafogyasztás. Az aktiváláshoz állítsa be a hermesCommand-ot a metro.config.js-ben, és aktiválja a Hermes jelzőt a build.gradle (Android) vagy Podfile (iOS) fájlban. A Hermes bundle-ök építése két szakaszban történik: először a Metro megépíti a JavaScript bundle-t, majd a Hermes CLI konvertálja azt HBC-vé. A React Native 0.70-től kezdve a Hermes az alapértelmezett motor Androidon, iOS-en explicit aktiválást igényel.
A Metro és a Webpack közötti különbség az eltérő célokból adódik. A Webpack egy univerzális bundler a web számára hatalmas plugin és loader ökoszisztémával. A Metro egy specializált bundler a React Native számára, ahol a prioritás az inkrementális építés sebessége és a natív modulokkal való helyes működés. A Webpack hosszú élettartamú modulgráfot használ intelligens gyorsítótár-érvénytelenítéssel — ez gyors újraépítéseket biztosít a weben, de problémákat okoz a platformkiterjesztésekkel. A Metro nem gyorsítótárazza a gráfot az építések között, hanem minden alkalommal felépíti — ez leegyszerűsíti a platformkiterjesztések és a Haste modulok feldolgozását. A Webpack támogatja a dinamikus importokat chunkokkal, a Metro is — a React.lazy() és Suspense segítségével, de egy aktív kérés korlátozásával. A Metro ökoszisztémája jelentősen kisebb: nincs helyettesítő a style-loader, css-loader, file-loader számára — ezek a feladatok másképp oldódnak meg a React Native-ban.
Metro az egyetlen helyes választás a React Native projektekhez. A Webpack nem támogatja a platform-aware resolution-t dobozból, és a React Native Webpack-kel való konfigurálása jelentős erőfeszítést igényel (haul bundler, expo web packager). A Metro integrálva van a React Native CLI-ba, a hivatalos Meta csapat támogatja, és minden React Native kiadással frissítéseket kap. React Native Web projektek esetén használhatja a Webpack-et a webes építéshez, miközben a Metro-t megtartja a mobil bundle-ökhöz.
Gyakran Ismételt Kérdések
Futtassa a npx react-native start --reset-cache parancsot, vagy törölje a $TMPDIR/metro-* mappát és a .metro-health-check* könyvtárat a projekt gyökeréből. Alternatíva: npx react-native clean — ez a parancs törli az összes ideiglenes Metro fájlt, beleértve a Babel gyorsítótárat és a Haste térképet. A törlés után az első építés teljes lesz (60-120 másodperc), de a későbbi inkrementális építések visszatérnek a normál sebességre.
Ellenőrizze a csomag jelenlétét a package.json dependencies-ben (nem devDependencies). Ha a modul monorepozitóriumban található, adja hozzá az útvonalat a watchFolders-höz a metro.config.js-ben. A Metro alapértelmezés szerint nem követi a symlink-eket — használja a resolver.extraNodeModules-t az explicit leképezéshez. Yarn PnM esetén állítsa be a resolver.useWatchman: false értéket. Ha a modul platformkiterjesztéseket használ, győződjön meg arról, hogy a .ios.js vagy .android.js fájlok léteznek a megadott útvonalon.
Növelje a maxWorkers értékét a metro.config.js-ben a CPU-k számának mínusz 1-re. Konfigurálja a watchFolders-t csak a szükséges könyvtárakra. Használja a Hermes bytecode-ot production építésekhez — ez felgyorsítja a végső építést a JS minifikáció kihagyásával. Fejlesztéshez kapcsolja be a Fast Refresh-et (alapértelmezés szerint be van kapcsolva). Korlátozza a sourceExts-t csak a szükséges kiterjesztésekre. Fontolja meg a bundle chunkokra bontását lazy loading segítségével.
Technikailag igen, de nem ajánlott. A Metro nincs optimalizálva webes építésekhez: nincs támogatás CSS, HTML, képek modulként való kezelésére, nincs code splitting dinamikus importtal böngésző szinten. Webhez használja a Webpack, Vite vagy Parcel eszközöket. A Metro egy specializált megoldás a React Native-hoz, és a webhez való adaptálási kísérlet teljesítményveszteséghez és a loader ökoszisztéma hiányához vezet.
Re.Pack egy közösségi eszköz a Metro Webpack-re cseréléséhez React Native projektekben. Hozzáférést biztosít a Webpack loader ökoszisztémához (css-loader, svg-loader) és a fejlett code splitting-hez. Azonban a Re.Pack bonyolultabb konfigurálni, nem támogatja hivatalosan a Meta, és nem garantálja a kompatibilitást az új React Native verziókkal. A Metro marad az egyetlen hivatalosan támogatott bundler, ami stabilitást és kompatibilitási garanciát nyújt minden egyes kiadással.
Ö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