Hermes — co to je, JS engine pro React Native a princip fungování

Autor: IT Sectr Publikováno: 2026-07-06 Doba čtení: 9 min

Hermes — je JavaScript engine s kompilací AOT (Ahead-of-Time), vyvinutý společností Meta pro React Native a optimalizovaný pro mobilní zařízení s omezenou pamětí. Podle oficiálního blogu Meta Engineering (2022) Hermes zkracuje dobu spouštění aplikace o 20–50 % a zmenšuje velikost balíku o 30–40 % ve srovnání s JavaScriptCore. Na rozdíl od V8 nebo JSC nepoužívá Hermes kompilaci JIT na zařízení — veškerý JavaScript je kompilován do bajtkódu ve fázi sestavení prostřednictvím Hermes CLI. To je důležité zejména pro iOS, kde je kompilace JIT omezena zásadami App Store.

Hlavní body

  • Hermes — JavaScript engine s kompilací AOT, vyvinutý společností Meta pro React Native
  • AOT vs JIT — Hermes kompiluje JS do bajtkódu ve fázi sestavení, bez JIT na zařízení
  • Výkon — spouštění aplikace o 20–50 % rychlejší, balík o 30–40 % menší
  • Hades GC — sběrač odpadu s nízkou latencí, optimalizovaný pro mobilní scénáře
  • Standard — ECMAScript 2020+ bez Proxy, BigInt a Reflect v plném rozsahu

Co je Hermes

Hermes — je kompaktní JavaScript engine s otevřeným zdrojovým kódem (licence MIT), vytvořený společností Meta pro React Native a optimalizovaný pro práci na mobilních zařízeních s omezenými zdroji. Hlavní inovací Hermes je upuštění od kompilace JIT ve prospěch AOT (Ahead-of-Time). Ve fázi sestavení aplikace React Native předává Metro Bundler zkompilovaný JavaScript do Hermes CLI, který jej převádí na bajtkód HBC (Hermes ByteCode). Tento bajtkód je prováděn přímo enginem bez dodatečné kompilace na zařízení. Tento přístup poskytuje předvídatelný výkon: nedochází k “zahřívání” JIT, nejsou žádné pauzy na kompilaci, nedochází k dodatečné spotřebě baterie. Hermes byl navržen s ohledem na omezení mobilních zařízení: malá RAM (1–4 GB), omezená spotřeba energie a potřeba rychlého studeného startu. První veřejné vydání Hermes bylo v roce 2019 a od React Native 0.70 (2022) se engine stal standardem na Androidu.

Hermes vs JavaScriptCore: srovnání enginů

JavaScriptCore (JSC) — standardní engine WebKit, používaný Safari a React Native před verzí 0.70. JSC podporuje kompilaci JIT, což poskytuje vysoký výkon pro složité JavaScriptové operace. JIT však vyžaduje zahřátí: první sekundy kód běží pomaleji (interpretovaný režim), poté JIT kompiluje horké části. Na iOS je JIT prakticky nedostupný kvůli zásadám App Store (zákaz dynamického generování kódu), proto JSC na iOS funguje pouze v interpretovaném režimu — výkon klesá. JSC má větší binární velikost (asi 10 MB) a spotřebovává více RAM kvůli infrastruktuře JIT. Hermes není závislý na JIT, což poskytuje předvídatelný výkon ihned po spuštění (studený start). JSC podporuje standard ECMAScript úplněji (včetně Proxy, BigInt, Reflect), ale za cenu vyšší spotřeby zdrojů. Pro projekty React Native, kde je kritický studený start a malá velikost — je Hermes preferován. Pro projekty s těžkými výpočty v JS (hry, WebGL) — může JSC poskytnout vyšší špičkový výkon.

ParametrHermesJavaScriptCore
KompilaceAOT (ve fázi sestavení)JIT + Interpretovaný (na zařízení)
Studený start20–50 % rychlejšíZákladní úroveň
Velikost balíku30–40 % menšíZákladní úroveň
Spotřeba RAM20–30 % nižšíZákladní úroveň
ECMAScriptES2020 (omezení)ES2022+ (plný)
iOS JITNení vyžadovánNedostupný (pouze interpretovaný)
Binární~3 MB~10 MB

Kompilace AOT: jak funguje předběžné sestavení

Kompilace AOT (Ahead-of-Time) v Hermes probíhá ve dvou fázích. V první fázi Metro Bundler shromáždí soubory JavaScript do jediného balíku a předá jej Hermes CLI (nástroj hermesc). Ve druhé fázi hermesc analyzuje JavaScript AST, generuje mezilehlou reprezentaci HIR (Hermes Intermediate Representation) a poté emituje binární bajtkód HBC. Výsledkem je soubor s příponou .hbc, který obsahuje pouze bajtkód bez původního JavaScriptu. Hermes runtime načítá HBC přímo, bez analýzy a kompilace. To radikálně zrychluje spouštění: místo analýzy tisíců řádků JS (async) engine čte předem zkompilovaný binární formát. AOT také zmenšuje velikost: bajtkód je v průměru o 30 % kompaktnější než JavaScript AST. Nevýhodou AOT je nemožnost provádění eval, new Function nebo dynamického require za běhu — všechny moduly musí být známy ve fázi sestavení.

bash
# Nainstalujte Hermes CLI samostatně
npm install hermes-engine

# Zkompilujte JS do HBC bajtkódu
npx hermesc -emit-binary -out bundle.hbc bundle.js

# Statistiky bajtkódu
npx hermesc -dump-bytecode bundle.hbc  # shows HBC instructions

# Velikost původního JS vs HBC
wc -c bundle.js      # 2,300,000 bytes
wc -c bundle.hbc     # 1,450,000 bytes (37% reduction)

Metriky výkonu Hermes

Výkon Hermes se měří třemi klíčovými metrikami: Time-To-Interactive (TTI), velikost APK/IPA a spotřeba RAM. Podle Meta na Androidu Hermes snižuje TTI o 34 % ve srovnání s JSC: ze 4,2 sekund na 2,8 sekund na zařízení střední třídy (Moto G7). Velikost APK se snižuje o 28 % díky kompaktnímu bajtkódu a absenci JIT knihoven. Spotřeba RAM je v průměru o 22 % nižší při stejném zatížení — to je důležité zejména pro zařízení s 2–3 GB RAM. Na iOS je výhoda ještě větší: protože JSC nemůže používat JIT, Hermes poskytuje zlepšení TTI až o 45 %. Metriky jsou založeny na testech Meta s aplikací Facebook Lite. V reálných projektech se výhoda liší: pro jednoduché obrazovky (seznamy, text) Hermes poskytuje větší zlepšení, pro těžké animace — menší. Profilovací nástroj: React Native Profiler + hermes profile --heap.

Profilování paměti s Hermes

Hermes obsahuje vestavěný profiler paměti přístupný přes Chrome DevTools. Připojte se k aplikaci přes Metro, otevřete kartu Memory a vyberte Hermes (JavaScript) v typech snímků. Hermes podporuje tři typy snímků: Heap Snapshot (všechny objekty), Allocation Timeline (životnost objektů) a Allocation Sampling (selektivní profil). Hades GC snižuje počet pauz GC na minimum — v průměru jedna pauza 2–5 ms za 10 sekund práce oproti pauzám 10–20 ms u JSC za stejné období.

Sběrač odpadu Hades GC

Hades GC — je sběrač odpadu v Hermes, navržený pro mobilní scénáře s minimálními pauzami. Na rozdíl od mark-sweep GC v JSC používá Hades souběžný (concurrent) sběr: sběrač pracuje paralelně s hlavním vláknem provádění a zastavuje jej pouze na krátké období. Hades GC rozděluje haldu na generace: mladá generace (nursery) je sbírána často a rychle (Scavenge), stará generace je sbírána méně často a s menšími pauzami. Velikost haldy je konfigurovatelná: ve výchozím nastavení — 2/3 dostupné RAM aplikace, minimální práh — 32 MB. Hades nepoužívá přístup stop-the-world: i úplný sběr staré generace netrvá déle než 5–8 ms. Sběrač je optimalizován pro typický mobilní scénář: mnoho krátce žijících objektů (dočasné řetězce, objekty React fibre), málo dlouho žijících. Pro aplikace s intenzivním vytvářením objektů (seznamy, animace) poskytuje Hades plynulejší FPS ve srovnání s JSC.

Jak povolit Hermes v projektu React Native

Povolení Hermes závisí na verzi React Native a platformě. Od React Native 0.70 je Hermes ve výchozím nastavení povolen pro Android v nových projektech. Pro iOS je Hermes volitelný. Pro povolení na Androidu: v souboru android/app/build.gradle nastavte enableHermes: true v bloku project.ext.react.enableHermes. Pro iOS: nastavte hermes_enabled na true v Podfile pomocí use_react_native!(:path => config[:reactNativePath], :hermes_enabled => true). Po povolení spusťte pod install. U stávajících projektů zkontrolujte kompatibilitu knihoven: Hermes nepodporuje Proxy, eval a některé funkce ES2021. Použijte npx react-native info pro kontrolu konfigurace. Pro přepínání mezi Hermes a JSC změňte příznak a proveďte clean rebuild.

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

// iOS/Podfile — povolte Hermes na iOS
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

Omezení Hermes: co není podporováno

Hlavní omezení Hermes souvisejí s upuštěním od JIT. Hermes nepodporuje: Proxy a Reflect API (používané v MobX, Vue, některých správcích stavu), BigInt (velká čísla), Symbol.toStringTag, WeakRef a FinalizationRegistry. Funkce eval a new Function generují výjimku během provádění. Callbacky metod Array.prototype.flat a flatMap s argumentem this fungují s omezeními. Formáty data ISO 8601 s časovými pásmy nejsou plně zpracovány. Většina těchto omezení neovlivňuje typické aplikace React Native: React a React Native používají omezenou sadu funkcí ES. Pokud knihovna vyžaduje Proxy (např. MobX 6+ s Proxy), použijte configure({ useProxies: false }) nebo zvolte alternativu. Pro kontrolu kompatibility stávajícího kódu spusťte npx hermesc -check na svém balíku — zobrazí seznam nepodporovaných funkcí.

  • Proxy / Reflect — neimplementováno; knihovny s Proxy vyžadují záložní režim
  • BigInt — nedostupný; pro velká čísla použijte knihovny bignumber.js
  • eval / new Function — volání throw; všechny moduly musí být statické
  • WeakRef / FinalizationRegistry — nejsou podporovány; neexistuje alternativa
  • Symbol.toStringTag — ignorován; instanceof funguje správně

Často kladené otázky

Jak zkontrolovat, zda aplikace běží na Hermes?

V konzoli aplikace spusťte console.log(global.HermesInternal). Pokud objekt HermesInternal existuje — aplikace běží na Hermes. Alternativně: console.log(global.HermesInternal?.getRuntimeProperties()) — zobrazí verzi enginu a parametry GC. V sestaveních Release může být HermesInternal nedostupný kvůli minimalizaci velikosti.

Proč po povolení Hermes aplikace padá na iOS?

Zkontrolujte nastavení Podfile: Hermes na iOS vyžaduje New Architecture (Fabric Renderer). Nastavte :hermes_enabled => true, spusťte pod install --repo-update. Pokud je projekt aktualizován z React Native pod 0.70, zkontrolujte kompatibilitu knihoven s New Architecture. Vypněte Hermes, pokud knihovna třetí strany vyžaduje JSC — za tím účelem změňte příznak na false a přeinstalujte Pods.

Ovlivňuje Hermes Hot Reload během vývoje?

Ne, Hermes neovlivňuje Hot Reload / Fast Refresh. Během vývoje Metro spouští JavaScriptový balík bez kompilace Hermes (plain JS). Bajtkód Hermes se vytváří pouze pro Release sestavení. V režimu Debug se používá standardní JavaScriptCore nebo Hermes v interpretovaném režimu. Rychlost Hot Reload se při povoleném Hermes v konfiguraci nemění — přepínání probíhá pouze ve fázi produkčního sestavení.

Lze Hermes používat s Expo?

Ano, od Expo SDK 45 je Hermes podporován pro managed workflow. V app.json nastavte "jsEngine": "hermes". Pro bare workflow Hermes funguje jako v běžném projektu React Native. Expo Go nepodporuje Hermes — použijte Expo Dev Client nebo EAS Build pro sestavení s Hermes. Zkontrolujte kompatibilitu knihoven pomocí expo doctor.

Jak porovnat výkon Hermes a JSC v mém projektu?

Použijte React Native Performance Monitor (metriky FPS) a Hermes Profiling Tools. Sestavte dvě verze aplikace — s Hermes a JSC — na stejném zařízení. Změřte: studený start (od kliknutí na ikonu po první interaktivní obrazovku), TTI (Time-To-Interactive), velikost APK/IPA a špičkovou spotřebu RAM. Spusťte testy alespoň 3krát pro každou konfiguraci. Typická výhoda Hermes: start o 20–40 % rychlejší, RAM o 15–25 % nižší.

Shrnutí

  • Hermes — JavaScript engine Meta s kompilací AOT pro React Native, standard na Androidu od 0.70
  • Kompilace AOT poskytuje předvídatelný výkon bez zahřívání JIT na zařízení
  • Studený start o 20–50 % rychlejší, velikost balíku o 30–40 % menší vs JavaScriptCore
  • Hades GC — souběžný sběrač odpadu s pauzami 2–5 ms místo 10–20 ms u JSC
  • Omezení: Proxy, BigInt, eval, WeakRef nejsou podporovány — kontrolujte knihovny
  • Povolení: enableHermes v build.gradle (Android) nebo hermes_enabled v Podfile (iOS)
  • Hermes CLI umožňuje kompilaci .hbc bajtkódu a profilování paměti přes DevTools
  • Hermes neovlivňuje Hot Reload během vývoje — bajtkód se vytváří pouze pro Release

Vyvineme mobilní aplikaci na klíč

IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.

Prodiskutovat projekt

Přečtěte si také