Hermes ایک JavaScript انجن ہے جس میں AOT (Ahead-of-Time) کمپائلیشن ہے، جسے Meta نے React Native کے لیے تیار کیا ہے اور محدود میموری والے موبائل آلات کے لیے موزوں بنایا گیا ہے۔ سرکاری Meta Engineering بلاگ (2022) کے مطابق، Hermes JavaScriptCore کے مقابلے میں ایپلیکیشن شروع ہونے کے وقت کو 20-50% تک کم کرتا ہے اور بنڈل کے سائز کو 30-40% تک گھٹاتا ہے۔ V8 یا JSC کے برعکس، Hermes ڈیوائس پر JIT کمپائلیشن استعمال نہیں کرتا — تمام JavaScript Hermes CLI کے ذریعے بلڈ مرحلے میں بائٹ کوڈ میں کمپائل ہوتا ہے۔ یہ iOS کے لیے خاص طور پر اہم ہے، جہاں JIT کمپائلیشن App Store پالیسیوں کی وجہ سے محدود ہے۔
اہم نکات
Hermes ایک کمپیکٹ اوپن سورس JavaScript انجن (MIT لائسنس) ہے جسے Meta نے React Native کے لیے بنایا ہے اور محدود وسائل والے موبائل آلات پر چلنے کے لیے موزوں بنایا گیا ہے۔ Hermes کی اہم اختراع JIT کمپائلیشن کو چھوڑ کر AOT (Ahead-of-Time) کو اپنانا ہے۔ React Native ایپلیکیشن بلڈ مرحلے کے دوران، Metro Bundler کمپائل شدہ JavaScript کو Hermes CLI کو بھیجتا ہے، جو اسے HBC (Hermes ByteCode) بائٹ کوڈ میں تبدیل کرتا ہے۔ یہ بائٹ کوڈ ڈیوائس پر اضافی کمپائلیشن کے بغیر براہ راست انجن کے ذریعے عمل میں لایا جاتا ہے۔ یہ طریقہ پیش قیاسی کارکردگی فراہم کرتا ہے: کوئی JIT وارم اپ نہیں، کوئی کمپائلیشن رکاوٹ نہیں، کوئی اضافی بیٹری استعمال نہیں۔ Hermes موبائل آلات کی حدود کو مدنظر رکھتے ہوئے ڈیزائن کیا گیا ہے: چھوٹی RAM (1-4 GB)، محدود بجلی کی کھپت اور تیز کولڈ اسٹارٹ کی ضرورت۔ Hermes کا پہلا عوامی ریلیز 2019 میں ہوا تھا اور React Native 0.70 (2022) سے شروع ہو کر، یہ انجن Android پر معیاری بن گیا۔
JavaScriptCore (JSC) معیاری WebKit انجن ہے جو Safari اور React Native ورژن 0.70 سے پہلے استعمال کرتا ہے۔ JSC JIT کمپائلیشن کو سپورٹ کرتا ہے، جو پیچیدہ JavaScript آپریشنز کے لیے اعلی کارکردگی فراہم کرتا ہے۔ تاہم، JIT کو وارم اپ کی ضرورت ہوتی ہے: عملدرآمد کے پہلے سیکنڈ سست ہوتے ہیں (تشریحی موڈ)، پھر JIT گرم راستوں کو کمپائل کرتا ہے۔ iOS پر، App Store پالیسیوں (متحرک کوڈ جنریشن پر پابندی) کی وجہ سے JIT عملی طور پر دستیاب نہیں ہے، لہذا iOS پر JSC صرف تشریحی موڈ میں کام کرتا ہے — کارکردگی گر جاتی ہے۔ JSC کا بائنری سائز بڑا ہے (تقریباً 10 MB) اور JIT انفراسٹرکچر کی وجہ سے زیادہ RAM استعمال کرتا ہے۔ Hermes JIT پر منحصر نہیں ہے، جو اسٹارٹ اپ (کولڈ اسٹارٹ) کے فوراً بعد پیش قیاسی کارکردگی فراہم کرتا ہے۔ JSC ECMAScript معیار کو زیادہ مکمل طور پر سپورٹ کرتا ہے (Proxy، BigInt، Reflect سمیت)، لیکن زیادہ وسائل استعمال کرنے کی قیمت پر۔ React Native پروجیکٹس کے لیے جہاں کولڈ اسٹارٹ اور چھوٹا سائز اہم ہے — Hermes بہتر ہے۔ بھاری JS حسابات (گیمز، WebGL) والے پروجیکٹس کے لیے — JSC زیادہ چوٹی کارکردگی دے سکتا ہے۔
| پیرامیٹر | Hermes | JavaScriptCore |
|---|---|---|
| کمپائلیشن | AOT (بلڈ مرحلے پر) | JIT + تشریحی (ڈیوائس پر) |
| کولڈ اسٹارٹ | 20-50% تیز | بنیادی سطح |
| بنڈل سائز | 30-40% چھوٹا | بنیادی سطح |
| RAM استعمال | 20-30% کم | بنیادی سطح |
| ECMAScript | ES2020 (حدود) | ES2022+ (مکمل) |
| iOS JIT | ضروری نہیں | دستیاب نہیں (صرف تشریحی) |
| بائنری | ~3 MB | ~10 MB |
AOT کمپائلیشن (Ahead-of-Time) Hermes میں دو مراحل میں ہوتی ہے۔ پہلے مرحلے میں، Metro Bundler JavaScript فائلوں کو ایک بنڈل میں جمع کرتا ہے اور اسے Hermes CLI (یوٹیلیٹی hermesc) کو بھیجتا ہے۔ دوسرے مرحلے میں، hermesc JavaScript AST کو پارس کرتا ہے، ایک انٹرمیڈیٹ نمائندگی HIR (Hermes Intermediate Representation) تیار کرتا ہے اور پھر بائنری HBC بائٹ کوڈ جاری کرتا ہے۔ نتیجہ — .hbc ایکسٹینشن والی فائل جس میں اصل JavaScript کے بغیر صرف بائٹ کوڈ ہوتا ہے۔ Hermes رن ٹائم HBC کو براہ راست لوڈ کرتا ہے، پارسنگ اور کمپائلیشن کے بغیر۔ یہ اسٹارٹ اپ کو یکسر تیز کرتا ہے: ہزاروں JS لائنوں کو پارس کرنے (async) کے بجائے، انجن پہلے سے کمپائل شدہ بائنری فارمیٹ پڑھتا ہے۔ AOT سائز بھی کم کرتی ہے: بائٹ کوڈ JavaScript AST سے اوسطاً 30% زیادہ کمپیکٹ ہوتا ہے۔ AOT کی خامی — رن ٹائم پر eval، new Function یا ڈائنامک require کو عمل میں لانے میں ناکامی — تمام ماڈیول بلڈ مرحلے پر معلوم ہونے چاہئیں۔
# Hermes CLI کو علیحدہ طور پر انسٹال کریں
npm install hermes-engine
# JS کو HBC بائٹ کوڈ میں کمپائل کریں
npx hermesc -emit-binary -out bundle.hbc bundle.js
# بائٹ کوڈ کے اعدادوشمار
npx hermesc -dump-bytecode bundle.hbc # shows HBC instructions
# اصل JS بمقابلہ HBC سائز
wc -c bundle.js # 2,300,000 bytes
wc -c bundle.hbc # 1,450,000 bytes (37% reduction)
Hermes کی کارکردگی تین اہم میٹرکس سے ماپی جاتی ہے: Time-To-Interactive (TTI)، APK/IPA سائز اور RAM استعمال۔ Meta کے اعداد و شمار کے مطابق، Android پر Hermes JSC کے مقابلے میں TTI کو 34% کم کرتا ہے: درمیانے درجے کے ڈیوائس (Moto G7) پر 4.2 سیکنڈ سے 2.8 سیکنڈ تک۔ کمپیکٹ بائٹ کوڈ اور JIT لائبریریوں کی عدم موجودگی کی بدولت APK سائز 28% کم ہو جاتا ہے۔ ایک ہی بوجھ پر RAM کا استعمال اوسطاً 22% کم ہوتا ہے — یہ خاص طور پر 2-3 GB RAM والے آلات کے لیے اہم ہے۔ iOS پر، فائدہ اور بھی اہم ہے: چونکہ JSC JIT استعمال نہیں کر سکتا، Hermes TTI میں 45% تک بہتری فراہم کرتا ہے۔ میٹرکس Facebook Lite ایپلیکیشن کے ساتھ Meta کے ٹیسٹوں پر مبنی ہیں۔ حقیقی پروجیکٹس میں، فائدہ مختلف ہوتا ہے: سادہ اسکرینوں (فہرستیں، متن) کے لیے Hermes زیادہ بہتری دیتا ہے، بھاری اینیمیشنز کے لیے — کم۔ پروفائلنگ ٹول: React Native Profiler + hermes profile --heap۔
Hermes میں Chrome DevTools کے ذریعے قابل رسائی ایک بلٹ ان میموری پروفائلر شامل ہے۔ Metro کے ذریعے ایپ سے منسلک ہوں، میموری ٹیب کھولیں اور سنیپ شاٹ کی اقسام میں سے Hermes (JavaScript) منتخب کریں۔ Hermes تین قسم کے سنیپ شاٹ کو سپورٹ کرتا ہے: Heap Snapshot (تمام اشیاء)، Allocation Timeline (اشیاء کی زندگی) اور Allocation Sampling (نمونہ پروفائل)۔ Hades GC GC کی رکاوٹوں کو کم سے کم کرتا ہے — اسی مدت میں JSC کے لیے 10-20ms کی رکاوٹوں کے مقابلے میں 10 سیکنڈ کے آپریشن میں اوسطاً ایک 2-5ms کی رکاوٹ۔
Hades GC Hermes میں کوڑا کرکٹ جمع کرنے والا ہے، جو کم سے کم رکاوٹوں کے ساتھ موبائل منظرناموں کے لیے ڈیزائن کیا گیا ہے۔ JSC میں mark-sweep GC کے برعکس، Hades ہم عصر (concurrent) جمع کرنے کا استعمال کرتا ہے: جمع کرنے والا مرکزی عملدرآمد کے تھریڈ کے متوازی کام کرتا ہے، اسے صرف مختصر وقفوں کے لیے روکتا ہے۔ Hades GC ڈھیر کو نسلوں میں تقسیم کرتا ہے: نوجوان نسل (nursery) بار بار اور جلدی جمع کی جاتی ہے (Scavenge)، پرانی نسل کم بار اور چھوٹی رکاوٹوں کے ساتھ جمع کی جاتی ہے۔ ڈھیر کا سائز کنفیگر ایبل ہے: ڈیفالٹ طور پر — ایپ کی دستیاب RAM کا 2/3، کم از کم حد — 32 MB۔ Hades stop-the-world طریقہ استعمال نہیں کرتا: پرانی نسل کا مکمل جمع بھی 5-8ms سے زیادہ نہیں لیتا۔ جمع کرنے والا عام موبائل منظرناموں کے لیے موزوں ہے: بہت سے قلیل مدتی اشیاء (عارضی سٹرنگز، React fiber اشیاء)، کچھ طویل مدتی۔ گہری شے تخلیق (فہرستیں، اینیمیشنز) والی ایپلیکیشنز کے لیے، Hades JSC کے مقابلے میں ہموار FPS فراہم کرتا ہے۔
Hermes کو فعال کرنا React Native ورژن اور پلیٹ فارم پر منحصر ہے۔ React Native 0.70 سے شروع ہو کر، نئے پروجیکٹس میں Android کے لیے Hermes ڈیفالٹ طور پر فعال ہے۔ iOS کے لیے، Hermes اختیاری ہے۔ Android پر فعال کرنے کے لیے: فائل android/app/build.gradle میں project.ext.react.enableHermes بلاک میں enableHermes: true سیٹ کریں۔ iOS کے لیے: use_react_native!(:path => config[:reactNativePath], :hermes_enabled => true) کے ذریعے Podfile میں hermes_enabled کو true پر سیٹ کریں۔ فعال کرنے کے بعد، pod install چلائیں۔ موجودہ پروجیکٹس کے لیے، لائبریری کی مطابقت چیک کریں: Hermes Proxy، eval اور کچھ ES2021 فیچرز کو سپورٹ نہیں کرتا۔ کنفیگریشن کی تصدیق کے لیے npx react-native info استعمال کریں۔ Hermes اور JSC کے درمیان سوئچ کرنے کے لیے، فلیگ تبدیل کریں اور صاف دوبارہ تعمیر کریں۔
// android/app/build.gradle — Hermes فعال کریں
project.ext.react = [
enableHermes: true,
cliPath: "node_modules/react-native/cli.js"
]
// iOS/Podfile — iOS پر Hermes فعال کریں
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 کی اہم حدود JIT کی کمی سے متعلق ہیں۔ Hermes سپورٹ نہیں کرتا: Proxy اور Reflect API (MobX، Vue، کچھ اسٹیٹ مینیجرز میں استعمال ہوتا ہے)، BigInt (بڑی تعداد)، Symbol.toStringTag، WeakRef اور FinalizationRegistry۔ eval اور new Function افعال رن ٹائم کے دوران استثناء پیدا کرتے ہیں۔ this دلیل کے ساتھ Array.prototype.flat اور flatMap طریقوں کے کال بیکس حدود کے ساتھ کام کرتے ہیں۔ ٹائم زون والے ISO 8601 تاریخ فارمیٹس مکمل طور پر پروسیس نہیں ہوتے۔ ان میں سے زیادہ تر حدود عام React Native ایپلیکیشنز کو متاثر نہیں کرتیں: React اور React Native ES فیچرز کا ایک محدود سیٹ استعمال کرتے ہیں۔ اگر کسی لائبریری کو Proxy کی ضرورت ہے (مثال کے طور پر، Proxy کے ساتھ MobX 6+)، تو configure({ useProxies: false }) استعمال کریں یا کوئی متبادل منتخب کریں۔ موجودہ کوڈ کی مطابقت چیک کرنے کے لیے، اپنے بنڈل پر npx hermesc -check چلائیں — یہ غیر تعاون یافتہ فیچرز کی فہرست دکھائے گا۔
اکثر پوچھے گئے سوالات
ایپ کنسول میں، console.log(global.HermesInternal) چلائیں۔ اگر HermesInternal آبجیکٹ موجود ہے — ایپ Hermes پر چل رہی ہے۔ متبادل طور پر: console.log(global.HermesInternal?.getRuntimeProperties()) — انجن ورژن اور GC پیرامیٹرز آؤٹ پٹ کرے گا۔ Release بلڈز میں، سائز کم سے کم کرنے کے لیے HermesInternal دستیاب نہیں ہو سکتا۔
اپنی Podfile سیٹنگز چیک کریں: iOS پر Hermes کو New Architecture (Fabric Renderer) کی ضرورت ہے۔ :hermes_enabled => true سیٹ کریں، pod install --repo-update چلائیں۔ اگر پروجیکٹ React Native 0.70 سے نیچے سے اپ گریڈ ہو رہا ہے، تو New Architecture کے ساتھ لائبریری کی مطابقت چیک کریں۔ اگر کسی تیسرے فریق کی لائبریری کو JSC کی ضرورت ہے تو Hermes کو غیر فعال کریں — فلیگ کو false میں تبدیل کریں اور Pods دوبارہ انسٹال کریں۔
نہیں، Hermes Hot Reload / Fast Refresh کو متاثر نہیں کرتا۔ ترقی کے دوران، Metro JavaScript بنڈل کو Hermes کمپائلیشن کے بغیر چلاتا ہے (سادہ JS)۔ Hermes بائٹ کوڈ صرف Release بلڈز کے لیے کمپائل ہوتا ہے۔ ڈیبگ موڈ میں، معیاری JavaScriptCore یا تشریحی موڈ میں Hermes استعمال ہوتا ہے۔ کنفیگریشن میں Hermes فعال ہونے پر Hot Reload کی رفتار تبدیل نہیں ہوتی — سوئچنگ صرف پروڈکشن بلڈ مرحلے پر ہوتی ہے۔
جی ہاں، Expo SDK 45 سے شروع ہو کر، Hermes managed workflow کے لیے تعاون یافتہ ہے۔ app.json میں "jsEngine": "hermes" بتائیں۔ bare workflow کے لیے، Hermes عام React Native پروجیکٹ کی طرح کام کرتا ہے۔ Expo Go Hermes کو سپورٹ نہیں کرتا — Hermes کے ساتھ بلڈز کے لیے Expo Dev Client یا EAS Build استعمال کریں۔ expo doctor کے ذریعے لائبریری کی مطابقت چیک کریں۔
React Native Performance Monitor (FPS میٹرکس) اور Hermes Profiling Tools استعمال کریں۔ ایک ہی ڈیوائس پر ایپ کے دو ورژن بنائیں — Hermes اور JSC کے ساتھ۔ پیمائش کریں: کولڈ اسٹارٹ (آئیکن کو چھونے سے پہلی انٹرایکٹو اسکرین تک)، TTI (Time-To-Interactive)، APK/IPA سائز اور زیادہ سے زیادہ RAM استعمال۔ ہر کنفیگریشن کے لیے کم از کم 3 بار ٹیسٹ چلائیں۔ عام Hermes فائدہ: 20-40% تیز اسٹارٹ اپ، 15-25% کم RAM۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں