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, який замінює класичний 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 (JavaScript Interface) — це C++ API, який створює прошарок між JavaScript-двигуном (Hermes або JSC) та нативним кодом. JSI надає хост-об'єкти — C++ об'єкти, які виглядають як звичайні JavaScript-об'єкти та методи. Коли JavaScript викликає метод такого об'єкта, JSI напряму виконує відповідний C++ код без серіалізації та без перемикання потоків.
Ключова відмінність JSI від Bridge — відсутність копіювання даних. У Bridge кожне значення серіалізується в JSON-рядок, передається через чергу та десеріалізується. JSI передає покажчики на дані в пам'яті, що дозволяє працювати з великими обсягами даних без втрати продуктивності. За даними тестів Meta, JSI-виклики виконуються в 5–10 разів швидше за аналогічні виклики через Bridge.
JSI визначає інтерфейс HostObject — C++ клас, який React Native реєструє в JS-середовищі як звичайний об'єкт. Коли JS-код звертається до властивості або викликає метод HostObject, JSI перехоплює виклик та виконує C++ код. Це дозволяє виконувати операції синхронно, без очікування черги Bridge.
// Приклад JSI HostObject — синхронний нативний виклик
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 та Bridge показує еволюцію архітектури React Native. Bridge був розроблений для швидкого запуску React Native у 2015 році, але зі зростанням складності додатків його обмеження стали критичними. Turbo Module вирішує ці проблеми на рівні архітектури.
| Характеристика | Bridge | Turbo Module |
|---|---|---|
| Швидкість виклику | 5–15 ms overhead | 0.1–0.5 ms overhead |
| Синхронність | Тільки асинхронно | Синхронно та асинхронно |
| Серіалізація | JSON на кожен виклик | JSI-об'єкти без копіювання |
| Типобезпека | Ні | Codegen + TypeScript |
| Ініціалізація | Всі модулі при старті | Ліниво, на вимогу |
На практиці різниця найбільш помітна при частих викликах нативних методів — наприклад, при обробці медіа або роботі з GPU. Для рідкісних викликів (один раз за сесію) різниця в продуктивності несуттєва. Турбо Модуль також спрощує роботу з великими бінарними даними — зображеннями, відео, бінарними протоколами — які в Bridge вимагали костилів з файловою системою.
Створення Turbo Module починається з визначення специфікації на TypeScript. Codegen автоматично генерує C++ інтерфейси та Objective-C/Java заглушки на основі цієї специфікації. Це повністю змінює підхід до розробки — розробник описує API один раз, а Codegen створює все інше.
// ImageCompressor.ts — специфікація Turbo Module
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 аналізує TypeScript-специфікацію та генерує C++ HostObject, Objective-C протокол та Java інтерфейс. Розробнику залишається тільки реалізувати нативну логіку. Такий підхід гарантує, що типи на JavaScript та на нативній стороні завжди збігаються, виключаючи помилки ручного мапінгу.
// Реалізація TurboModule для iOS (згенерована заглушка)
@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 не вимагає повного переписування додатку. React Native 0.73+ підтримує обидві архітектури паралельно — модулі Bridge продовжують працювати, а нові модулі можна створювати як Turbo Module. Це дозволяє мігрувати поступово, модуль за модулем.
Для включення нової архітектури в проекті React Native 0.76+ встановіть прапорець newArchEnabled у true у файлі react-native.config.js. Після цього всі існуючі Native Module продовжують працювати через Bridge, а нові модулі можуть створюватися як Turbo Module. Codegen автоматично обробляє обидва варіанти.
// react-native.config.js — увімкнути нову архітектуру
module.exports = {
project: {
ios: {},
android: {},
},
assets: [],
newArchEnabled: true,
};
Рекомендується починати міграцію з модулів, які найчастіше викликаються з JavaScript — саме вони отримають найбільший приріст продуктивності. Модулі, що викликаються рідко (один раз за сесію), можна залишити на Bridge без значної втрати продуктивності.
Часті запитання
Ні, Turbo Module вимагає React Native 0.73+ з увімкненою новою архітектурою. Починаючи з версії 0.76 нова архітектура стала стабільною та рекомендована для production-проектів.
Так, Turbo Module підтримує обидві платформи. JSI є кроссплатформеним C++ шаром, а Codegen генерує Objective-C та Java заглушки для iOS та Android відповідно.
Ні, Turbo Module працює з будь-яким JS-двигуном через JSI. Однак Hermes рекомендований, оскільки він оптимізований для роботи з JSI та новою архітектурою React Native.
Налагодження Turbo Module виконується через Xcode або Android Studio як звичайного нативного коду. Додатково доступний Flipper для відстеження викликів JSI та продуктивності модулів.
Turbo Module практично не впливає на розмір додатку. C++ код JSI вже входить до складу React Native, а генерований код мінімальний — тільки інтерфейси без дублювання логіки.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також