Metro — egy JavaScript bundler, amelyet kifejezetten a React Native számára fejlesztettek ki, és alapértelmezésben használnak mobilalkalmazások összeállítására ezen a platformon. Az univerzális bundlerekkel ellentétben a Metro a mobil eszközök korlátozott erőforrásaihoz van optimalizálva, és biztosítja az integrációt a Hermes engine-nel és a Fast Refresh-szel. A Metro Documentation (2026) szerint a bundler a világ React Native projektjeinek több mint 90%-át dolgozza fel.
Főbb pontok
Metro egy nyílt forráskódú JavaScript bundler, amelyet a Meta csapat készített a React Native számára. Felváltotta a Packager-t a React Native korábbi verzióiból, és a platform szabványos fordítóeszközvé vált. A Metro nem webes fejlesztésre szolgál: architektúrája kizárólag a JSC (JavaScriptCore) vagy Hermes JavaScript motorok alatt futó mobilalkalmazásokra összpontosít.
Metro 2018-ban jelent meg a régi React Native Packager helyettesítőjeként. A létrehozásának fő oka egy olyan bundler iránti igény volt, amely hatékonyan működik millió modullal nagy mobilalkalmazásokban. A Webpack-kel ellentétben a Metro nem támogatja a CSS, HTML vagy képek modulkénti használatát — ezeket az erőforrásokat külön React Native eszközök dolgozzák fel. A Facebook a Metro-t használja fő alkalmazásának összeállításához, amely több mint 100 ezer fájlt tartalmaz.
A Metro npm-en keresztül, metro csomagként terjed, és automatikusan települ a React Native CLI-vel együtt. A Metro verziója a React Native verziójához van kötve, így a bundler frissítése a platform frissítésével együtt történik.
Metro a bemeneten fogadja az alkalmazás belépési pontját, függőségi gráfot épít, transzformálja az egyes modulokat, és szerializálja az eredményt egyetlen bundle-ba. A folyamat három fázison megy keresztül: Resolve (modulok feloldása), Transform (transzformáció) és Serialize (szerializálás).
// Példa Metro konfigurációra egyéni transzformációhoz
const metroConfig = {
transformer: {
babelTransformerPath: require('metro-babel-transformer'),
async transform({ src, filename, options }) {
const result = await babelTransform({ src, filename, options });
return {
ast: result.ast,
code: result.code,
map: result.map,
dependencies: [],
};
},
},
serializer: {
createModuleIdFactory() {
let nextId = 0;
const moduleIds = new Map();
return ({ path }) => {
if (!moduleIds.has(path)) {
moduleIds.set(path, nextId++);
}
return moduleIds.get(path);
};
},
},
};
A Resolve fázisban a Metro meghatározza az egyes importált modulok helyét, figyelembe véve az aliasokat és a node_modules-t. A Transform fázisban minden fájl átmegy egy Babel-transzformerren a JSX, TypeScript és egyéb kiterjesztések tiszta JavaScriptté alakításához. A végső Serialize fázis összegyűjti az összes transzformált modult egy vagy több bundle fájlba.
Metro moduláris architektúrára épül, ahol a fordítás minden szakasza külön komponensként van megvalósítva. Ez lehetővé teszi a szabványos modulok egyéni modulokkal történő cseréjét a bundler magjának megváltoztatása nélkül. A Metro architektúrája három fő csomagot foglal magában: metro, metro-config és metro-resolver.
Metro Server — a fejlesztői szerver, amely a npx react-native start paranccsal indul. Valós időben szolgálja ki a modultranszformációs kéréseket, biztosítva a Fast Refresh-t. Module Store — gyorsítótár, amely a transzformált modulokat memóriában tárolja az ismételt fordítások gyorsításához. Dependency Graph — függőségi gráf, amely a fájlok módosításakor növekményesen frissül.
Watchman — fájlmegfigyelő a Meta-tól, amelyet a Metro a fájlrendszer változásainak érzékelésére használ. Watchman nélkül a Metro-nak minden változáskor újra kellene pésztáznia a teljes fájlszerkezetet, ami jelentősen lelassítja a fejlesztést. A Watchman telepítése kötelező a kényelmes Metro-val való munkához bármilyen méretű projekten.
Konfiguráció A Metro-t a projekt gyökérben található metro.config.js fájlban lehet megadni. Egy tipikus fájl további mappákat határoz meg a modulok kereséséhez, blokkolásokat a felesleges fájlok kizárásához és egyéni transzformereket. A React Native 0.72+ verzióban automatikus konfigurációfelismerés használatos, de a monorepozitóriumoknál a konfiguráció kötelező.
// metro.config.js
const config = {
resolver: {
sourceExts: ['js', 'jsx', 'ts', 'tsx', 'json'],
nodeModulesPaths: ['node_modules'],
blockList: [/\.test\.js$/, /__tests__\/.*/],
extraNodeModules: {
'shared-components': path.resolve(__dirname, '../shared/src'),
},
},
transformer: {
minifierConfig: {
keep_classnames: true,
keep_fnames: true,
mangle: { reserved: ['React', 'Component'] },
},
},
};
module.exports = mergeConfig(getDefaultConfig(__dirname), config);
blockList kizárja a tesztfájlokat a fordításból, csökkentve a bundle méretét. nodeModulesPaths további útvonalakat jelöl meg a csomagok kereséséhez — kritikus a monorepozitóriumok számára. extraNodeModules aliasokat hoz létre a közös csomagokhoz, amelyeket a monorepozitórium különböző projektjeiben használnak.
Metro számos mechanizmust kínál a bundle méretének és a fordítási sebességnek az optimalizálásához. Inline Requires — a leghatékonyabb technika, amely a legfelső szintű importálásokat lokális require-vé alakítja a függvényeken belül. RAM bundles lehetővé teszik a modulok növekményes betöltését. Hermes bájtkóddé fordítja a JavaScriptet, 20–30%-kal csökkentve az alkalmazás méretét.
// metro.config.js — optimalizálás éles környezetre
const config = {
transformer: {
async transform({ src, filename, options }) {
const inlineRequires = options.dev ? false : true;
return await defaultTransform({ src, filename, options: { ...options, inlineRequires } });
},
},
serializer: {
polyfillModuleNames: [],
},
};
// A Hermes bekapcsolásához — a build.gradle-ben (Android):
// project.ext.react = [enableHermes: true, bundleInRelease: true]
// iOS esetén — a Podfile-ban: :hermes_enabled => true
A bundle méretének diagnosztizálásához a Metro a --bundle-output kapcsolót kínálja statisztikai kimenettel. Használja a bundle-visualizer-t a bundle összetételének elemzéséhez és a nagy modulok megtalálásához, amelyek lustán tölthetők be. A bundle méretének rendszeres ellenőrzésének részét kell képeznie a React Native projekt CI/CD csœvezetékének.
Metro támogatja a delta-bundle-okat — egy olyan mechanizmust, ahol az első teljes fordítás után a szerver csak a változásokat (delta) küldi el a régi és új bundle verziók között. Ez drasztikusan felgyorsítja a későbbi fordításokat: a frissítési idő másodpercekről tízes milliszekundumokra csökken. A delta-bundle-ok különösen hatékonyak a fejlesztési szakaszban, amikor a fejlesztő gyakran menti a változásokat és újratölti az alkalmazást.
A delta-bundle-ok bekapcsolásához a React Native-ban a --delta kapcsolót használják a npx react-native bundle parancsban. Az üfél oldalon a delta-bundle-ok a React Native 0.64-től kezdve támogatottak. Éles fordításoknál a delta-bundle-ok nem alkalmazhatók — helyettük teljes bundle-t használnak Hermes bájtkóddal a maximális indítási teljesítmény érdekében. Ez azért érhető el, mert a fejlesztési sebesség növekedése kompenzálja az első teljes fordítás költségeit.
Hermes — JavaScript motor, amelyet a Meta kifejezetten a React Native számára fejlesztett ki. A Metro a fordítási szakaszban Hermes bájtkódot generál, ami lehetővé teszi az alkalmazás számára, hogy a készüléken végzett költséges JavaScript fordítás nélkül induljon. A Hermes bekapcsolásához elegendő hozzáadni az enableHermes: true beállítást a metro.config.js-ben, és konfigurálni a build.gradle-t vagy a Podfile-t. A Hermes 30–50%-kal csökkenti az alkalmazás indítási idejét és 20–30%-kal az APK méretét a JavaScriptCore-hoz képest.
A Hermes használatakor fontos emlékezni a korlátozásokra: a motor nem támogatja a Proxy-t, a Reflect-et és néhány ES6 képességet. A legtöbb React Native alkalmazás nem használja ezeket a képességeket közvetlenül, de néhány könyvtár ütközéseket okozhat. A Hermes bekapcsolása előtt ellenőrizze az összes projektfüggőség kompatibilitását az hivatalos kompatibilitási ellenőrzőlistán. A Metro automatikusan átvált bájtkód generálási módba a Hermes aktiválásakor.
A Metro fordítás hatékonyságának nyomon követéséhez használja a Flipper — a React Native hibakereső eszköz — által elérhető beépített metrikákat. A Metro eseményeket tesz közzé: bundle_request, transform, resolve az egyes szakaszok végrehajtási idejével. Ezen adatok elemzése segít azonosítani a szűk keresztmetszeteket: ha a transform fázis az idő több mint 70%-át veszi igénybe, a probléma a Babel-transzformerben van. Kapcsolja be a Metro naplózását a --verbose kapcsolóval a részletes diagnosztikához.
Gyakran Ismételt Kérdések
Technikailag igen — léteznek kísérleti projektek, mint a react-native-webpack, de ezek nem hivatalosan támogatottak. Metro integrálva van a React Native bridge-szel, a Turbo Modules-szel és a Hermes-szel olyan szinten, amely a Webpack számára nem elérhető. A Metro lecserélése a Fast Refresh és a hivatalos támogatás elvesztéséhez vezet.
A React Native nem használ CSS-t stíluskészítéshez — helyette JavaScript-stíluskészítést alkalmaz a StyleSheet.create-en keresztül. Mivel a Metro kizárólag a React Native számára készült, a CSS támogatására nincs szükség. A React Native Web-en keresztüli webes megjelenítéshez a CSS-t külön eszközök dolgozzák fel a Metro-n kívül.
Metro nem dolgozza fel a képeket vagy betűtípusokat modulként. Az erőforrások a require('./image.png')-en keresztül csatolhatók, de a Metro csak szöveges függőségként regisztrálja őket. A képek tényleges betöltését a React Native natív kódja végzi a Image komponensen keresztül, a Metro pedig átmásolja az erőforrásokat a bundle-ba.
Rollup ES modulokat generál tree shakinggel modulszinten, ami minimális bundle méretet biztosít a könyvtárak számára. Metro CommonJS bundle-t generál inline transzformációval és mobil motorokra optimalizálva. A Rollup nem támogatja a Fast Refresh-t és nem képes együttműködni a natív React Native modulokkal.
A Metro hideg fordítását a node_modules teljes beolvasása lassítja. Megoldások: adjon hozzá watchFolders-t a monorepozitóriumokhoz, használja a maxWorkers-t a párhuzamos transzformációhoz és telepítse a Watchman-t. 10 000+ fájlt tartalmazó projektek esetén fontolja meg a metro-memory-fs használatát a memóriában történő gyorsításhoz.
Összefoglalás
watchFolders és extraNodeModules konfigurálása szükséges a modulok helyes feloldásához.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