Hermes — AOT (Ahead-of-Time) kompilyasiyası olan JavaScript mühərrikidir, Meta tərəfindən React Native üçün hazırlanmış və məhdud yaddaşa malik mobil cihazlar üçün optimallaşdırılmışdır. Rəsmi Meta Engineering blogunun (2022) məlumatına görə, Hermes proqramın işə salınma müddətini 20-50% azaldır və paket ölçüsünü JavaScriptCore ilə müqayisədə 30-40% kiçildir. V8 və ya JSC-dən fərqli olaraq, Hermes cihazda JIT kompilyasiyasından istifadə etmir — bütün JavaScript qurma mərhələsində Hermes CLI vasitəsilə bayt-koda kompilyasiya olunur. Bu, xüsusilə JIT kompilyasiyasının App Store siyasətləri ilə məhdudlaşdırıldığı iOS üçün vacibdir.
Əsas məqamlar
Hermes — Meta tərəfindən React Native üçün yaradılmış və məhdud resurslu mobil cihazlarda işləmək üçün optimallaşdırılmış açıq mənbəli (MIT lisenziyası) yığcam JavaScript mühərrikidir. Hermes-in əsas innovasiyası JIT kompilyasiyasından imtina edərək AOT (Ahead-of-Time) lehinə seçimdir. React Native proqramının qurma mərhələsində Metro Bundler kompilyasiya olunmuş JavaScript-i Hermes CLI-ya ötürür, o da onu HBC (Hermes ByteCode) bayt-koduna çevirir. Bu bayt-kod birbaşa mühərrik tərəfindən cihazda əlavə kompilyasiya olmadan icra olunur. Belə yanaşma proqnozlaşdırıla bilən performans təmin edir: JIT-in “qızınması” yoxdur, kompilyasiyada fasilələr yoxdur, əlavə batareya sərfiyyatı yoxdur. Hermes mobil cihazların məhdudiyyətləri nəzərə alınmaqla hazırlanmışdır: az RAM (1-4 GB), məhdud enerji sərfiyyatı və sürətli soyuq start zərurəti. Hermes-in ilk ictimai buraxılışı 2019-cu ildə olmuş, React Native 0.70-dən (2022) etibarən mühərrik Android-də standart halına gəlmişdir.
JavaScriptCore (JSC) — Safari və React Native tərəfindən 0.70 versiyasına qədər istifadə olunan standart WebKit mühərrikidir. JSC JIT kompilyasiyasını dəstəkləyir ki, bu da mürəkkəb JavaScript əməliyyatlarının yüksək performansını təmin edir. Lakin JIT qızınma tələb edir: kodun ilk saniyələri yavaş işləyir (interpreted rejimi), sonra JIT isti hissələri kompilyasiya edir. iOS-da JIT App Store siyasətlərinə görə praktiki olaraq əlçatmazdır (dinamik kod generasiyası qadağandır), ona görə də iOS-da JSC yalnız interpreted rejimində işləyir — performans aşağı düşür. JSC daha böyük ikili fayl ölçüsünə (təxminən 10 MB) malikdir və JIT infrastrukturuna görə daha çox RAM sərf edir. Hermes JIT-dən asılı deyil, bu da işə salındıqdan dərhal sonra proqnozlaşdırıla bilən performans təmin edir (soyuq start). JSC ECMAScript standartını daha tam dəstəkləyir (Proxy, BigInt, Reflect daxil olmaqla), lakin daha çox resurs sərfiyyatı bahasına. Soyuq start və kiçik ölçünün kritik olduğu React Native layihələri üçün Hermes üstünlük təşkil edir. JS-də ağır hesablamaları olan layihələr (oyunlar, WebGL) üçün JSC daha yüksək pik performans verə bilər.
| Parametr | Hermes | JavaScriptCore |
|---|---|---|
| Kompilyasiya | AOT (qurma mərhələsində) | JIT + Interpreted (cihazda) |
| Soyuq start | 20-50% sürətli | Baza səviyyəsi |
| Paket ölçüsü | 30-40% kiçik | Baza səviyyəsi |
| RAM sərfiyyatı | 20-30% az | Baza səviyyəsi |
| ECMAScript | ES2020 (məhdudiyyətlər) | ES2022+ (tam) |
| iOS JIT | Tələb olunmur | Əlçatmaz (yalnız interpreted) |
| İkili fayl | ~3 MB | ~10 MB |
AOT kompilyasiyası (Ahead-of-Time) Hermes-də iki mərhələdə baş verir. Birinci mərhələdə Metro Bundler JavaScript fayllarını vahid paketə toplayır və onu Hermes CLI-ya (hermesc aləti) ötürür. İkinci mərhələdə hermesc JavaScript AST-ni təhlil edir, HIR (Hermes Intermediate Representation) aralıq təsvirini yaradır və sonra HBC ikili bayt-kodunu emit edir. Nəticə yalnız bayt-kod olan, orijinal JavaScriptsiz .hbc faylıdır. Hermes runtime HBC-ni birbaşa, təhlil və kompilyasiya olmadan yükləyir. Bu, startı köklü şəkildə sürətləndirir: minlərlə JS sətirini təhlil etmək (async) əvəzinə mühərrik əvvəlcədən kompilyasiya olunmuş ikili formatı oxuyur. AOT həmçinin ölçünü azaldır: bayt-kod JavaScript AST-dən orta hesabla 30% daha yığcamdır. AOT-un çatışmazlığı — icra zamanı eval, new Function və ya dinamik require-in mümkünsüzlüyü: bütün modullar qurma mərhələsində məlum olmalıdır.
# Hermes CLI-ni müstəqil quraşdırın
npm install hermes-engine
# JS-ni HBC bayt-koduna kompilyasiya edin
npx hermesc -emit-binary -out bundle.hbc bundle.js
# Bayt-kod statistikası
npx hermesc -dump-bytecode bundle.hbc # shows HBC instructions
# Orijinal JS vs HBC ölçüsü
wc -c bundle.js # 2,300,000 bytes
wc -c bundle.hbc # 1,450,000 bytes (37% reduction)
Hermes performansı üç əsas metrika ilə ölçülür: Time-To-Interactive (TTI), APK/IPA ölçüsü və RAM sərfiyyatı. Meta-nın məlumatına görə, Android-də Hermes TTI-nı JSC ilə müqayisədə 34% azaldır: orta seqment cihazda (Moto G7) 4.2 saniyədən 2.8 saniyəyə. APK ölçüsü yığcam bayt-kod və JIT kitabxanalarının olmaması sayəsində 28% azalır. RAM sərfiyyatı eyni yük altında orta hesabla 22% aşağıdır — bu, xüsusilə 2-3 GB RAM-lı cihazlar üçün vacibdir. iOS-da qazanc daha da əhəmiyyətlidir: JSC JIT-dən istifadə edə bilmədiyi üçün Hermes TTI-da 45%-ə qədər artım verir. Metrikalar Meta-nın Facebook Lite tətbiqi ilə apardığı testlərə əsaslanır. Real layihələrdə qazanc dəyişir: sadə ekranlar (siyahılar, mətn) üçün Hermes daha çox artım verir, ağır animasiyalar üçün — daha az. Profilləşdirmə aləti: React Native Profiler + hermes profile --heap.
Hermes Chrome DevTools vasitəsilə əlçatan olan daxili yaddaş profilləşdiricisini ehtiva edir. Metro vasitəsilə tətbiqə qoşulun, Memory nişanını açın və snapshot növlərində Hermes (JavaScript) seçin. Hermes üç növ snapshot dəstəkləyir: Heap Snapshot (bütün obyektlər), Allocation Timeline (obyektlərin həyat müddəti) və Allocation Sampling (seçmə profil). Hades GC fasilələrinin sayını minimuma endirir — orta hesabla 10 saniyə iş ərzində 2-5ms davam edən bir GC fasiləsi, JSC-də eyni dövrdə 10-20ms fasilələrə qarşı.
Hades GC — minimal fasilələrlə mobil ssenarilər üçün hazırlanmış Hermes-də zibil yığandır. JSC-dəki mark-sweep GC-dən fərqli olaraq, Hades paralel (concurrent) yığımdan istifadə edir: yığıcı əsas icra axını ilə paralel işləyir, onu yalnız qısa müddətlərə dayandırır. Hades GC yığını nəsillərə bölür: gənc nəsil (nursery) tez-tez və sürətli yığılır (Scavenge), köhnə nəsil daha az və daha kiçik fasilələrlə yığılır. Yığın ölçüsü konfiqurasiya olunur: standart olaraq — tətbiqin əlçatan RAM-ının 2/3 hissəsi, minimal hədd — 32 MB. Hades stop-the-world yanaşmasından istifadə etmir: hətta köhnə nəslin tam yığılması 5-8ms-dən çox çəkmir. Yığıcı tipik mobil ssenari üçün optimallaşdırılmışdır: çoxlu qısaömürlü obyektlər (müvəqqəti sətirlər, React fibre obyektləri), az uzunömürlü. Intensiv obyekt yaradılması olan tətbiqlər (siyahılar, animasiyalar) üçün Hades JSC ilə müqayisədə daha hamar FPS təmin edir.
Hermes-in aktivləşdirilməsi React Native versiyasından və platformadan asılıdır. React Native 0.70-dən başlayaraq Hermes yeni layihələrdə Android üçün standart olaraq aktivdir. iOS üçün Hermes isteğe bağlıdır. Android-də aktivləşdirmək üçün: android/app/build.gradle faylında project.ext.react.enableHermes blokunda enableHermes: true təyin edin. iOS üçün: Podfile-da use_react_native!(:path => config[:reactNativePath], :hermes_enabled => true) vasitəsilə hermes_enabled-i true təyin edin. Aktivləşdirdikdən sonra pod install icra edin. Mövcud layihələr üçün kitabxanaların uyğunluğunu yoxlayın: Hermes Proxy, eval və bəzi ES2021 xüsusiyyətlərini dəstəkləmir. Konfiqurasiyanı yoxlamaq üçün npx react-native info istifadə edin. Hermes və JSC arasında keçid etmək üçün flaqı dəyişin və clean rebuild icra edin.
// android/app/build.gradle — Hermes-i aktivləşdirin
project.ext.react = [
enableHermes: true,
cliPath: "node_modules/react-native/cli.js"
]
// iOS/Podfile — iOS-da Hermes-i aktivləşdirin
require_relative '../node_modules/react-native/scripts/react_native_pods'
require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules'
target 'MyApp' do
config = use_native_modules!
use_react_native!(
:path => config[:reactNativePath],
:hermes_enabled => true
)
end
Hermes-in əsas məhdudiyyətləri JIT-dən imtina ilə bağlıdır. Hermes aşağıdakıları dəstəkləmir: Proxy və Reflect API (MobX, Vue, bəzi state-menecerlərdə istifadə olunur), BigInt (böyük ədədlər), Symbol.toStringTag, WeakRef və FinalizationRegistry. eval və new Function funksiyaları icra zamanı istisna yaradır. Array.prototype.flat və flatMap metodlarının this arqumenti ilə callback-ləri məhdudiyyətlərlə işləyir. Saat qurşaqları olan ISO 8601 tarix formatları tam işlənmir. Bu məhdudiyyətlərin əksəriyyəti tipik React Native tətbiqlərinə təsir etmir: React və React Native məhdud ES xüsusiyyətləri dəstindən istifadə edir. Kitabxana Proxy tələb edirsə (məsələn, Proxy ilə MobX 6+), configure({ useProxies: false }) istifadə edin və ya alternativ seçin. Mövcud kodun uyğunluğunu yoxlamaq üçün paketinizdə npx hermesc -check icra edin — dəstəklənməyən xüsusiyyətlərin siyahısını göstərəcək.
Tez-tez verilən suallar
Tətbiqin konsolunda console.log(global.HermesInternal) icra edin. HermesInternal obyekti varsa — proqram Hermes-də işləyir. Alternativ: console.log(global.HermesInternal?.getRuntimeProperties()) — mühərrik versiyasını və GC parametrlərini göstərəcək. Release qurmalarında HermesInternal ölçünü minimuma endirmək üçün əlçatmaz ola bilər.
Podfile parametrlərini yoxlayın: iOS-da Hermes New Architecture (Fabric Renderer) tələb edir. :hermes_enabled => true təyin edin, pod install --repo-update icra edin. Layihə React Native 0.70-dən aşağı versiyadan yenilənirsə, kitabxanaların New Architecture ilə uyğunluğunu yoxlayın. Əgər üçüncü tərəf kitabxanası JSC tələb edirsə, Hermes-i söndürün — bunun üçün flaqı false olaraq dəyişin və Pods-u yenidən qurun.
Xeyr, Hermes Hot Reload / Fast Refresh-ə təsir etmir. İnkişaf zamanı Metro JavaScript paketini Hermes kompilyasiyası olmadan işlədir (plain JS). Hermes bayt-kodu yalnız Release qurmaları üçün yaradılır. Debug rejimində standart JavaScriptCore və ya Hermes interpreted rejimində istifadə olunur. Konfiqurasiyada Hermes aktiv olduqda Hot Reload sürəti dəyişmir — keçid yalnız istehsal qurma mərhələsində baş verir.
Bəli, Expo SDK 45-dən başlayaraq Hermes managed workflow üçün dəstəklənir. app.json-da "jsEngine": "hermes" təyin edin. Bare workflow üçün Hermes adi React Native layihəsində olduğu kimi işləyir. Expo Go Hermes-i dəstəkləmir — Hermes ilə qurmalar üçün Expo Dev Client və ya EAS Build istifadə edin. expo doctor vasitəsilə kitabxanaların uyğunluğunu yoxlayın.
React Native Performance Monitor (FPS metrikaları) və Hermes Profiling Tools istifadə edin. Eyni cihazda Hermes və JSC ilə iki versiya qurun. Ölçün: soyuq start (işarəyə klikdən ilk interaktiv ekrana qədər), TTI (Time-To-Interactive), APK/IPA ölçüsü və pik RAM sərfiyyatı. Hər konfiqurasiya üçün testləri ən azı 3 dəfə icra edin. Tipik Hermes üstünlüyü: start 20-40% sürətli, RAM 15-25% az.
Nəticə
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.
Həm də oxuyun