Hermes — wat is het, JS-engine voor React Native en werkingsprincipe

Auteur: IT Sectr Gepubliceerd: 2026-07-06 Leestijd: 9 min

Hermes — is een JavaScript-engine met AOT-compilatie (Ahead-of-Time), ontwikkeld door Meta voor React Native en geoptimaliseerd voor mobiele apparaten met beperkt geheugen. Volgens de officiële blog van Meta Engineering (2022) verkort Hermes de opstarttijd van de app met 20-50% en verkleint de bundelgrootte met 30-40% in vergelijking met JavaScriptCore. In tegenstelling tot V8 of JSC gebruikt Hermes geen JIT-compilatie op het apparaat — alle JavaScript wordt gecompileerd naar bytecode tijdens de build via Hermes CLI. Dit is vooral belangrijk voor iOS, waar JIT-compilatie wordt beperkt door het beleid van de App Store.

Belangrijkste punten

  • Hermes — JavaScript-engine met AOT-compilatie, ontwikkeld door Meta voor React Native
  • AOT vs JIT — Hermes compileert JS naar bytecode tijdens de build, zonder JIT op het apparaat
  • Prestaties — app-start 20-50% sneller, bundel 30-40% kleiner
  • Hades GC — vuilnisophaler met lage latentie, geoptimaliseerd voor mobiele scenario's
  • Standaard — ECMAScript 2020+ zonder Proxy, BigInt en Reflect in volledige omvang

Wat is Hermes

Hermes — is een compacte JavaScript-engine met open source (MIT-licentie), gemaakt door Meta voor React Native en geoptimaliseerd voor werken op mobiele apparaten met beperkte middelen. De belangrijkste innovatie van Hermes is het afzien van JIT-compilatie ten gunste van AOT (Ahead-of-Time). Tijdens de build-fase van een React Native-app geeft Metro Bundler de gecompileerde JavaScript door aan Hermes CLI, die het omzet in HBC-bytecode (Hermes ByteCode). Deze bytecode wordt direct door de engine uitgevoerd zonder extra compilatie op het apparaat. Deze aanpak zorgt voor voorspelbare prestaties: geen “opwarming” van JIT, geen pauzes voor compilatie, geen extra batterijverbruik. Hermes is ontworpen rekening houdend met de beperkingen van mobiele apparaten: weinig RAM (1-4 GB), beperkt energieverbruik en de noodzaak van snelle koude start. De eerste openbare release van Hermes was in 2019, en vanaf React Native 0.70 (2022) werd de engine de standaard op Android.

Hermes vs JavaScriptCore: vergelijking van engines

JavaScriptCore (JSC) — de standaard WebKit-engine, gebruikt door Safari en React Native vóór versie 0.70. JSC ondersteunt JIT-compilatie, wat hoge prestaties levert voor complexe JavaScript-bewerkingen. Echter, JIT heeft opwarming nodig: de eerste seconden draait de code langzamer (geïnterpreteerde modus), waarna JIT de hete delen compileert. Op iOS is JIT praktisch onbeschikbaar vanwege het App Store-beleid (verbod op dynamische codegeneratie), dus werkt JSC op iOS alleen in de geïnterpreteerde modus — prestaties dalen. JSC heeft een grotere binaire grootte (ongeveer 10 MB) en verbruikt meer RAM vanwege de JIT-infrastructuur. Hermes is niet afhankelijk van JIT, wat zorgt voor voorspelbare prestaties direct na het opstarten (koude start). JSC ondersteunt de ECMAScript-standaard vollediger (inclusief Proxy, BigInt, Reflect), maar ten koste van hoger resourceverbruik. Voor React Native-projecten waar koude start en kleine grootte cruciaal zijn — heeft Hermes de voorkeur. Voor projecten met zware JS-berekeningen (games, WebGL) — kan JSC hogere piekprestaties leveren.

ParameterHermesJavaScriptCore
CompilatieAOT (tijdens build)JIT + Geïnterpreteerd (op apparaat)
Koude start20-50% snellerBasisniveau
Bundelgrootte30-40% kleinerBasisniveau
RAM-verbruik20-30% minderBasisniveau
ECMAScriptES2020 (beperkingen)ES2022+ (volledig)
iOS JITNiet vereistNiet beschikbaar (alleen geïnterpreteerd)
Binair~3 MB~10 MB

AOT-compilatie: hoe werkt vooraf bouwen

AOT-compilatie (Ahead-of-Time) in Hermes verloopt in twee fasen. In de eerste fase verzamelt Metro Bundler de JavaScript-bestanden in één bundel en geeft deze door aan Hermes CLI (het hulpprogramma hermesc). In de tweede fase parseert hermesc de JavaScript AST, genereert de tussenliggende representatie HIR (Hermes Intermediate Representation) en emitteert vervolgens de binaire HBC-bytecode. Het resultaat is een bestand met de extensie .hbc dat alleen bytecode bevat zonder de originele JavaScript. Hermes runtime laadt HBC direct, zonder parsen en compileren. Dit versnelt het opstarten drastisch: in plaats van duizenden JS-regels te parsen (async), leest de engine een vooraf gecompileerd binair formaat. AOT verkleint ook de grootte: bytecode is gemiddeld 30% compacter dan JavaScript AST. Het nadeel van AOT — geen mogelijkheid om eval, new Function of dynamische require uit te voeren tijdens runtime — alle modules moeten bekend zijn tijdens de build-fase.

bash
# Installeer Hermes CLI standalone
npm install hermes-engine

# Compileer JS naar HBC-bytecode
npx hermesc -emit-binary -out bundle.hbc bundle.js

# Bytecode-statistieken
npx hermesc -dump-bytecode bundle.hbc  # shows HBC instructions

# Originele JS vs HBC-grootte
wc -c bundle.js      # 2,300,000 bytes
wc -c bundle.hbc     # 1,450,000 bytes (37% reduction)

Prestatiemetingen van Hermes

De prestaties van Hermes worden gemeten aan de hand van drie belangrijke meetwaarden: Time-To-Interactive (TTI), APK/IPA-grootte en RAM-verbruik. Volgens Meta vermindert Hermes op Android de TTI met 34% in vergelijking met JSC: van 4,2 seconden naar 2,8 seconden op een middelmatig apparaat (Moto G7). De APK-grootte neemt met 28% af dankzij compacte bytecode en het ontbreken van JIT-bibliotheken. Het RAM-verbruik is gemiddeld 22% lager bij dezelfde belasting — dit is vooral belangrijk voor apparaten met 2-3 GB RAM. Op iOS is het voordeel nog groter: omdat JSC geen JIT kan gebruiken, geeft Hermes een TTI-verbetering tot 45%. De metingen zijn gebaseerd op tests van Meta met de Facebook Lite-app. In echte projecten varieert het voordeel: voor eenvoudige schermen (lijsten, tekst) geeft Hermes een grotere verbetering, voor zware animaties — minder. Profileringshulpmiddel: React Native Profiler + hermes profile --heap.

Geheugenprofilering met Hermes

Hermes bevat een ingebouwde geheugenprofiler, toegankelijk via Chrome DevTools. Maak verbinding met de app via Metro, open het tabblad Memory en selecteer Hermes (JavaScript) in de snapshot-typen. Hermes ondersteunt drie typen snapshots: Heap Snapshot (alle objecten), Allocation Timeline (levensduur van objecten) en Allocation Sampling (selectief profiel). Hades GC vermindert het aantal GC-pauzes tot een minimum — gemiddeld één pauze van 2-5ms per 10 seconden werk tegenover pauzes van 10-20ms bij JSC in dezelfde periode.

Vuilnisophaler Hades GC

Hades GC — is de vuilnisophaler in Hermes, ontworpen voor mobiele scenario's met minimale pauzes. In tegenstelling tot de mark-sweep GC in JSC gebruikt Hades gelijktijdige (concurrent) verzameling: de verzamelaar werkt parallel met de hoofd-uitvoeringsdraad en stopt deze alleen voor korte periodes. Hades GC verdeelt de heap in generaties: de jonge generatie (nursery) wordt vaak en snel verzameld (Scavenge), de oude generatie wordt minder vaak en met kleinere pauzes verzameld. De heap-grootte is configureerbaar: standaard — 2/3 van het beschikbare RAM van de app, minimale drempel — 32 MB. Hades gebruikt geen stop-the-world-benadering: zelfs een volledige verzameling van de oude generatie duurt niet langer dan 5-8ms. De verzamelaar is geoptimaliseerd voor het typische mobiele scenario: veel kortlevende objecten (tijdelijke strings, React fibre-objecten), weinig langlevende. Voor apps met intensieve objectcreatie (lijsten, animaties) zorgt Hades voor een soepelere FPS in vergelijking met JSC.

Hermes inschakelen in een React Native-project

Het inschakelen van Hermes hangt af van de React Native-versie en het platform. Vanaf React Native 0.70 is Hermes standaard ingeschakeld voor Android in nieuwe projecten. Voor iOS is Hermes optioneel. Om in te schakelen op Android: in het bestand android/app/build.gradle stelt u enableHermes: true in in het blok project.ext.react.enableHermes. Voor iOS: stel hermes_enabled in op true in Podfile via use_react_native!(:path => config[:reactNativePath], :hermes_enabled => true). Voer na het inschakelen pod install uit. Voor bestaande projecten controleert u de compatibiliteit van bibliotheken: Hermes ondersteunt geen Proxy, eval en sommige ES2021-functies. Gebruik npx react-native info om de configuratie te controleren. Om te schakelen tussen Hermes en JSC, wijzigt u de vlag en voert u een clean rebuild uit.

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

// iOS/Podfile — Hermes inschakelen op 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

Beperkingen van Hermes: wat wordt niet ondersteund

De belangrijkste beperkingen van Hermes houden verband met het afzien van JIT. Hermes ondersteunt niet: Proxy en Reflect API (gebruikt in MobX, Vue, sommige state-managers), BigInt (grote getallen), Symbol.toStringTag, WeakRef en FinalizationRegistry. De functies eval en new Function genereren een uitzondering tijdens uitvoering. Callbacks van methoden Array.prototype.flat en flatMap met het argument this werken met beperkingen. ISO 8601-datumformaten met tijdzones worden niet volledig verwerkt. De meeste van deze beperkingen hebben geen invloed op typische React Native-apps: React en React Native gebruiken een beperkte set ES-functies. Als een bibliotheek Proxy vereist (bijv. MobX 6+ met Proxy), gebruik dan configure({ useProxies: false }) of kies een alternatief. Om de compatibiliteit van bestaande code te controleren, voert u npx hermesc -check uit op uw bundel — het toont een lijst van niet-ondersteunde functies.

  • Proxy / Reflect — niet geïmplementeerd; bibliotheken met Proxy vereisen fallback-modus
  • BigInt — niet beschikbaar; gebruik bignumber.js-bibliotheken voor grote getallen
  • eval / new Function — aanroep throw; alle modules moeten statisch zijn
  • WeakRef / FinalizationRegistry — worden niet ondersteund; geen alternatief
  • Symbol.toStringTag — wordt genegeerd; instanceof werkt correct

Veelgestelde vragen

Hoe controleer ik of de app op Hermes draait?

Voer in de console van de app console.log(global.HermesInternal) uit. Als het object HermesInternal bestaat — draait de app op Hermes. Alternatief: console.log(global.HermesInternal?.getRuntimeProperties()) — toont de engineversie en GC-parameters. In Release-builds kan HermesInternal onbeschikbaar zijn om de grootte te minimaliseren.

Waarom crasht de app op iOS na het inschakelen van Hermes?

Controleer de Podfile-instellingen: Hermes op iOS vereist New Architecture (Fabric Renderer). Stel :hermes_enabled => true in, voer pod install --repo-update uit. Als het project wordt bijgewerkt van React Native onder 0.70, controleer dan de compatibiliteit van bibliotheken met New Architecture. Schakel Hermes uit als een bibliotheek van derden JSC vereist — wijzig hiervoor de vlag naar false en installeer Pods opnieuw.

Beïnvloedt Hermes Hot Reload tijdens ontwikkeling?

Nee, Hermes beïnvloedt Hot Reload / Fast Refresh niet. Tijdens ontwikkeling voert Metro de JavaScript-bundel uit zonder Hermes-compilatie (plain JS). Hermes-bytecode wordt alleen gemaakt voor Release-builds. In de Debug-modus wordt standaard JavaScriptCore of Hermes in de geïnterpreteerde modus gebruikt. De snelheid van Hot Reload verandert niet wanneer Hermes is ingeschakeld in de configuratie — omschakeling vindt alleen plaats in de productie-buildfase.

Kan Hermes met Expo worden gebruikt?

Ja, vanaf Expo SDK 45 wordt Hermes ondersteund voor managed workflow. Stel in app.json "jsEngine": "hermes" in. Voor bare workflow werkt Hermes zoals in een gewoon React Native-project. Expo Go ondersteunt Hermes niet — gebruik Expo Dev Client of EAS Build voor builds met Hermes. Controleer de compatibiliteit van bibliotheken via expo doctor.

Hoe vergelijk ik de prestaties van Hermes en JSC in mijn project?

Gebruik React Native Performance Monitor (FPS-metingen) en Hermes Profiling Tools. Bouw twee versies van de app — met Hermes en JSC — op hetzelfde apparaat. Meet: koude start (van klik op pictogram tot eerste interactieve scherm), TTI (Time-To-Interactive), APK/IPA-grootte en piek-RAM-verbruik. Voer de tests minstens 3 keer uit voor elke configuratie. Typisch voordeel van Hermes: start 20-40% sneller, RAM 15-25% minder.

Samenvatting

  • Hermes — Meta's JavaScript-engine met AOT-compilatie voor React Native, standaard op Android vanaf 0.70
  • AOT-compilatie zorgt voor voorspelbare prestaties zonder JIT-opwarming op het apparaat
  • Koude start 20-50% sneller, bundelgrootte 30-40% kleiner vs JavaScriptCore
  • Hades GC — gelijktijdige vuilnisophaler met pauzes van 2-5ms in plaats van 10-20ms bij JSC
  • Beperkingen: Proxy, BigInt, eval, WeakRef worden niet ondersteund — controleer bibliotheken
  • Inschakelen: enableHermes in build.gradle (Android) of hermes_enabled in Podfile (iOS)
  • Hermes CLI maakt compilatie van .hbc-bytecode en geheugenprofilering via DevTools mogelijk
  • Hermes beïnvloedt Hot Reload niet tijdens ontwikkeling — bytecode wordt alleen voor Release gemaakt

We ontwikkelen een mobiele applicatie turnkey

IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.

Bespreek het project

Lees ook