Metro Bundler är en specialiserad JavaScript-bundler från Meta, utvecklad exklusivt för React Native och som utgör kärnan i ramverket. Enligt den officiella dokumentationen för React Native 0.76 (2025) erbjuder Metro inkrementellt bygge med Fast Refresh och modulupplösning med hänsyn till plattformstilläggen .native.js, .ios.js och .android.js. Till skillnad från Webpack använder Metro inte långvarig module graph-cache — istället bygger den om grafen varje gång filer ändras, vilket ger omedelbar Hot Reload vid utveckling.
Huvudpunkter
Metro Bundler är en öppen källkod JavaScript-bundler, utvecklad av Meta för React Native och används som standard i alla projekt inom ramverket. Metro's uppgift är att ta projektets JavaScript-kod tillsammans med beroenden och bygga en eller flera paket som körs på enheten. Till skillnad från universella bundlers (Webpack, Rollup, Parcel) är Metro optimerad för mobil utvecklings specificitet: minimal byggtid, inkrementella uppdateringar under utveckling och korrekt funktion med plattformsmoduler (inbyggda moduler Objective-C, Swift, Java, Kotlin). Metro levereras inom React Native CLI och kräver ingen separat installation. Från och med React Native 0.72 stöder Metro version 0.80+ parallell transpilering av moduler, vilket påskyndar bygget på flerkärniga processorer med upp till 40%.
Metros arkitektur är uppdelad i tre oberoende komponenter: Resolver, Transformer och Bundler. Resolver ansvarar för att söka och lösa moduler — den läser import/require-uttryck, hittar motsvarande filer med hänsyn till plattformstillägg och returnerar absoluta sökvägar. Transformer utför transpilering: tillämpar Babel med förinställningar och plugins, omvandlar JSX, TypeScript eller Flow till ren JavaScript. Bundler är det sista steget: den tar emot beroendegrafen från Resolver och transformerade filer från Transformer, serialiserar dem sedan till ett eller flera paket (module bundles). Uppdelningen i tre steg gör att Metro kan cachelagra resultaten från varje steg: om bara en fil har ändrats kan Resolver och Bundler använda cachen för de återstående modulerna, vilket ger en hastighetsökning på upp till 10 gånger i utvecklingsläge.
Resolver i Metro implementerar algoritmen för modulupplösning, delvis kompatibel med Node.js module resolution. Den viktigaste skillnaden från Node.js — stöd för plattformstillägg: require('./Component') söker efter Component.native.js, Component.ios.js, Component.android.js i angiven prioritetsordning. Resolver stöder också package.json-fältet "react-native" för att mappa moduler till alternativa implementeringar — detta är standardmekanismen för bibliotek med plattformskod. Om filen inte hittas kastar Resolver ett fel med full sökstack.
Transformer inuti Metro använder Babel med förinställningen metro-react-native-babel-preset. Standardkonfigurationen omfattar: omvandling av JSX till React.createElement, stöd för TypeScript (borttagning av typer), stöd för Flow och polyfills för moderna JavaScript-standarder (async/await, optional chaining, nullish coalescing). Transformer arbetar i parallellt läge: varje modul transpileras oberoende med hjälp av en pool av worker-processer (som standard motsvarar antalet antalet CPU:er). Från och med Metro 0.80 stöds Granular Transformer Cache — cachelagringsinvalidering på individuell filnivå.
En av de viktigaste funktionerna i Metro är stödet för plattformsfiltillägg. Ett React Native-projekt kan innehålla tre versioner av en modul: Component.ios.js (iOS), Component.android.js (Android) och Component.native.js (båda plattformarna). Vid import av require('./Component') väljer Resolver automatiskt rätt version beroende på målplattformen för bygget. Detta gör det möjligt att skriva plattformsberoende kod utan villkorliga Platform.OS-konstruktioner. Prioritetsordningen: namn.plattform.js > namn.native.js > namn.js. Tillägget .native.js används för gemensam kod som fungerar på båda plattformarna men inte är kompatibel med webben. Tilläggen .ios.js och .android.js används för att implementera specifika funktioner — navigering, gester, arbete med filsystemet. Metro stöder anpassade tillägg via konfigurationen resolver.sourceExts.
// metro.config.js — inställning av sourceExts och watchFolders
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 är den heta omladdningsmekanismen för React Native implementerad ovanpå Metro. När en utvecklare ändrar en fil transpilerar Metro bara den ändrade modulen och skickar uppdateringen till appen via WebSocket. Fast Refresh uppdaterar gränssnittet utan att ladda om hela appen och bevarar React-komponenternas tillstånd om bara JSX eller stilar har ändrats. Om kod med hooks eller tillstånd har ändrats utför Fast Refresh ommontering av endast den ändrade komponenten. Metro stöder två lägen: Hot Module Replacement (HMR) för direkt utbyte av moduler och Live Reload för fullständig omladdning av appen vid ändring av inbyggda moduler eller konfiguration. Fast Refresh är aktiverat som standard i React Native 0.76 och kräver ingen extra konfiguration — det räcker att köra npx react-native start.
| Läge | Hastighet | Bevarar tillstånd | Utlösare |
|---|---|---|---|
| Fast Refresh | 200-500ms | Ja | Ändring av JS/TS-filer |
| HMR | 100-300ms | Ja | Ändring av CSS/stilar |
| Live Reload | 1-3s | Nej | Ändring av native config |
| Full Rebuild | 10-60s | Nej | Ändring av podspec/build.gradle |
metro.config.js är konfigurationsfilen för Metro, belägen i roten av React Native-projektet. I den konfigureras: resolver (sourceExts, platformExtensions, extraNodeModules), transformer (babelTransformerPath, minifierConfig), server (port, host, enableFastRefresh) och watcher (watchFolders, healthCheck). Standardkonfigurationen för Metro ärvs från paketet @react-native/metro-config (React Native 0.76+). För projekt med monorepo, lägg till watchFolders — detta gör att Metro kan spåra ändringar i paket utanför projektroten. För att konfigurera sourceExts, lägg till 'svg', 'png', 'gql' för anpassade transformatorer. Metro stöder asynkrona konfigurationer via async function — detta är användbart för dynamisk generering av konfiguration baserat på miljön.
Optimering av Metro-bygge börjar med rätt cache-konfiguration. Ställ in maxWorkers till antalet CPU:er minus 1. För distributioner, använd resetCache på CI. Minimera sourceExts — extra tillägg saktar ner modulupplösning. För stora projekt, konfigurera watchFolders endast på nödvändiga kataloger. Metro stöder Hermes bytecode-minifiering, som ger mindre paketstorlek än standard Terser — använd minifierPath: 'metro-minify-terser'.
Metro stöder läget att bygga direkt till Hermes bytekod — hoppa över JavaScript AST-steget. Vid bygge med HermesTransformer kompileras moduler till HBC (Hermes ByteCode) istället för vanlig JavaScript. Detta ger: mindre paketstorlek (med 30-40%), snabbare appstart (med 20-30%) och lägre minnesförbrukning. För att aktivera, ställ in hermesCommand i metro.config.js och aktivera Hermes-flaggan i build.gradle (Android) eller Podfile (iOS). Bygget av Hermes-paket sker i två steg: först bygger Metro JavaScript-paketet, sedan konverterar Hermes CLI det till HBC. Från och med React Native 0.70 är Hermes standardmotorn på Android, på iOS krävs explicit aktivering.
Skillnaden mellan Metro och Webpack beror på olika mål. Webpack är en universell bundler för webben med ett enormt ekosystem av plugins och loaders. Metro är en specialiserad bundler för React Native, där prioritet är hastigheten på inkrementellt bygge och korrekt funktion med inbyggda moduler. Webpack använder en långvarig modulgraf med intelligent cache-invalidering — detta ger snabba ombyggen på webben men skapar problem med plattformstillägg. Metro cache-lagrar inte grafen mellan byggen, utan bygger den varje gång — detta förenklar bearbetningen av plattformstillägg och Haste-moduler. Webpack stöder dynamiska importer med chunks, Metro också — via React.lazy() och Suspense, men med begränsning till en aktiv förfrågan. Metros ekosystem är betydligt mindre: det finns ingen ersättning för style-loader, css-loader, file-loader — dessa uppgifter löses annorlunda i React Native.
Metro är det enda rätta valet för React Native-projekt. Webpack stöder inte plattformsmedveten resolution direkt ur lådan, och att konfigurera React Native med Webpack kräver betydande ansträngning (haul bundler, expo web packager). Metro är integrerat i React Native CLI, stöds av det officiella Meta-teamet och får uppdateringar med varje React Native-utgåva. För React Native Web-projekt kan du använda Webpack för webbbygge, medan Metro behålls för mobila paket.
Vanliga frågor
Kör npx react-native start --reset-cache eller ta bort mappen $TMPDIR/metro-* och katalogen .metro-health-check* i projektroten. Alternativt: npx react-native clean — detta kommando rensar alla temporära Metro-filer, inklusive Babel-cachen och Haste-kartan. Efter rensning kommer det första bygget att vara fullständigt (60-120 sekunder), men efterföljande inkrementella byggen återgår till normal hastighet.
Kontrollera att paketet finns i package.json dependencies (inte devDependencies). Om modulen finns i ett monorepo, lägg till sökvägen i watchFolders i metro.config.js. Metro följer inte symlinks som standard — använd resolver.extraNodeModules för explicit mappning. För Yarn PnM, ställ in resolver.useWatchman: false. Om modulen använder plattformstillägg, se till att .ios.js- eller .android.js-filerna finns på angiven sökväg.
Öka maxWorkers i metro.config.js till antalet CPU:er minus 1. Konfigurera watchFolders endast på nödvändiga kataloger. Använd Hermes bytekod för produktionsbygge — detta påskyndar det slutliga bygget genom att hoppa över JS-minifiering. För utveckling, aktivera Fast Refresh(aktiverat som standard). Begränsa sourceExts till endast nödvändiga tillägg. Överväg att dela upp paketet i chunks genom lazy loading.
Tekniskt ja, men det rekommenderas inte. Metro är inte optimerat för webbbygge: det finns inget stöd för CSS, HTML, bilder som moduler, ingen code splitting med dynamisk import på webbläsarnivå. För webben, använd Webpack, Vite eller Parcel. Metro är en specialiserad lösning för React Native, och ett försök att anpassa det för webben kommer att leda till prestandaförlust och brist på loader-ekosystem.
Re.Pack är ett community-verktyg för att ersätta Metro med Webpack i React Native-projekt. Det ger tillgång till Webpacks loader-ekosystem (css-loader, svg-loader) och avancerad code splitting. Dock är Re.Pack mer komplext att konfigurera, stöds inte officiellt av Meta och garanterar inte kompatibilitet med nya versioner av React Native. Metro förblir den enda officiellt stödda bundlern, vilket ger stabilitet och kompatibilitetsgaranti med varje utgåva.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också