Hermes: что это, возможности и оптимизация для React Native

Автор: IT Sectr Опубликовано: 2026-06-04 Время чтения: 9 мин

Hermes — это JavaScript-движок с открытым исходным кодом, разработанный специально для React Native и оптимизированный для мобильных устройств. В отличие от JavaScriptCore, Hermes предварительно компилирует JS-код в байткод на этапе сборки, обеспечивая быстрый старт приложения. По данным Meta, Hermes Docs, 2024, Hermes используется по умолчанию в React Native начиная с версии 0.70.

Главное

  • Hermes — JavaScript-движок от Meta, оптимизированный для React Native.
  • Байткод — JS-код компилируется заранее на этапе сборки приложения.
  • Скорость старта — отсутствие JIT-компиляции сокращает время запуска на 50%.
  • Память — Hermes потребляет на 30–40% меньше памяти, чем JSC.
  • По умолчанию — используется в React Native 0.70+ для всех новых проектов.

Что такое Hermes?

Hermes — это компактный JavaScript-движок, созданный командой Meta специально для React Native. Он был анонсирован в 2019 году как альтернатива JavaScriptCore (JSC), который использовался в React Native по умолчанию. Основная цель Hermes — обеспечить максимально быстрый запуск приложений на мобильных устройствах, особенно на Android с ограниченными ресурсами.

Ключевая особенность Hermes — предварительная компиляция (AOT — Ahead-of-Time). В отличие от традиционных JS-движков, которые компилируют код в рантайме (JIT — Just-in-Time), Hermes компилирует JavaScript в байткод ещё на этапе сборки приложения. Это означает, что на устройстве не выполняется компиляция — байткод сразу исполняется виртуальной машиной Hermes.

Hermes не является универсальным JS-движком — он оптимизирован исключительно для сценариев React Native. В нём отсутствуют возможности, невостребованные в мобильной разработке: eval, генераторы, некоторые ES6-фичи. Это позволяет сделать движок компактнее и быстрее. По данным Meta, размер Hermes составляет около 200–300 КБ в сжатом виде, что значительно меньше JSC (примерно 2–3 МБ).

Архитектура Hermes и байткод

Архитектура Hermes отличается от традиционных JS-движков отсутствием JIT-компилятора. Вместо этого Hermes использует эффективную виртуальную машину (VM), которая исполняет заранее скомпилированный байткод. Отказ от JIT даёт три ключевых преимущества: предсказуемая производительность, меньшее потребление памяти и сокращение времени старта.

Байткод Hermes — это компактное представление JavaScript-кода, оптимизированное для быстрого исполнения. На этапе сборки (через Metro) JavaScript-файлы компилируются в .hbc (Hermes Bytecode) файлы. Приложение загружает эти файлы, и VM Hermes исполняет их без дополнительной компиляции. Процесс сборки интегрирован в Metro через плагин hermes-transformer.

Этапы обработки кода

Процесс обработки JavaScript в Hermes состоит из трёх этапов: Parse — синтаксический анализ исходного кода, Compile — трансляция в байткод, Execute — исполнение байткода виртуальной машиной. Первые два этапа выполняются на этапе сборки, третий — на устройстве. Это коренным образом отличается от JSC, где все три этапа выполняются на устройстве.

bash
# Hermes bytecode compilation during build
hermes -emit-binary -out index.hbc index.js

# Check generated bytecode size
ls -lh index.hbc

# Display bytecode statistics
hermes -dump-bytecode index.hbc

# Optimize bytecode for production
hermes -O index.js -emit-binary -O target.hbc

После компиляции все .hbc файлы упаковываются в APK или IPA вместе с нативным кодом. При запуске приложения Hermes VM загружает байткод и начинает исполнение практически мгновенно — не требуется время на JIT-прогрев, который типичен для V8 и JSC.

Hermes vs JSC: сравнение

Сравнение Hermes и JavaScriptCore (JSC) помогает понять, когда какой движок выбрать. JSC — полноценный JS-движок от Apple, используемый в Safari. Hermes — специализированный движок для React Native. Выбор между ними зависит от приоритетов проекта.

ХарактеристикаHermesJavaScriptCore
КомпиляцияAOT (на этапе сборки)JIT (на устройстве)
Время старта50–100 мс200–400 мс
Потребление памяти30–40% меньшеБазовый уровень
Размер~250 КБ (сжатый)~2 МБ (сжатый)
ES6+ поддержкаОграниченнаяПолная

Hermes выигрывает в скорости запуска и потреблении памяти, но уступает JSC в производительности выполнения сложных вычислений. JIT-компиляция JSC оптимизирует горячие участки кода во время выполнения, что даёт преимущество на CPU-интенсивных операциях. Для типичного React Native приложения, где UI-обновления и навигация составляют основную нагрузку, Hermes обеспечивает лучший пользовательский опыт за счёт быстрого старта.

Оптимизации Hermes для React Native

Hermes включает несколько оптимизаций, специфичных для React Native. Главная из них — интеграция с JSI (JavaScript Interface). Hermes поддерживает JSI нативно, что позволяет использовать новую архитектуру React Native (Fabric + Turbo Module) без дополнительных прослоек. Это делает Hermes и новую архитектуру идеальной парой для максимальной производительности.

Управление памятью

Hermes использует сборщик мусора с поколенческой стратегией (generational GC), оптимизированный для мобильных устройств. В отличие от JSC, где сборка мусора может вызвать заметные паузы в UI (jank), Hermes выполняет GC маленькими порциями между кадрами, минимизируя влияние на пользовательский опыт. По данным Meta, GC паузы в Hermes в 2–3 раза короче, чем в JSC на типичных React Native сценариях.

Lazy требование и константы

Hermes поддерживает ленивую загрузку модулей — JavaScript-модуль компилируется только когда он реально требуется. Это сокращает размер байткода и ускоряет старт. Дополнительно Hermes вычисляет константные выражения на этапе компиляции, заменяя вызовы функций константными значениями там, где это возможно.

js
// Hermes-specific optimizations example

// 1. Hermes inlines constant expressions
const TAX_RATE = 0.07;
const price = 100;
// Hermes pre-computes: TAX_RATE * price during compilation
const totalWithTax = price * (1 + TAX_RATE);

// 2. Hermes optimizes property access chains
const config = { api: { timeout: 5000 } };
// Hermes caches config.api access internally
const timeout = config.api.timeout;
fetch(url, { timeout });

Важно отметить, что Hermes поддерживает отладку через Chrome DevTools (начиная с версии Hermes 0.12). Разработчик может использовать привычные инструменты: брейкпоинты, профилирование памяти, инспекцию переменных. Это устраняет одно из главных возражений против Hermes в ранних версиях, когда отладка была ограничена.

Настройка Hermes в проекте React Native

Настройка Hermes зависит от версии React Native. Начиная с React Native 0.70 Hermes включён по умолчанию для новых проектов. Для проектов, созданных ранее, или при необходимости переключения между движками, настройка выполняется через конфигурацию сборки.

Настройка для Android

Для Android Hermes включается в файле android/app/build.gradle через флаг hermesEnabled. Для iOS настройка выполняется в Podfile через переменную :hermes_enabled. После изменения конфигурации необходимо переустановить поды и пересобрать проект.

groovy
// android/app/build.gradle — enable Hermes
project.ext.react = [
    enableHermes: true
]

// iOS Podfile — enable Hermes
hermes_enabled = true
pod 'hermes-engine'

Для проверки, что Hermes используется в приложении, выполните adb logcat | grep Hermes на Android или проверьте консоль Xcode на iOS. При старте приложения Hermes выводит сообщение "Hermes VM initialized" или аналогичное. Также можно выполнить globalThis.HermesInternal в JavaScript-коде — если Hermes активен, это свойство будет доступно.

js
// Check if Hermes is running
if (typeof globalThis.HermesInternal !== 'undefined') {
  console.log('✅ Hermes engine active');
  console.log(
    'Version:',
    globalThis.HermesInternal.getEngineProperties()
  );
} else {
  console.log('❌ Hermes not active (fallback to JSC)');
}

Часто задаваемые вопросы

Работает ли Hermes с новой архитектурой React Native?

Да, Hermes полностью совместим с новой архитектурой React Native (Fabric + Turbo Module). Более того, Hermes и JSI разрабатывались совместно и обеспечивают наилучшую производительность в паре.

Можно ли использовать Hermes на iOS?

Да, Hermes поддерживает обе платформы — iOS и Android. На iOS Hermes заменяет стандартный JavaScriptCore, обеспечивая те же преимущества: быстрый старт и меньшее потребление памяти.

Поддерживает ли Hermes все возможности ES6+?

Hermes поддерживает большинство возможностей ES6+, но с ограничениями: отсутствуют eval, генераторы и Proxy. Рекомендуется использовать Babel-транспиляцию для совместимости, как и в обычном React Native.

Как Hermes влияет на размер приложения?

Hermes уменьшает размер приложения за счёт компактного байткода и меньшего размера самого движка. Байткод обычно на 20–30% компактнее соответствующего JS-кода, а сам движок весит ~250 КБ против ~2 МБ у JSC.

Что делать, если библиотека не работает с Hermes?

Большинство библиотек совместимы с Hermes. Если библиотека использует eval, Proxy или нестандартные возможности — проверьте, есть ли у неё Hermes-совместимая версия. Также можно использовать Babel-плагины для замены неподдерживаемых конструкций.

Итоги

  • Hermes — JavaScript-движок от Meta, оптимизированный для быстрого старта React Native-приложений.
  • AOT-компиляция — JS-код компилируется в байткод на этапе сборки, устраняя JIT-накладные расходы на устройстве.
  • Производительность — время старта сокращается на 50%, потребление памяти — на 30–40% по сравнению с JSC.
  • Размер — Hermes занимает ~250 КБ (сжатый), что в 8–10 раз меньше JSC.
  • Совместимость — Hermes поддерживает JSI и новую архитектуру React Native, включая Fabric и Turbo Module.
  • Отладка — доступна через Chrome DevTools, включая брейкпоинты и профилирование.
  • Рекомендация — используйте Hermes для всех React Native проектов, начиная с версии 0.70+, для максимальной производительности на мобильных устройствах.

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также