Hermes, özellikle React Native için geliştirilmiş ve mobil cihazlar için optimize edilmiş açık kaynaklı bir JavaScript motorudur. JavaScriptCore'un aksine, Hermes JS kodunu derleme aşamasında önceden bayt koduna derleyerek uygulamanın hızlı başlamasını sağlar. Meta, Hermes Docs, 2024'ye göre, Hermes React Native sürüm 0.70'ten itibaren varsayılan olarak kullanılmaktadır.
Ana Noktalar
Hermes, Meta ekibi tarafından özellikle React Native için oluşturulmuş kompakt bir JavaScript motorudur. 2019 yılında React Native'de varsayılan olarak kullanılan JavaScriptCore'un (JSC) alternatifi olarak duyurulmuştur. Hermes'in temel amacı, özellikle sınırlı kaynaklara sahip Android'de mobil uygulamalar için mümkün olan en hızlı başlatmayı sağlamaktır.
Hermes'in temel özelliği önceden derleme (AOT — Ahead-of-Time)'dir. Kodu çalışma zamanında derleyen geleneksel JS motorlarının (JIT — Just-in-Time) aksine, Hermes JavaScript'i uygulama derleme aşamasında bayt koduna derler. Bu, cihazda hiçbir derleme olmadığı anlamına gelir — bayt kodu, Hermes sanal makinesi tarafından hemen yürütülür.
Hermes evrensel bir JS motoru değildir — yalnızca React Native senaryoları için optimize edilmiştir. Mobil geliştirmede ihtiyaç duyulmayan özelliklerden yoksundur: eval, oluşturucular ve bazı ES6 özellikleri. Bu, motorun daha kompakt ve hızlı olmasını sağlar. Meta'ya göre, Hermes'in sıkıştırılmış boyutu yaklaşık 200–300 KB'dir, bu da JSC'den (yaklaşık 2–3 MB) önemli ölçüde daha küçüktür.
Hermes mimarisi, JIT derleyicisinin olmamasıyla geleneksel JS motorlarından farklıdır. Bunun yerine, Hermes önceden derlenmiş bayt kodunu yürüten verimli bir sanal makine (VM) kullanır. JIT'ten vazgeçmek üç temel avantaj sağlar: öngörülebilir performans, daha düşük bellek tüketimi ve azaltılmış başlatma süresi.
Hermes bayt kodu, hızlı yürütme için optimize edilmiş JavaScript kodunun kompakt bir temsilidir. Derleme aşamasında (Metro aracılığıyla), JavaScript dosyaları .hbc (Hermes Bytecode) dosyalarına derlenir. Uygulama bu dosyaları yükler ve Hermes VM bunları ek derleme olmadan yürütür. Derleme süreci, hermes-transformer eklentisi aracılığıyla Metro'ya entegre edilmiştir.
Hermes'teki JavaScript işleme akışı üç aşamadan oluşur: Parse — kaynak kodun sözdizimsel analizi, Compile — bayt koduna çeviri, Execute — sanal makine tarafından bayt kodunun yürütülmesi. İlk iki aşama derleme aşamasında çalışır, üçüncüsü cihazda çalışır. Bu, üç aşamanın da cihazda çalıştığı JSC'den temel olarak farklıdır.
# Hermes bayt kodu derlemesi (derleme sırasında)
hermes -emit-binary -out index.hbc index.js
# Oluşturulan bayt kodu boyutunu kontrol et
ls -lh index.hbc
# Bayt kodu istatistiklerini görüntüle
hermes -dump-bytecode index.hbc
# Bayt kodunu üretim için optimize et
hermes -O index.js -emit-binary -O target.hbc
Derlemeden sonra, tüm .hbc dosyaları yerel kodla birlikte APK veya IPA içinde paketlenir. Uygulama başladığında, Hermes VM bayt kodunu yükler ve neredeyse anında yürütmeye başlar — V8 ve JSC için tipik olan JIT ısınma süresine gerek yoktur.
Hermes ve JavaScriptCore (JSC) karşılaştırması, hangi motorun ne zaman seçileceğini anlamaya yardımcı olur. JSC, Apple'dan Safari'de kullanılan tam özellikli bir JS motorudur. Hermes, React Native için özelleşmiş bir motordur. Aralarındaki seçim proje önceliklerine bağlıdır.
| Özellik | Hermes | JavaScriptCore |
|---|---|---|
| Derleme | AOT (derleme sırasında) | JIT (cihazda) |
| Başlatma Süresi | 50–100 ms | 200–400 ms |
| Bellek Kullanımı | %30–40 daha az | Temel seviye |
| Boyut | ~250 KB (sıkıştırılmış) | ~2 MB (sıkıştırılmış) |
| ES6+ Desteği | Sınırlı | Tam |
Hermes başlatma hızı ve bellek tüketiminde kazanır, ancak karmaşık hesaplama performansında JSC'nin gerisinde kalır. JSC'nin JIT derlemesi, yürütme sırasında sıcak kod yollarını optimize ederek CPU yoğun işlemlerde avantaj sağlar. UI güncellemeleri ve navigasyonun ana iş yükünü oluşturduğu tipik bir React Native uygulaması için Hermes, hızlı başlatma sayesinde daha iyi bir kullanıcı deneyimi sunar.
Hermes, React Native'e özgü birkaç optimizasyon içerir. En önemlisi, JSI (JavaScript Interface) ile entegrasyondur. Hermes, JSI'yi yerel olarak destekleyerek yeni React Native mimarisinin (Fabric + Turbo Modules) ek katmanlar olmadan kullanılmasına olanak tanır. Bu, Hermes ve yeni mimariyi maksimum performans için ideal bir çift haline getirir.
Hermes, mobil cihazlar için optimize edilmiş bir nesil atık toplayıcı (generational GC) kullanır. Atık toplamanın kullanıcı arayüzünde fark edilir duraklamalara (takılma) neden olabileceği JSC'nin aksine, Hermes GC'yi kareler arasında küçük parçalar halinde gerçekleştirerek kullanıcı deneyimi üzerindeki etkiyi en aza indirir. Meta'ya göre, tipik React Native senaryolarında Hermes'teki GC duraklamaları JSC'ye göre 2–3 kat daha kısadır.
Hermes, tembel modül yüklemeyi destekler — bir JavaScript modülü yalnızca gerçekten ihtiyaç duyulduğunda derlenir. Bu, bayt kodu boyutunu azaltır ve başlatmayı hızlandırır. Ayrıca Hermes, derleme zamanında sabit ifadeleri değerlendirerek mümkün olduğunda işlev çağrılarını sabit değerlerle değiştirir.
// Hermes'e özgü optimizasyon örneği
// 1. Hermes sabit ifadeleri satır içine alır
const TAX_RATE = 0.07;
const price = 100;
// Hermes derleme sırasında TAX_RATE * price değerini önceden hesaplar
const totalWithTax = price * (1 + TAX_RATE);
// 2. Hermes özellik erişim zincirlerini optimize eder
const config = { api: { timeout: 5000 } };
// Hermes dahili olarak config.api erişimini önbelleğe alır
const timeout = config.api.timeout;
fetch(url, { timeout });
Hermes'in Chrome DevTools aracılığıyla hata ayıklamayı (Hermes 0.12'den itibaren) desteklediğini belirtmek önemlidir. Geliştiriciler tanıdık araçları kullanabilir: kesme noktaları, bellek profili oluşturma, değişken inceleme. Bu, hata ayıklamanın sınırlı olduğu ilk sürümlerde Hermes'e yönelik temel itirazlardan birini ortadan kaldırır.
Hermes kurulumu, React Native sürümüne bağlıdır. React Native 0.70'ten itibaren Hermes, yeni projeler için varsayılan olarak etkindir. Önceden oluşturulmuş projeler için veya motorlar arasında geçiş yaparken, yapılandırma derleme ayarları üzerinden yapılır.
Android için Hermes, android/app/build.gradle dosyasında hermesEnabled bayrağı aracılığıyla etkinleştirilir. iOS için yapılandırma, Podfile'da :hermes_enabled değişkeni aracılığıyla yapılır. Yapılandırmayı değiştirdikten sonra, pod'ları yeniden yüklemeniz ve projeyi yeniden derlemeniz gerekir.
// android/app/build.gradle — Hermes'i etkinleştir
project.ext.react = [
enableHermes: true
]
// iOS Podfile — Hermes'i etkinleştir
hermes_enabled = true
pod 'hermes-engine'
Uygulamanızda Hermes'in çalıştığını doğrulamak için Android'de adb logcat | grep Hermes komutunu çalıştırın veya iOS'ta Xcode konsolunu kontrol edin. Uygulama başladığında, Hermes “Hermes VM initialized” veya benzer bir mesaj görüntüler. JavaScript kodunda globalThis.HermesInternal değerini de kontrol edebilirsiniz — Hermes etkinse bu özellik kullanılabilir olacaktır.
// Hermes'in çalışıp çalışmadığını kontrol et
if (typeof globalThis.HermesInternal !== 'undefined') {
console.log('✅ Hermes motoru etkin');
console.log(
'Sürüm:',
globalThis.HermesInternal.getEngineProperties()
);
} else {
console.log('❌ Hermes etkin değil (JSC'ye geri dönüş)');
}
Sıkça Sorulan Sorular
Evet, Hermes yeni React Native mimarisiyle (Fabric + Turbo Modules) tamamen uyumludur. Ayrıca, Hermes ve JSI birlikte geliştirilmiştir ve çift olarak en iyi performansı sunar.
Evet, Hermes her iki platformu da destekler — iOS ve Android. iOS'ta Hermes, standart JavaScriptCore'un yerini alarak aynı avantajları sunar: hızlı başlatma ve daha düşük bellek tüketimi.
Hermes çoğu ES6+ özelliğini destekler ancak sınırlamalar vardır: eval, oluşturucular ve Proxy mevcut değildir. Uyumluluk için normal React Native'de olduğu gibi Babel dönüştürme kullanılması önerilir.
Hermes kompakt bayt kodu ve daha küçük motor boyutu sayesinde uygulama boyutunu azaltır. Bayt kodu genellikle eşdeğer JS kodundan %20–30 daha kompakttır ve motorun kendisi JSC'nin ~2 MB'sine kıyasla ~250 KB ağırlığındadır.
Çoğu kütüphane Hermes ile uyumludur. Bir kütüphane eval, Proxy veya standart olmayan özellikler kullanıyorsa — Hermes uyumlu bir sürümü olup olmadığını kontrol edin. Desteklenmeyen yapıları değiştirmek için Babel eklentilerini de kullanabilirsiniz.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun