Metro: bu nədir, əsas imkanları və iş prinsipi

Müəllif: IT Sectr Dərc olunub: 2026-05-19 Oxuma vaxtı: 8 dəq

Metro — React Native üçün xüsusi olaraq hazırlanmış və bu platformada mobil tətbiqlərin yığılması üçün standart olaraq istifadə edilən JavaScript bundleridir. Universal bundlerlərdən fərqli olaraq, Metro mobil cihazların məhdud resursları üçün optimallaşdırılmışdır və Hermes mühərriki və Fast Refresh ilə inteqrasiyanı təmin edir. Metro Documentation (2026) məlumatlarına görə, bundler dünyadakı React Native layihələrinin 90%-dən çoxunu emal edir.

Əsas məqamlar

  • Metro — iOS və Android üçün mobil inkişaf üçün optimallaşdırılmış, React Native üçün standart bundler.
  • Üç fazalı arxitektura Metro modulların həllini, transformasiyasını və çıxış bundle-a serializasiyasını əhatə edir.
  • Fast Refresh — tətbiqin vəziyyətini itirmədən komponentlərin isti yüklənmə mexanizmi.
  • Inline Requires modulların yüklənməsini ilk çağırış anına qədər təxirə salır, başlanğıc bundle-ı azaldır.
  • Hermes — Meta tərəfindən öncədən tərtib edilmiş bayt-kod yaratmaq üçün Metro-dan istifadə edən JavaScript mühərriki.

Metro nədir?

Metro — Meta komandası tərəfindən React Native üçün yaradılmış açıq mənbəli JavaScript bundleridir. O, React Native-in ilkin versiyalarındakı Packager-i əvəz etdi və bu platforma üçün standart kompilasiya alətinə çevrildi. Metro veb inkişafı üçün nəzərdə tutulmayıb: onun arxitekturası yalnız JSC (JavaScriptCore) və ya Hermes JavaScript mühərrikləri altında işləyən mobil tətbiqlərə yönəlmişdir.

Yaranma tarixi və mövqeləndirmə

Metro 2018-ci ildə köhnə React Native Packager-in əvəzi olaraq ortaya çıxdı. Yaranmasının əsas səbəbi böyük mobil tətbiqlərdə milyonlarla modulla səmərəli işləyə biləcək bir bundlerə ehtiyac idi. Webpack-dən fərqli olaraq, Metro CSS, HTML və ya şəkilləri modul kimi dəstəkləmir — bu resurslar React Native-in ayrı alətləri ilə emal olunur. Facebook 100 mindən çox faylı olan əsas tətbiqini qurmaq üçün Metro-dan istifadə edir.

Metro npm vasitəsilə metro paketi kimi yayılır və React Native CLI ilə birlikdə avtomatik quraşdırılır. Metro versiyası React Native versiyasına bağlıdır, buna görə bundlerin yenilənməsi platformanın yenilənməsi ilə birlikdə baş verir.

Metro bundleri necə işləyir?

Metro girişdə tətbiqin giriş nöqtəsini qəbul edir, asılılıq qrafını qurur, hər modulu transformasiya edir və nəticəni vahid bundle-a serializasiya edir. Proses üç fazadan keçir: Resolve (modulların həlli), Transform (transformasiya) və Serialize (serializasiya).

Metro-da kompilasiya prosesi

js
// Xüsusi transformasiya üçün Metro konfiqurasiya nümunəsi
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);
      };
    },
  },
};

Resolve mərhələsində Metro hər idxal edilən modulun yerini, aliasları və node_modules-u nəzərə alaraq mövqeyini müəyyənləşdirir. Transform mərhələsində hər fayl JSX, TypeScript və digər genişləndirmələri təm JavaScript-ə çevirmək üçün Babel transformatorundan keçir. Son Serialize mərhələsi bütün transformasiya olunmuş modulları bir və ya bir neçə bundle faylına toplayır.

Metro arxitekturası

Metro modular arxitektura üzərində qurulmuşdur, burada kompilasiyanın hər mərhələsi ayrıca komponent kimi həyata keçirilmişdir. Bu, bundlerin özəyini dəyişmədən standart modulları xüsusi olanlarla əvəz etməyə imkan verir. Metro arxitekturası üç əsas paketi əhatə edir: metro, metro-configmetro-resolver.

Metro-nun əsas komponentləri

Metro Servernpx react-native start komandası ilə işə salınan tərtibat serveridir. O, real vaxtda modul transformasiya sorğularına xidmət edir, Fast Refresh təmin edir. Module Store — təkrar kompilasiyaları sürətləndirmək üçün transformasiya olunmuş modulları yaddaşda saxlayan keş. Dependency Graph — fayllar dəyişərkən artımlı şəkildə yenilənən asılılıq qrafı.

Watchman — Metro-nun fayl sistemindəki dəyişiklikləri aşkarlamaq üçün istifadə etdiyi Meta-nın fayl müşahidəçisidir. Watchman olmadan Metro hər dəyişiklikdə bütün fayl quruluşunu yenidən skan etməli olur, bu da inkişafı əhəmiyyətli dərəcədə yavaşaldır. Watchman quraşdırma istənilən ölçüdəki layihələrdə Metro ilə rahat işləmək üçün məcburidir.

React Native layihəsində Metro konfiqurasiyası

Konfiqurasiya Metro layihənin kök qovluğunda metro.config.js faylında müəyyənləşdirilir. Tipik fayl modulların axtarışı üçün əlavə qovluqlar, lazımsız faylları istisna etmək üçün bloklamalar və xüsusi transformatorlar təyin edir. React Native 0.72+-də konfiqurasiyanın avtomatik aşkarlanması istifadə olunur, lakin monorepozitoriyalar üçün konfiqurasiya məcburidir.

React Native üçün əsas Metro konfiqurasiyası

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 test fayllarını kompilasiyadan istisna edir, bundle ölçüsünü azaldır. nodeModulesPaths paketlərin axtarışı üçün əlavə yollar göstərir — monorepozitoriyalar üçün kritikdir. extraNodeModules monorepozitoriyanın müxtəlif layihələrində istifadə olunan ümumi paketlər üçün aliaslar yaradır.

Metro kompilasiyasının optimallaşdırılması

Metro bundle ölçüsü və kompilasiya sürətini optimallaşdırmaq üçün bir neçə mexanizm təmin edir. Inline Requires — ən təsirli texnika, yuxarı səviyyəli idxalları funksiyalar daxilində lokal require-ə çevirir. RAM bundles modulların artımlı yüklənməsinə imkan verir. Hermes JavaScript-i bayt-koda kompilasiya edir, tətbiqin ölçüsünü 20–30% azaldır.

Inline Requires və Hermes-in aktivləşdirilməsi

js
// metro.config.js — istehsal üçün optimallaşdırma
const config = {
  transformer: {
    async transform({ src, filename, options }) {
      const inlineRequires = options.dev ? false : true;
      return await defaultTransform({ src, filename, options: { ...options, inlineRequires } });
    },
  },
  serializer: {
    polyfillModuleNames: [],
  },
};

// Hermes-i aktivləşdirmək üçün — build.gradle (Android):
// project.ext.react = [enableHermes: true, bundleInRelease: true]
// iOS üçün — Podfile: :hermes_enabled => true

Bundle ölçüsünün diaqnostikası üçün Metro statistik məlumat çıxışı ilə --bundle-output bayrağını təmin edir. Bundle-in tərkibini təhlil etmək və tənəl yüklənə biləcək böyük modulları tapmaq üçün bundle-visualizer istifadə edin. Bundle ölçüsünün mütəmadi yoxlanması React Native layihəsinin CI/CD boru kəmərinin bir hissəsi olmalıdır.

Delta Bundles və artımlı kompilasiya

Metro delta-bundle-ları dəstəkləyir — ilk tam kompilasiyadan sonra serverin köhnə və yeni bundle versiyaları arasında yalnız dəyişiklikləri (delta) göndərdiyi mexanizm. Bu, sonrakı kompilasiyaları köklü şəkildə sürətləndirir: yenilənmə vaxtı saniyələrdən onlarla millisaniyəyə enir. Delta-bundle-lar xüsusilə tərtibat mərhələsində, proqramçı tez-tez dəyişiklikləri yadda saxlayıb tətbiqi yenidən yüklədikdə təsirli olur.

React Native-də delta-bundle-ları aktivləşdirmək üçün npx react-native bundle komandasında --delta bayrağı istifadə olunur. Klient tərəfində delta-bundle-lar React Native 0.64-dən etibarən dəstəklənir. İstehsal kompilasiyalarında delta-bundle-lar tətbiq edilmir — onların əvəzinə maksimum başlanğıc performansı üçün Hermes bayt-kodu ilə tam bundle istifadə olunur. Bu, inkişaf sürətinin artımının ilk tam kompilasiya xərclərini kompensasiya etməsi ilə əldə edilir.

Hermes və Metro: birgə iş

Hermes — Meta tərəfindən xüsusi olaraq React Native üçün hazırlanmış JavaScript mühərrikidir. Metro kompilasiya mərhələsində Hermes bayt-kodu yaradır ki, bu da tətbiqin cihazda bahalı JavaScript kompilasiyası olmadan işə düşməsinə imkan verir. Hermes-i aktivləşdirmək üçün metro.config.js-də enableHermes: true əlavə etmək və build.gradle və ya Podfile-ı konfiqurasiya etmək kifayətdir. Hermes JavaScriptCore ilə müqayisədə tətbiqin başlanğıc vaxtını 30–50% azaldır və APK ölçüsünü 20–30% kiçildir.

Hermes istifadə edərkən məhdudiyyətləri xatırlamaq vacibdir: mühərrik Proxy, Reflect və bəzi ES6 imkanlarını dəstəkləmir. Əksər React Native tətbiqləri bu imkanlardan birbaşa istifadə etmir, lakin bəzi kitabxanalar münaqişə yarada bilər. Hermes-i aktivləşdirməzdən əvvəl bütün layihə asılılıqlarının uyğunluğunu rəsmi uyğunluq siyahısı vasitəsilə yoxlayın. Metro Hermes aktivləşdirildikdə avtomatik olaraq bayt-kod yaratma rejiminə keçir.

Metro performansının monitorinqi

Metro kompilasiyasının səmərəliliyini izləmək üçün Flipper — React Native debug aləti vasitəsilə əldə olunan daxili metrikalardan istifadə edin. Metro hər mərhələnin icra vaxtı ilə bağlı hadisələr dərc edir: bundle_request, transform, resolve. Bu məlumatların təhlili dar boğazları müəyyənləşdirməyə kömək edir: əgər transform fazası vaxtın 70%-dən çoxunu tutursa, problem Babel transformatorundadır. Ətraflı diaqnostika üçün Metro loglarını --verbose bayrağı vasitəsilə aktivləşdirin.

Tez-tez verilən suallar

React Native-də Metro-nu Webpack ilə əvəz etmək olarmı?

Texniki olaraq bəli — react-native-webpack kimi eksperimental layihələr var, lakin onlar rəsmi olaraq dəstəklənmir. Metro React Native bridge, Turbo Modules və Hermes ilə Webpack üçün əlçatmaz səviyyədə inteqrasiya olunub. Metro-nun dəyişdirilməsi Fast Refresh və rəsmi dəstəyin itirilməsinə səbəb olacaq.

Niyə Metro CSS-ni dəstəkləmir?

React Native stilizasiya üçün CSS istifadə etmir — bunun əvəzinə StyleSheet.create vasitəsilə JavaScript stilizasiyası tətbiq olunur. Metro yalnız React Native üçün yaradıldığından, CSS dəstəyinə ehtiyac yoxdur. React Native Web vasitəsilə veb render etmək üçün CSS Metro xaricində ayrı alətlərlə emal olunur.

Metro şəkilləri və şriftləri necə emal edir?

Metro şəkilləri və ya şriftləri modul kimi emal etmir. Resurslar require('./image.png') vasitəsilə qoşulur, lakin Metro onları yalnız sətir asılılıqları kimi qeydiyyata alır. Şəkillərin faktiki yüklənməsi React Native-in nativ kodu tərəfindən Image komponenti vasitəsilə həyata keçirilir, Metro isə resursları bundle-a köçürür.

Metro Rollup-dan nə ilə fərqlənir?

Rollup kitabxanalar üçün minimal bundle ölçüsü verən modul səviyyəsində tree shaking ilə ES modulları yaradır. Metro mobil mühərriklər üçün inline transformasiya və optimallaşdırma ilə CommonJS bundle yaradır. Rollup Fast Refresh-i dəstəkləmir və React Native-in nativ modulları ilə işləyə bilmir.

Metro-nun soyuq kompilasiyasını necə sürətləndirmək olar?

Soyuq kompilasiya node_modules-un tam skan edilməsi səbəbindən yavaş olur. Həll yolları: monorepozitoriyalar üçün watchFolders əlavə edin, paralel transformasiya üçün maxWorkers istifadə edin və Watchman quraşdırın. 10 000+ faylı olan layihələr üçün yaddaşda keşləmə üçün metro-memory-fs-i nəzərdən keçirin.

Nəticə

  • Metro — məhdud resurslu mobil platformalar üçün optimallaşdırılmış standart React Native bundleri.
  • Üç fazalı arxitektura (Resolve, Transform, Serialize) artımlı kompilasiya və Fast Refresh təmin edir.
  • Fast Refresh — tətbiqin vəziyyətini itirmədən dəyişdirilmiş komponentlərin isti yüklənməsi.
  • Inline Requires modulların yüklənməsini ilk çağırışa qədər təxirə salır, başlanğıc bundle-ı 15–30% azaldır.
  • Hermes — Meta-nın JavaScript mühərriki, başlanğıcı sürətləndirmək üçün Metro vasitəsilə JS-ni bayt-koda kompilasiya edir.
  • Watchman — çox sayda faylı olan layihələrdə Metro ilə rahat iş üçün məcburi fayl müşahidəçisi.
  • Monorepozitoriyalar üçün modulların düzgün həlli üçün watchFoldersextraNodeModules konfiqurasiyası tələb olunur.

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun