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 45% পর্যন্ত TTI উন্নতি প্রদান করে। মেট্রিকগুলি Facebook Lite অ্যাপ্লিকেশন সহ Meta-এর পরীক্ষার উপর ভিত্তি করে। বাস্তব প্রকল্পে, লাভ পরিবর্তিত হয়: সাধারণ স্ক্রিনের জন্য (তালিকা, টেক্সট) Hermes বেশি উন্নতি দেয়, ভারী অ্যানিমেশনের জন্য — কম। প্রোফাইলিং টুল: React Native Profiler + hermes profile --heap।
Hermes-এ Chrome DevTools-এর মাধ্যমে অ্যাক্সেসযোগ্য একটি অন্তর্নির্মিত মেমরি প্রোফাইলার অন্তর্ভুক্ত রয়েছে। Metro-এর মাধ্যমে অ্যাপ্লিকেশনের সাথে সংযোগ করুন, Memory ট্যাব খুলুন এবং স্ন্যাপশট প্রকার থেকে 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, কিছু state ম্যানেজারে ব্যবহৃত), 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 Hermes কম্পাইলেশন ছাড়াই JavaScript বান্ডেল চালায় (সাদা JS)। Hermes বাইটকোড শুধুমাত্র Release বিল্ডের জন্য তৈরি হয়। Debug মোডে, মানক 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 অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন