Metro: ce este, capacități cheie și principiul de funcționare

Autor: IT Sectr Publicat: 2026-05-19 Timp de citire: 8 min

Metro — un bundler JavaScript dezvoltat special pentru React Native și utilizat implicit pentru construirea aplicațiilor mobile pe această platformă. Spre deosebire de bundlerele universale, Metro este optimizat pentru resursele limitate ale dispozitivelor mobile și asigură integrarea cu Hermes engine și Fast Refresh. Conform Metro Documentation (2026), bundlerul procesează peste 90% din proiectele React Native din lume.

Principalele puncte

  • Metro — bundlerul implicit pentru React Native, optimizat pentru dezvoltarea mobilă pe iOS și Android.
  • Arhitectură trifazică Metro include rezolvarea modulelor, transformarea și serializarea într-un bundle de ieșire.
  • Fast Refresh — mecanism de reîncărcare la cald a componentelor fără pierderea stării aplicației.
  • Inline Requires amână încărcarea modulelor până la prima apelare, reducând bundle-ul inițial.
  • Hermes — motor JavaScript de la Meta, care folosește Metro pentru generarea de bytecode precompilat.

Ce este Metro?

Metro este un bundler JavaScript open-source, creat de echipa Meta pentru React Native. Acesta l-a înlocuit pe Packager din versiunile timpurii ale React Native și a devenit instrumentul standard de compilare pentru această platformă. Metro nu este destinat dezvoltării web: arhitectura sa este orientată exclusiv către aplicațiile mobile care rulează sub motoarele JavaScript JSC (JavaScriptCore) sau Hermes.

Istoricul creării și poziționarea

Metro a apărut în 2018 ca înlocuitor pentru vechiul React Native Packager. Motivul principal al creării a fost necesitatea unui bundler care să lucreze eficient cu milioane de module în aplicații mobile mari. Spre deosebire de Webpack, Metro nu suportă CSS, HTML sau imagini ca module — aceste resurse sunt procesate de instrumente separate React Native. Facebook folosește Metro pentru construirea aplicației sale principale, care conține peste 100 de mii de fișiere.

Metro este distribuit prin npm ca pachet metro și se instalează automat odată cu React Native CLI. Versiunea Metro este legată de versiunea React Native, deci actualizarea bundlerului are loc odată cu actualizarea platformei.

Cum funcționează bundlerul Metro?

Metro primește la intrare punctul de intrare al aplicației, construiește graful de dependențe, transformă fiecare modul și serializează rezultatul într-un singur bundle. Procesul parcurge trei faze: Resolve (rezolvarea modulelor), Transform (transformarea) și Serialize (serializarea).

Procesul de compilare în Metro

js
// Exemplu de configurare Metro pentru transformare personalizată
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);
      };
    },
  },
};

În faza Resolve, Metro determină locația fiecărui modul importat, ținând cont de aliasuri și node_modules. În faza Transform, fiecare fișier trece printr-un transformator Babel pentru conversia JSX, TypeScript și a altor extensii în JavaScript pur. Faza finală Serialize colectează toate modulele transformate într-unul sau mai multe fișiere bundle.

Arhitectura Metro

Metro este construit pe o arhitectură modulară, unde fiecare etapă de compilare este implementată ca o componentă separată. Acest lucru permite înlocuirea modulelor standard cu unele personalizate fără a modifica nucleul bundlerului. Arhitectura Metro include trei pachete principale: metro, metro-config și metro-resolver.

Componentele cheie ale Metro

Metro Server — serverul de dezvoltare care se lansează cu comanda npx react-native start. Acesta servește cererile de transformare a modulelor în timp real, asigurând Fast Refresh. Module Store — memoria cache care stochează modulele transformate în memorie pentru a accelera compilările repetate. Dependency Graph — graful de dependențe care se actualizează incremental la modificarea fișierelor.

Watchman — observatorul de fișiere de la Meta, pe care Metro îl folosește pentru a detecta modificările în sistemul de fișiere. Fără Watchman, Metro ar trebui să rescaneze întreaga structură de fișiere la fiecare modificare, ceea ce încetinește semnificativ dezvoltarea. Instalarea Watchman este obligatorie pentru lucrul confortabil cu Metro pe proiecte de orice dimensiune.

Configurarea Metro în proiectul React Native

Configurarea Metro se face în fișierul metro.config.js din rădăcina proiectului. Un fișier tipic definește foldere suplimentare pentru căutarea modulelor, blocaje pentru excluderea fișierelor inutile și transformatoare personalizate. În React Native 0.72+ se utilizează detectarea automată a configurării, dar pentru monorepozitorii configurarea este obligatorie.

Configurarea de bază Metro pentru React Native

js
// 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 exclude fișierele de test din compilare, reducând dimensiunea bundle-ului. nodeModulesPaths indică căi suplimentare pentru căutarea pachetelor — critic pentru monorepozitorii. extraNodeModules creează aliasuri pentru pachetele comune utilizate în diferite proiecte ale monorepozitoriului.

Optimizarea compilării Metro

Metro oferă mai multe mecanisme pentru optimizarea dimensiunii bundle-ului și a vitezei de compilare. Inline Requires — cea mai eficientă tehnică, care transformă importurile de la nivel superior în require-uri locale în interiorul funcțiilor. RAM bundles permit încărcarea incrementală a modulelor. Hermes compilează JavaScript în bytecode, reducând dimensiunea aplicației cu 20–30%.

Activarea Inline Requires și Hermes

js
// metro.config.js — optimizare pentru producție
const config = {
  transformer: {
    async transform({ src, filename, options }) {
      const inlineRequires = options.dev ? false : true;
      return await defaultTransform({ src, filename, options: { ...options, inlineRequires } });
    },
  },
  serializer: {
    polyfillModuleNames: [],
  },
};

// Pentru activarea Hermes — în build.gradle (Android):
// project.ext.react = [enableHermes: true, bundleInRelease: true]
// Pentru iOS — în Podfile: :hermes_enabled => true

Pentru diagnosticarea dimensiunii bundle-ului, Metro oferă flag-ul --bundle-output cu ieșire de statistici. Folosește bundle-visualizer pentru analiza compoziției bundle-ului și găsirea modulelor mari care pot fi încărcate leneș. Verificarea regulată a dimensiunii bundle-ului ar trebui să fie parte a pipeline-ului CI/CD al proiectului React Native.

Delta Bundles și compilarea incrementală

Metro suportă delta-bundle-uri — un mecanism prin care, după prima compilare completă, serverul trimite doar modificările (delta) între versiunile veche și nouă ale bundle-ului. Acest lucru accelerează radical compilările ulterioare: timpul de actualizare se reduce de la secunde la zeci de milisecunde. Delta-bundle-urile sunt deosebit de eficiente în faza de dezvoltare, când dezvoltatorul salvează frecvent modificări și reîncarcă aplicația.

Pentru activarea delta-bundle-urilor în React Native se folosește flag-ul --delta în comanda npx react-native bundle. De partea clientului, delta-bundle-urile sunt suportate începând cu React Native 0.64. În compilările de producție, delta-bundle-urile nu se aplică — în locul lor se utilizează un bundle complet cu bytecode Hermes pentru performanță maximă la pornire. Acest lucru se realizează deoarece creșterea vitezei de dezvoltare compensează costurile primei compilări complete.

Hermes și Metro: lucrul împreună

Hermes — un motor JavaScript dezvoltat de Meta special pentru React Native. Metro generează bytecode Hermes în faza de compilare, ceea ce permite aplicației să pornească fără compilarea costisitoare a JavaScript pe dispozitiv. Pentru activarea Hermes este suficient să adăugați enableHermes: true în metro.config.js și să configurați build.gradle sau Podfile. Hermes reduce timpul de pornire a aplicației cu 30–50% și dimensiunea APK cu 20–30% comparativ cu JavaScriptCore.

Când utilizați Hermes, este important să țineți cont de limitări: motorul nu suportă Proxy, Reflect și unele capabilități ES6. Majoritatea aplicațiilor React Native nu folosesc aceste capabilități direct, dar unele biblioteci pot intra în conflict. Înainte de activarea Hermes, verificați compatibilitatea tuturor dependențelor proiectului prin lista oficială de compatibilitate. Metro comută automat în modul de generare a bytecode-ului la activarea lui Hermes.

Monitorizarea performanței Metro

Pentru urmărirea eficienței compilării Metro, utilizați metricile încorporate disponibile prin Flipper — instrumentul de depanare React Native. Metro publică evenimente: bundle_request, transform, resolve cu timpul de execuție al fiecărei etape. Analiza acestor date ajută la identificarea blocajelor: dacă faza transform ocupă mai mult de 70% din timp, problema este în transformatorul Babel. Activați logurile Metro prin flag-ul --verbose pentru o diagnosticare detaliată.

întrebări frecvente

Poate fi înlocuit Metro cu Webpack în React Native?

Tehnic da — există proiecte experimentale precum react-native-webpack, dar nu sunt suportate oficial. Metro este integrat cu React Native bridge, Turbo Modules și Hermes la un nivel inaccesibil pentru Webpack. Înlocuirea Metro va duce la pierderea Fast Refresh și a suportului oficial.

De ce Metro nu suportă CSS?

React Native nu folosește CSS pentru stilizare — în schimb se utilizează stilizarea JavaScript prin StyleSheet.create. Deoarece Metro este creat exclusiv pentru React Native, suportul CSS nu este necesar. Pentru randarea web prin React Native Web, CSS este procesat de instrumente separate în afara Metro.

Cum procesează Metro imaginile și fonturile?

Metro nu procesează imaginile sau fonturile ca module. Resursele sunt conectate prin require('./image.png'), dar Metro doar le înregistrează ca dependențe de șir. Încărcarea efectivă a imaginilor este realizată de codul nativ React Native prin componenta Image, iar Metro copiază resursele în bundle.

Cu ce diferă Metro de Rollup?

Rollup generează module ES cu tree shaking la nivel de module, oferind dimensiunea minimă a bundle-ului pentru biblioteci. Metro generează un bundle CommonJS cu transformare inline și optimizare pentru motoarele mobile. Rollup nu suportă Fast Refresh și nu poate lucra cu modulele native React Native.

Cum să accelerez compilarea la rece a Metro?

Compilarea la rece a Metro este încetinită de scanarea completă a node_modules. Soluții: adăugați watchFolders pentru monorepozitorii, folosiți maxWorkers pentru transformare paralelă și instalați Watchman. Pentru proiecte cu 10 000+ fișiere, luați în considerare metro-memory-fs pentru cache în memorie.

Concluzii

  • Metro — bundlerul standard pentru React Native, optimizat pentru platforme mobile cu resurse limitate.
  • Arhitectura trifazică (Resolve, Transform, Serialize) asigură compilarea incrementală și Fast Refresh.
  • Fast Refresh — reîncărcarea la cald a componentelor modificate fără pierderea stării aplicației.
  • Inline Requires amână încărcarea modulelor până la prima apelare, reducând bundle-ul inițial cu 15–30%.
  • Hermes — motorul JavaScript de la Meta, care compilează JS în bytecode prin Metro pentru accelerarea pornirii.
  • Watchman — observatorul de fișiere, obligatoriu pentru lucrul confortabil cu Metro pe proiecte cu un număr mare de fișiere.
  • Pentru monorepozitorii este necesară configurarea watchFolders și extraNodeModules pentru rezolvarea corectă a modulelor.

Vom dezvolta o aplicație mobilă la cheie

IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.

Discutați proiectul

Citiți și