Turbo Module в React Native — что это, как работает JSI и архитектура

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

Turbo Module — это эволюция нативных модулей React Native, построенная на JavaScript Interface (JSI). В отличие от Bridge, Turbo Module работает синхронно и без JSON-сериализации, что даёт значительный прирост производительности. По данным Meta Engineering Blog, 2024, Turbo Module является ключевым компонентом новой архитектуры и доступен в React Native 0.76+.

Главное

  • Turbo Module — нативный модуль React Native на основе JSI без Bridge.
  • JSI — JavaScript Interface, позволяющий напрямую вызывать C++ методы из JS.
  • Синхронность — Turbo Module поддерживает синхронные вызовы без сериализации.
  • Ленивая загрузка — модули загружаются только при первом обращении из JS.
  • Codegen — типы и интерфейсы генерируются автоматически из спецификаций.

Что такое Turbo Module?

Turbo Module — это компонент новой архитектуры React Native, который заменяет классический Bridge для взаимодействия JavaScript с нативным кодом. В отличие от Bridge, где каждое сообщение сериализуется в JSON и передаётся асинхронно, Turbo Module использует JSI — прослойку, которая позволяет JavaScript напрямую вызывать функции, написанные на C++.

Архитектура Turbo Module была представлена командой Meta на React Conf 2021 как часть более масштабной перестройки React Native под кодовым названием «The New Architecture». Помимо Turbo Module, новая архитектура включает Fabric (новый рендерер), Codegen (генератор кода) и JSI (интерфейс взаимодействия). Вместе эти компоненты решают проблемы производительности, которые накапливались в React Native с 2015 года.

Turbo Module решает три ключевые проблемы классических Native Module: асинхронность (все вызовы идут через очередь), сериализацию (каждый вызов требует JSON-преобразования) и загрузку (все модули инициализируются при старте приложения). С Turbo Module нативные методы вызываются синхронно, данные передаются без копирования, а модули загружаются по требованию.

Как работает JSI

JSI (JavaScript Interface) — это C++ API, который создаёт прослойку между JavaScript-движком (Hermes или JSC) и нативным кодом. JSI предоставляет хост-объекты — C++ объекты, которые выглядят как обычные JavaScript-объекты и методы. Когда JavaScript вызывает метод такого объекта, JSI напрямую исполняет соответствующий C++ код без сериализации и без переключения потоков.

Ключевое отличие JSI от Bridge — отсутствие копирования данных. В Bridge каждое значение сериализуется в JSON-строку, передаётся через очередь и десериализуется. JSI передаёт указатели на данные в памяти, что позволяет работать с большими объёмами данных без потери производительности. По данным тестов Meta, JSI-вызовы выполняются в 5–10 раз быстрее аналогичных вызовов через Bridge.

HostObject и синхронные вызовы

JSI определяет интерфейс HostObject — C++ класс, который React Native регистрирует в JS-среде как обычный объект. Когда JS-код обращается к свойству или вызывает метод HostObject, JSI перехватывает вызов и исполняет C++ код. Это позволяет выполнять операции синхронно, без ожидания очереди Bridge.

cpp
// JSI HostObject example — synchronous native call
class ImageCompressorHostObject : public jsi::HostObject {

    jsi::Value get(
        jsi::Runtime& rt,
        const jsi::PropNameID& propName
    ) override {
        auto name = propName.utf8(rt);
        if (name == "compressImage") {
            return jsi::Function::createFromHostFunction(
                rt,
                jsi::PropNameID::forUtf8(rt, name),
                2,
                [](jsi::Runtime& rt,
                   const jsi::Value& thisValue,
                   const jsi::Value* args,
                   size_t count) -> jsi::Value {
                    return jsi::Value(rt, compressNative(
                        args[0].asString(rt).utf8(rt),
                        args[1].asNumber()
                    ));
                }
            );
        }
        return jsi::Value::undefined();
    }
};

Код выше демонстрирует, как JSI HostObject обрабатывает вызов compressImage из JavaScript. Функция принимает два аргумента (строку пути и число качества), вызывает нативную функцию compressNative и возвращает результат — всё синхронно, без Bridge, без JSON. Это ключевое преимущество JSI перед классической архитектурой.

JSI является частью React Native главного рантайма и не зависит от конкретного JavaScript-движка. Он работает как с Hermes, так и с JavaScriptCore (JSC), предоставляя единый интерфейс для взаимодействия с нативной средой.

Turbo Module vs Bridge: сравнение

Сравнение Turbo Module и Bridge показывает эволюцию архитектуры React Native. Bridge был разработан для быстрого запуска React Native в 2015 году, но с ростом сложности приложений его ограничения стали критическими. Turbo Module решает эти проблемы на уровне архитектуры.

ХарактеристикаBridgeTurbo Module
Скорость вызова5–15 мс overhead0.1–0.5 мс overhead
СинхронностьТолько асинхронноСинхронно и асинхронно
СериализацияJSON на каждый вызовJSI-объекты без копирования
ТипобезопасностьНетCodegen + TypeScript
ИнициализацияВсе модули при стартеЛениво, по требованию

На практике разница наиболее заметна при частых вызовах нативных методов — например, при обработке медиа или работе с GPU. Для редких вызовов (один раз за сессию) разница в производительности несущественна. Турбо Модуль также упрощает работу с большими бинарными данными — изображениями, видео, бинарными протоколами — которые в Bridge требовали костылей с файловой системой.

Пример создания Turbo Module

Создание Turbo Module начинается с определения спецификации на TypeScript. Codegen автоматически генерирует C++ интерфейсы и Objective-C/Java заглушки на основе этой спецификации. Это полностью меняет подход к разработке — разработчик описывает API один раз, а Codegen создаёт всё остальное.

typescript
// ImageCompressor.ts — Turbo Module spec
import type { TurboModule } from 'react-native';
import type { Double } from 'react-native/Libraries/Types/CodegenTypes';

export interface Spec extends TurboModule {
  compressImage(
    imagePath: string,
    quality: Double
  ): Promise<string>;
}

Генерация кода через Codegen

Codegen анализирует TypeScript-спецификацию и генерирует C++ HostObject, Objective-C протокол и Java интерфейс. Разработчику остаётся только реализовать нативную логику. Такой подход гарантирует, что типы на JavaScript и на нативной стороне всегда совпадают, исключая ошибки ручного маппинга.

objective-c
// TurboModule implementation for iOS (generated stub)
@interface ImageCompressorModule ()
    RCT_EXPORT_MODULE(ImageCompressor)
@end

@implementation ImageCompressorModule

RCT_EXPORT_METHOD(compressImage:(NSString *)imagePath
                  quality:(NSNumber *)quality
                  resolver:(RCTPromiseResolveBlock)resolve
                  rejecter:(RCTPromiseRejectBlock)reject)
{
    NSData *compressed = [ImageProcessor compressAtPath:imagePath
                                                    quality:quality.doubleValue];
    resolve([NSString stringWithUTF8String:compressed.UTF8String]);
}

@end

Важное преимущество — ленивая загрузка. Turbo Module не инициализируется при запуске приложения, а создаётся только при первом обращении из JavaScript. Это сокращает время старта приложения на 30–50% по сравнению с классическим подходом, где все Native Module загружаются сразу.

Миграция с Bridge на Turbo Module

Переход с Bridge на Turbo Module не требует полного переписывания приложения. React Native 0.73+ поддерживает обе архитектуры параллельно — модули Bridge продолжают работать, а новые модули можно создавать как Turbo Module. Это позволяет мигрировать постепенно, модуль за модулем.

Для включения новой архитектуры в проекте React Native 0.76+ установите флаг newArchEnabled в true в файле react-native.config.js. После этого все существующие Native Module продолжают работать через Bridge, а новые модули могут создаваться как Turbo Module. Codegen автоматически обрабатывает оба варианта.

js
// react-native.config.js — enable new architecture
module.exports = {
  project: {
    ios: {},
    android: {},
  },
  assets: [],
  newArchEnabled: true,
};

Рекомендуется начинать миграцию с модулей, которые чаще всего вызываются из JavaScript — именно они получат наибольший прирост производительности. Модули, вызываемые редко (один раз за сессию), можно оставить на Bridge без значительной потери производительности.

  • Codegen — используйте TypeScript-спецификации для автоматической генерации нативных интерфейсов.
  • E2E-тесты — проверяйте работу модулей на обеих архитектурах, особенно после обновления React Native.
  • Резервный план — при проблемах с Turbo Module можно временно вернуться на Bridge через флаг конфигурации.

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

Можно ли использовать Turbo Module в React Native 0.72?

Нет, Turbo Module требует React Native 0.73+ с включённой новой архитектурой. Начиная с версии 0.76 новая архитектура стала стабильной и рекомендована для production-проектов.

Turbo Module работает и на iOS, и на Android?

Да, Turbo Module поддерживает обе платформы. JSI является кроссплатформенным C++ слоем, а Codegen генерирует Objective-C и Java заглушки для iOS и Android соответственно.

Обязательно ли использовать Hermes с Turbo Module?

Нет, Turbo Module работает с любым JS-движком через JSI. Однако Hermes рекомендован, так как он оптимизирован для работы с JSI и новой архитектурой React Native.

Как отлаживать Turbo Module?

Отладка Turbo Module выполняется через Xcode или Android Studio как обычного нативного кода. Дополнительно доступен Flipper для отслеживания вызовов JSI и производительности модулей.

Увеличивает ли Turbo Module размер приложения?

Turbo Module практически не влияет на размер приложения. C++ код JSI уже входит в состав React Native, а генерируемый код минимален — только интерфейсы без дублирования логики.

Итоги

  • Turbo Module — новый тип нативных модулей React Native, работающий через JSI без JSON-сериализации.
  • JSI — C++ прослойка, обеспечивающая прямой синхронный вызов нативных методов из JavaScript.
  • Скорость — вызовы Turbo Module выполняются в 5–10 раз быстрее вызовов через Bridge.
  • Ленивая загрузка — модули инициализируются только при первом обращении, ускоряя старт приложения.
  • Codegen — автоматическая генерация нативных интерфейсов из TypeScript-спецификаций.
  • Совместимость — React Native 0.73+ поддерживает параллельную работу Bridge и Turbo Module.
  • Миграция — поэтапный переход: обновить React Native до 0.76+, включить newArchEnabled, создавать новые модули как Turbo Module.

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

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

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

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