Metro Bundler: шта је то, прављење пројекта и принцип рада

Аутор: IT Sectr Објављено: 2026-07-06 Време читања: 8 мин

Metro Bundler је специјализовани JavaScript бандлер од Meta, развијен искључиво за React Native и чини језгро фрејмворка. Према званичној документацији React Native 0.76 (2025), Metro обезбеђује инкрементално прављење са Fast Refresh и резолуцију модула узимајући у обзир платформска проширења .native.js, .ios.js и .android.js. За разлику од Webpack-а, Metro не користи дуготрајни кеш module graph — уместо тога поново гради граф сваки пут када се фајлови промене, што даје тренутни Hot Reload током развоја.

Главне тачке

  • Metro Bundler — званични JavaScript бандлер React Native са подршком за платформска проширења
  • Fast Refresh — вруће поновно учитавање са чувањем стања компоненти при промени кода
  • Haste Module System — систем стабилних ID-ова модула за инкрементална прављења
  • Платформска проширења — .native.js, .ios.js, .android.js за раздвајање кода по платформи
  • Hermes bytecode — режим прављења директно у бајт-код за Hermes мотор

Шта је Metro Bundler

Metro Bundler је JavaScript бандлер отвореног кода, развијен од стране Meta за React Native и коришћен подразумевано у свим пројектима фрејмворка. Задатак Metro-а је да узме JavaScript код пројекта заједно са зависностима и направи један или више бандлова који се извршавају на уређају. За разлику од универзалних бандлера (Webpack, Rollup, Parcel), Metro је оптимизован за специфичности мобилног развоја: минимално време прављења, инкрементална ажурирања током развоја и исправан рад са платформским модулима (нативни модули Objective-C, Swift, Java, Kotlin). Metro се испоручује у саставу React Native CLI и не захтева посебну инсталацију. Почев од React Native 0.72, Metro верзија 0.80+ подржава паралелну транспилацију модула, што убрзава прављење на вишејезгарним процесорима до 40%.

Архитектура Metro: Resolver, Transformer и Bundler

Архитектура Metro је подељена на три независне компоненте: Resolver, Transformer и Bundler. Resolver је одговоран за претрагу и резолуцију модула — чита import/require изразе, проналази одговарајуће фајлове узимајући у обзир платформска проширења и враћа апсолутне путање. Transformer врши транспилацију: примењује Babel са preset-има и plugin-има, претвара JSX, TypeScript или Flow у чисти JavaScript. Bundler је завршна фаза: прима граф зависности од Resolver-а и трансформисане фајлове од Transformer-а, затим их серијализује у један или више бандлова (module bundles). Подела на три корака омогућава Metro-у да кешира резултате сваке фазе: ако се променио само један фајл, Resolver и Bundler могу користити кеш за преостале модуле, што даје повећање брзине прављења до 10 пута у развојном режиму.

Resolver: резолуција модула и platform-aware претрага

Resolver у Metro-у имплементира алгоритам резолуције модула, делимично компатибилан са Node.js module resolution. Кључна разлика од Node.js-а — подршка за платформска проширења: require('./Component') тражи Component.native.js, Component.ios.js, Component.android.js у одређеном редоследу приоритета. Resolver такође подржава package.json поље "react-native" за мапирање модула на алтернативне имплементације — ово је стандардни механизам за библиотеке са платформским кодом. Ако фајл није пронађен, Resolver баца грешку са комплетним стеком претраге.

Transformer: Babel и транспилација

Transformer унутар Metro-а користи Babel са preset-ом metro-react-native-babel-preset. Стандардна конфигурација укључује: претварање JSX у React.createElement, подршку за TypeScript (уклањање типова), подршку за Flow и полифилове за модерне JavaScript стандарде (async/await, optional chaining, nullish coalescing). Transformer ради у паралелном режиму: сваки модул се транспилира независно, користећи pool worker процеса (подразумевано број одговара броју CPU-а). Почев од Metro 0.80, подржан је Granular Transformer Cache — инвалидација кеша на нивоу појединачног фајла.

Платформска проширења у Metro

Једна од кључних карактеристика Metro-а је подршка за платформска проширења фајлова. React Native пројекат може садржати три верзије истог модула: Component.ios.js (iOS), Component.android.js (Android) и Component.native.js(обе платформе). При импорту require('./Component'), Resolver аутоматски бира исправну верзију у зависности од циљне платформе прављења. Ово омогућава писање кода зависног од платформе без условних конструкција Platform.OS. Редослед приоритета: име.платформа.js > име.native.js > име.js. Проширење .native.js се користи за заједнички код који ради на обе платформе, али није компатибилан са вебом. Проширења .ios.js и .android.js служе за имплементацију специфичних функција — навигација, гестови, рад са фајл системом. Metro подржава прилагођена проширења кроз конфигурацију resolver.sourceExts.

js
// metro.config.js — подешавање sourceExts и 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')],
};

Hot Reload и Fast Refresh у Metro

Fast Refresh је механизам врућег поновног учитавања React Native-а имплементиран на бази Metro-а. Када програмер промени фајл, Metro поново транспилира само измењени модул и шаље ажурирање апликацији преко WebSocket-а. Fast Refresh ажурира интерфејс без поновног учитавања целе апликације и чува React стање компоненти ако су промењени само JSX или стилови. Ако је промењен код са hook-овима или стањем, Fast Refresh врши поновно монтирање само измењене компоненте. Metro подржава два режима: Hot Module Replacement (HMR) за замену модула у лету и Live Reload за потпуно поновно учитавање апликације при промени нативних модула или конфигурације. Fast Refresh је подразумевано укључен у React Native 0.76 и не захтева додатну конфигурацију — довољно је покренути npx react-native start.

РежимБрзинаЧува стањеОкидач
Fast Refresh200-500msДаПромена JS/TS фајлова
HMR100-300msДаПромена CSS/стилова
Live Reload1-3sНеПромена native config
Full Rebuild10-60sНеПромена podspec/build.gradle

Конфигурација Metro: metro.config.js

metro.config.js је конфигурациони фајл Metro-а, који се налази у корену React Native пројекта. У њему се конфигуришу: resolver (sourceExts, platformExtensions, extraNodeModules), transformer (babelTransformerPath, minifierConfig), server (port, host, enableFastRefresh) и watcher (watchFolders, healthCheck). Стандардна конфигурација Metro се наслеђује од пакета @react-native/metro-config (React Native 0.76+). За пројекте са монорепозиторијумом, додајте watchFolders — ово ће омогућити Metro-у да прати промене у пакетима изван корена пројекта. За конфигурацију sourceExts, додајте 'svg', 'png', 'gql' за прилагођене трансформере. Metro подржава асинхроне конфигурације кроз async function — ово је корисно за динамичко генерисање конфигурације на основу окружења.

Оптимизација прављења кроз конфигурацију

Оптимизација прављења Metro-а почиње са правилном конфигурацијом кеша. Поставите maxWorkers на број CPU-а минус 1. За дистрибуције користите resetCache на CI-ју. Минимизирајте sourceExts — додатна проширења успоравају резолуцију модула. За велике пројекте, конфигуришите watchFolders само на потребне директоријуме. Metro подржава Hermes bytecode minification, који даје мању величину бандла од стандардног Terser-а — користите minifierPath: 'metro-minify-terser'.

Hermes бандлинг: прављење у бајт-код

Metro подржава режим прављења директно у Hermes bytecode — прескачући фазу JavaScript AST. При прављењу са HermesTransformer-ом, модули се компилирају у HBC (Hermes ByteCode) уместо у обичан JavaScript. Ово даје: мању величину бандла (за 30-40%), брже покретање апликације (за 20-30%) и мању потрошњу меморије. За активацију, поставите hermesCommand у metro.config.js и активирајте Hermes флаг у build.gradle (Android) или Podfile (iOS). Прављење Hermes бандлова се изводи у две фазе: прво Metro прави JavaScript бандл, затим Hermes CLI га конвертује у HBC. Почев од React Native 0.70, Hermes је подразумевани мотор на Android-у, на iOS-у захтева експлицитну активацију.

Metro против Webpack: поређење приступа

Разлика између Metro-а и Webpack-а произилази из различитих циљева. Webpack је универзални бандлер за веб са огромним екосистемом plugin-а и loadera. Metro је специјализовани бандлер за React Native, где је приоритет брзина инкременталног прављења и исправан рад са нативним модулима. Webpack користи дуготрајни граф модула са интелигентном инвалидацијом кеша — ово даје брза поновна прављења на вебу, али ствара проблеме са платформским проширењима. Metro не кешира граф између прављења, већ га гради сваки пут — ово поједностављује обраду платформских проширења и Haste модула. Webpack подржава динамичке импорте са чанковима, Metro такође — кроз React.lazy() и Suspense, али са ограничењем на један активан захтев. Metro екосистем је значајно мањи: не постоји замена за style-loader, css-loader, file-loader — ови задаци се решавају другачије у React Native.

Када изабрати Metro

Metro је једини исправан избор за React Native пројекте. Webpack не подржава platform-aware resolution из кутије, а конфигурација React Native-а са Webpack-ом захтева значајан напор (haul bundler, expo web packager). Metro је интегрисан у React Native CLI, подржан од званичног Meta тима и добија ажурирања са сваким издањем React Native-а. За React Native Web пројекте можете користити Webpack за веб прављење, задржавајући Metro за мобилне бандлове.

Често постављана питања

Како очистити кеш Metro Bundler-а?

Покрените npx react-native start --reset-cache или обришите фасциклу $TMPDIR/metro-* и директоријум .metro-health-check* у корену пројекта. Алтернативно: npx react-native clean — ова команда чисти све привремене фајлове Metro-а, укључујући Babel кеш и Haste мапу. Након чишћења, прво прављење ће бити потпуно (60-120 секунди), али наредна инкрементална прављења ће се вратити на нормалну брзину.

Зашто Metro не види модул из node_modules?

Проверите присуство пакета у package.json dependencies (не devDependencies). Ако се модул налази у монорепозиторијуму, додајте путању у watchFolders у metro.config.js. Metro подразумевано не прати symlink-ове — користите resolver.extraNodeModules за експлицитно мапирање. За Yarn PnM поставите resolver.useWatchman: false. Ако модул користи платформска проширења, уверите се да фајлови .ios.js или .android.js постоје на наведеној путањи.

Како убрзати прављење Metro-а у великом пројекту?

Повећајте maxWorkers у metro.config.js на број CPU-а минус 1. Конфигуришите watchFolders само на потребне директоријуме. Користите Hermes bytecode за продукцијска прављења — ово убрзава коначно прављење прескакањем JS минификације. За развој, укључите Fast Refresh (подразумевано је укључен). Ограничите sourceExts само на потребна проширења. Размотрите поделу бандла на чанкове кроз lazy loading.

Може ли се Metro користити за веб пројекте?

Технички да, али се не препоручује. Metro није оптимизован за веб прављења: не постоји подршка за CSS, HTML, слике као модуле, нема code splitting са динамичким импортом на нивоу прегледача. За веб користите Webpack, Vite или Parcel. Metro је специјализовано решење за React Native, а покушај прилагођавања вебу ће довести до губитка перформанси и недостатка екосистема loadera.

По чему се Metro разликује од Re.Pack-а?

Re.Pack је community алат за замену Metro-а Webpack-ом у React Native пројектима. Омогућава приступ екосистему Webpack loadera (css-loader, svg-loader) и напредном code splitting-у. Међутим, Re.Pack је сложенији за конфигурацију, није званично подржан од стране Meta-е и не гарантује компатибилност са новим верзијама React Native-а. Metro остаје једини званично подржани бандлер, што даје стабилност и гаранцију компатибилности са сваким издањем.

Закључци

  • Metro Bundler — званични JavaScript бандлер React Native са архитектуром Resolver-Transformer-Bundler
  • Платформска проширења (.ios.js, .android.js, .native.js) — кључна функција за раздвајање платформског кода
  • Fast Refresh — вруће поновно учитавање са чувањем стања компоненти, које ради преко WebSocket-а
  • Конфигурација кроз metro.config.js: sourceExts, watchFolders, maxWorkers за оптимизацију прављења
  • Hermes bytecode — режим прављења у бајт-код за брже покретање и мању величину бандла
  • Resolver користи Haste Module System и platform-aware resolution — није компатибилан са Webpack-ом
  • Transformer ради паралелно кроз Babel са pool-ом worker процеса
  • Metro је део React Native CLI-ја и не захтева посебну инсталацију или конфигурацију за покретање

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође