Hermes — mi ez, JS-motor a React Native-hoz és működési elve

Szerző: IT Sectr Megjelenés: 2026-07-06 Olvasási idő: 9 perc

Hermes — egy AOT (Ahead-of-Time) fordítással rendelkező JavaScript-motor, amelyet a Meta fejlesztett ki a React Native számára, és optimalizált korlátozott memóriájú mobil eszközökhöz. A hivatalos Meta Engineering blog (2022) szerint a Hermes 20-50%-kal csökkenti az alkalmazás indítási idejét, és 30-40%-kal kisebb csomagméretet biztosít a JavaScriptCore-hoz képest. A V8-tól vagy a JSC-től eltérően a Hermes nem használ JIT-fordítást az eszközön — az összes JavaScript a build során Hermes CLI segítségével bájtkódra fordul. Ez különösen fontos az iOS esetében, ahol a JIT-fordítást az App Store irányelvei korlátozzák.

Főbb pontok

  • Hermes — AOT fordítással rendelkező JavaScript-motor, amelyet a Meta fejlesztett a React Native számára
  • AOT vs JIT — A Hermes JS-t bájtkódra fordítja a build során, JIT nélkül az eszközön
  • Teljesítmény — az alkalmazás indítása 20-50%-kal gyorsabb, a csomag 30-40%-kal kisebb
  • Hades GC — alacsony késleltetésű szemétgyűjtő, mobil forgatókönyvekhez optimalizálva
  • Szabvány — ECMAScript 2020+ Proxy, BigInt és Reflect nélkül teljes terjedelemben

Mi az a Hermes

Hermes — egy kompakt, nyílt forráskódú (MIT licenc) JavaScript-motor, amelyet a Meta hozott létre a React Native számára, és optimalizált korlátozott erőforrású mobil eszközökön való működésre. A Hermes fő innovációja a JIT-fordítás elhagyása az AOT (Ahead-of-Time) javára. A React Native alkalmazás build fázisában a Metro Bundler továbbítja a lefordított JavaScriptet a Hermes CLI-nek, amely azt HBC (Hermes ByteCode) bájtkóddá alakítja. Ezt a bájtkódot a motor közvetlenül hajtja végre, további fordítás nélkül az eszközön. Ez a megközelítés kiszámítható teljesítményt biztosít: nincs JIT “bemelegedés”, nincsenek fordítási szünetek, nincs extra akkumulátorfogyasztás. A Hermes a mobil eszközök korlátainak figyelembevételével készült: kevés RAM (1-4 GB), korlátozott energiafogyasztás és gyors hidegindítás szükségessége. A Hermes első nyilvános kiadása 2019-ben volt, és a React Native 0.70-től (2022) a motor szabvánnyá vált Androidon.

Hermes vs JavaScriptCore: motorok összehasonlítása

JavaScriptCore (JSC) — a szabványos WebKit-motor, amelyet a Safari és a React Native használt a 0.70-es verzió előtt. A JSC támogatja a JIT-fordítást, ami magas teljesítményt biztosít összetett JavaScript-műveletekhez. A JIT-nek azonban bemelegedésre van szüksége: az első másodpercekben a kód lassabban fut (értelmezett mód), majd a JIT lefordítja a forró részeket. iOS-en a JIT gyakorlatilag nem elérhető az App Store irányelvei miatt (dinamikus kódgenerálás tilalma), ezért a JSC iOS-en csak értelmezett módban működik — a teljesítmény csökken. A JSC nagyobb bináris mérettel rendelkezik (kb. 10 MB), és több RAM-ot fogyaszt a JIT-infrastruktúra miatt. A Hermes nem függ a JIT-től, ami kiszámítható teljesítményt biztosít közvetlenül az indítás után (hidegindítás). A JSC teljesebben támogatja az ECMAScript szabványt (beleértve a Proxy, BigInt, Reflect elemeket), de nagyobb erőforrás-felhasználás árán. Azon React Native projektekhez, ahol a hidegindítás és a kis méret kritikus — a Hermes előnyösebb. A nehéz JS-számításokkal rendelkező projektekhez (játékok, WebGL) — a JSC magasabb csúcsteljesítményt nyújthat.

ParaméterHermesJavaScriptCore
FordításAOT (build során)JIT + Értelmezett (eszközön)
Hidegindítás20-50% gyorsabbAlapszint
Csomagméret30-40% kisebbAlapszint
RAM-fogyasztás20-30% kevesebbAlapszint
ECMAScriptES2020 (korlátozások)ES2022+ (teljes)
iOS JITNem szükségesNem elérhető (csak értelmezett)
Bináris~3 MB~10 MB

AOT-fordítás: hogyan működik az előzetes build

AOT-fordítás (Ahead-of-Time) a Hermes-ben két szakaszban történik. Az első szakaszban a Metro Bundler összegyűjti a JavaScript-fájlokat egyetlen csomagba, és továbbítja a Hermes CLI-nek (a hermesc segédprogramnak). A második szakaszban a hermesc elemzi a JavaScript AST-t, létrehozza a HIR (Hermes Intermediate Representation) köztes reprezentációt, majd kiadja a HBC bináris bájtkódot. Az eredmény egy .hbc kiterjesztésű fájl, amely csak bájtkódot tartalmaz az eredeti JavaScript nélkül. A Hermes runtime közvetlenül tölti be a HBC-t, elemzés és fordítás nélkül. Ez radikálisan felgyorsítja az indulást: ezer JS sor elemzése (async) helyett a motor egy előre lefordított bináris formátumot olvas. Az AOT csökkenti a méretet is: a bájtkód átlagosan 30%-kal tömörebb, mint a JavaScript AST. Az AOT hátránya — az eval, new Function vagy dinamikus require végrehajtásának lehetetlensége futásidőben — minden modulnak ismertnek kell lennie a build szakaszában.

bash
# Telepítse a Hermes CLI-t önállóan
npm install hermes-engine

# Fordítsa a JS-t HBC bájtkódra
npx hermesc -emit-binary -out bundle.hbc bundle.js

# Bájtkód statisztikák
npx hermesc -dump-bytecode bundle.hbc  # shows HBC instructions

# Eredeti JS vs HBC méret
wc -c bundle.js      # 2,300,000 bytes
wc -c bundle.hbc     # 1,450,000 bytes (37% reduction)

Hermes teljesítménymutatók

A Hermes teljesítményét három kulcsfontosságú mutató alapján mérik: Time-To-Interactive (TTI), APK/IPA méret és RAM-fogyasztás. A Meta szerint Androidon a Hermes 34%-kal csökkenti a TTI-t a JSC-hez képest: 4,2 másodpercről 2,8 másodpercre egy középkategóriás eszközön (Moto G7). Az APK mérete 28%-kal csökken a kompakt bájtkódnak és a JIT-könyvtárak hiányának köszönhetően. A RAM-fogyasztás átlagosan 22%-kal alacsonyabb azonos terhelés mellett — ez különösen fontos a 2-3 GB RAM-mal rendelkező eszközök esetében. iOS-en az előny még nagyobb: mivel a JSC nem használhatja a JIT-et, a Hermes akár 45%-os TTI-javulást is biztosít. A mutatók a Meta Facebook Lite alkalmazással végzett tesztjein alapulnak. Valós projektekben az előny változó: egyszerű képernyőknél (listák, szöveg) a Hermes nagyobb javulást ad, nehéz animációknál — kisebbet. Profilozó eszköz: React Native Profiler + hermes profile --heap.

Memória profilozása Hermes-szel

Hermes beépített memória-profilozót tartalmaz, amely a Chrome DevTools-on keresztül érhető el. Csatlakozzon az alkalmazáshoz Metro-n keresztül, nyissa meg a Memory fület, és válassza a Hermes (JavaScript) lehetőséget a pillanatkép-típusoknál. A Hermes három pillanatkép-típust támogat: Heap Snapshot (összes objektum), Allocation Timeline (objektumok élettartama) és Allocation Sampling (szelektív profil). A Hades GC minimálisra csökkenti a GC-szünetek számát — átlagosan egy 2-5 ms-os szünet 10 másodpercenként, szemben a JSC 10-20 ms-os szüneteivel ugyanabban az időszakban.

Hades GC szemétgyűjtő

Hades GC — a Hermes szemétgyűjtője, amely minimális szünetekkel rendelkező mobil forgatókönyvekhez készült. A JSC mark-sweep GC-jétől eltérően a Hades egyidejű (concurrent) gyűjtést használ: a gyűjtő párhuzamosan dolgozik a fő végrehajtási szállal, és csak rövid időszakokra állítja meg azt. A Hades GC generációkra osztja a kupacot: a fiatal generációt (nursery) gyakran és gyorsan gyűjti (Scavenge), az öreg generációt ritkábban és kisebb szünetekkel gyűjti. A kupac mérete konfigurálható: alapértelmezés szerint — az alkalmazás rendelkezésre álló RAM-jának 2/3-a, minimális küszöb — 32 MB. A Hades nem használ stop-the-world megközelítést: még az öreg generáció teljes gyűjtése sem tart tovább 5-8 ms-nál. A gyűjtő a tipikus mobil forgatókönyvhöz van optimalizálva: sok rövid életű objektum (ideiglenes karakterláncok, React fibre objektumok), kevés hosszú életű. Az intenzív objektumlétrehozással rendelkező alkalmazásoknál (listák, animációk) a Hades simább FPS-t biztosít a JSC-hez képest.

Hermes bekapcsolása React Native projektben

A Hermes bekapcsolása a React Native verziójától és a platformtól függ. A React Native 0.70-től kezdve a Hermes alapértelmezés szerint be van kapcsolva Androidon az új projektekben. iOS esetén a Hermes opcionális. Bekapcsoláshoz Androidon: a android/app/build.gradle fájlban állítsa be a enableHermes: true értéket a project.ext.react.enableHermes blokkban. iOS esetén: állítsa a hermes_enabled értékét true-ra a Podfile-ban a use_react_native!(:path => config[:reactNativePath], :hermes_enabled => true) segítségével. Bekapcsolás után futtassa a pod install parancsot. Meglévő projekteknél ellenőrizze a könyvtárak kompatibilitását: a Hermes nem támogatja a Proxy, eval és néhány ES2021 funkciót. Használja a npx react-native info parancsot a konfiguráció ellenőrzéséhez. A Hermes és JSC közötti váltáshoz módosítsa a jelzőt, és hajtson végre clean rebuild-et.

groovy
// android/app/build.gradle — Hermes bekapcsolása
project.ext.react = [
    enableHermes: true,
    cliPath: "node_modules/react-native/cli.js"
]

// iOS/Podfile — Hermes bekapcsolása iOS-en
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 korlátozásai: mi nem támogatott

A Hermes fő korlátozásai a JIT elhagyásával kapcsolatosak. A Hermes nem támogatja a következőket: Proxy és Reflect API (a MobX, Vue, néhány állapotkezelő használja), BigInt (nagy számok), Symbol.toStringTag, WeakRef és FinalizationRegistry. Az eval és new Function függvények kivételt generálnak végrehajtás közben. A Array.prototype.flat és flatMap metódusok this argumentummal rendelkező callback-jei korlátozásokkal működnek. Az ISO 8601 dátumformátumok időzónákkal nem teljesen feldolgozottak. E korlátozások többsége nem érinti a tipikus React Native alkalmazásokat: a React és a React Native korlátozott ES-funkciókészletet használ. Ha egy könyvtár Proxy-t igényel (pl. MobX 6+ Proxy-val), használja a configure({ useProxies: false }) parancsot, vagy válasszon alternatívát. A meglévő kód kompatibilitásának ellenőrzéséhez futtassa a npx hermesc -check parancsot a csomagján — megjeleníti a nem támogatott funkciók listáját.

  • Proxy / Reflect — nincs implementálva; a Proxy-t használó könyvtárak fallback módot igényelnek
  • BigInt — nem elérhető; használja a bignumber.js könyvtárakat nagy számokhoz
  • eval / new Function — hívás throw; minden modulnak statikusnak kell lennie
  • WeakRef / FinalizationRegistry — nem támogatott; nincs alternatíva
  • Symbol.toStringTag — figyelmen kívül hagyva; instanceof helyesen működik

Gyakran Ismételt Kérdések

Hogyan ellenőrizhető, hogy az alkalmazás Hermes-en fut?

Az alkalmazás konzoljában hajtsa végre a console.log(global.HermesInternal) parancsot. Ha a HermesInternal objektum létezik — az alkalmazás Hermes-en fut. Alternatív megoldás: console.log(global.HermesInternal?.getRuntimeProperties()) — megjeleníti a motor verzióját és a GC paramétereit. Release buildekben a HermesInternal nem feltétlenül elérhető a méret minimalizálása érdekében.

Miért összeomlik az alkalmazás iOS-en a Hermes bekapcsolása után?

Ellenőrizze a Podfile beállításait: a Hermes iOS-en New Architecture-t (Fabric Renderer) igényel. Állítsa be a :hermes_enabled => true értéket, futtassa a pod install --repo-update parancsot. Ha a projekt React Native 0.70 alatti verzióról frissül, ellenőrizze a könyvtárak kompatibilitását a New Architecture-rel. Kapcsolja ki a Hermest, ha egy harmadik féltől származó könyvtár JSC-t igényel — ehhez módosítsa a jelzőt false-ra, és telepítse újra a Pods-okat.

Befolyásolja-e a Hermes a Hot Reload-ot fejlesztés közben?

Nem, a Hermes nem befolyásolja a Hot Reload / Fast Refresh funkciót. Fejlesztés közben a Metro Hermes-fordítás nélkül futtatja a JavaScript-csomagot (plain JS). A Hermes bájtkód csak Release buildekhez készül. Debug módban a szabványos JavaScriptCore vagy a Hermes értelmezett módban használatos. A Hot Reload sebessége nem változik, ha a Hermes be van kapcsolva a konfigurációban — a váltás csak a gyártási build szakaszában történik.

Használható a Hermes az Expo-val?

Igen, az Expo SDK 45-től kezdve a Hermes támogatott a managed workflow-hoz. Az app.json-ben állítsa be a "jsEngine": "hermes" értéket. Bare workflow esetén a Hermes úgy működik, mint egy szokásos React Native projektben. Az Expo Go nem támogatja a Hermest — használja az Expo Dev Client vagy EAS Build alkalmazást a Hermes-szel készült buildekhez. Ellenőrizze a könyvtárak kompatibilitását az expo doctor segítségével.

Hogyan hasonlítsam össze a Hermes és JSC teljesítményét a projektemben?

Használja a React Native Performance Monitor (FPS mérőszámok) és Hermes Profiling Tools eszközöket. Készítsen két verziót az alkalmazásból — Hermes-szel és JSC-vel — ugyanazon az eszközön. Mérje: a hidegindítást (az ikonra kattintástól az első interaktív képernyőig), a TTI-t (Time-To-Interactive), az APK/IPA méretét és a csúcs RAM-fogyasztást. Futtassa a teszteket legalább 3-szor minden konfigurációnál. A Hermes tipikus előnye: indítás 20-40%-kal gyorsabb, RAM 15-25%-kal kevesebb.

Összegzés

  • Hermes — a Meta JavaScript motorja AOT fordítással a React Native számára, Androidon 0.70-től szabvány
  • AOT fordítás kiszámítható teljesítményt nyújt JIT bemelegedés nélkül az eszközön
  • Hidegindítás 20-50%-kal gyorsabb, csomagméret 30-40%-kal kisebb a JavaScriptCore-hoz képest
  • Hades GC — egyidejű szemétgyűjtő 2-5 ms szünetekkel a JSC 10-20 ms helyett
  • Korlátozások: Proxy, BigInt, eval, WeakRef nem támogatott — ellenőrizze a könyvtárakat
  • Bekapcsolás: enableHermes a build.gradle-ben (Android) vagy hermes_enabled a Podfile-ban (iOS)
  • Hermes CLI lehetővé teszi a .hbc bájtkód fordítását és a memória profilozását DevTools-on keresztül
  • A Hermes nem befolyásolja a Hot Reload-ot fejlesztés közben — a bájtkód csak Release-hez készül

Kulcsrakész mobilalkalmazást fejlesztünk

Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.

Projekt megbeszélése

Olvassa el is