Начиная с React Native 0.82, старая архитектура на основе Bridge перестала существовать. Все библиотеки с нативными модулями, которые не обновились, оказались несовместимы с актуальными версиями фреймворка.
Наши собственные библиотеки активно использовались в нескольких проектах, которые уже мигрировали на новую архитектуру. Без обновления библиотек их дальнейшее развитие было бы заблокировано. Выбор был очевиден — пора действовать.
С чего начали
На миграцию выделили два дня. Первым делом изучили опыт других open source библиотек и выбрали инструментарий. Лучшим решением оказался react-native-builder-bob — он создаёт готовый boilerplate с поддержкой TurboModules и Fabric, избавляя от необходимости настраивать инфраструктуру с нуля.
Переход на современные языки
Нативный код библиотек был написан на Java и Objective-C. Для новой архитектуры мы решили перейти на Kotlin и Swift — более современные и удобные языки.
Миграция с Java на Kotlin прошла гладко. А вот со Swift возникла интересная проблема, которая проявилась не сразу.
Проблема с use_frameworks! :static
Когда Swift-код используется в React Native модуле, компилятор автоматически генерирует Objective-C bridging header — специальный файл, который позволяет вызывать Swift из Objective-C.
Всё работало отлично до тех пор, пока библиотеку не попробовали интегрировать в проект с настройкой use_frameworks! :static в CocoaPods. В этом режиме путь к заголовочному файлу меняется, и библиотека переставала собираться.
#if __has_include(<react_native_wallet_manager/react_native_wallet_manager-Swift.h>)
#import <react_native_wallet_manager/react_native_wallet_manager-Swift.h>
#else
#import "react_native_wallet_manager-Swift.h"
#endifЧто получили
- Библиотеки работают с актуальными версиями React Native
- Современный код на Kotlin и Swift вместо Java и Objective-C
- Совместимость с разными конфигурациями CocoaPods
- Проекты разблокированы и продолжают развиваться
Выводы
Миграция на новую архитектуру React Native — это не просто обновление версии. Это переход на новые инструменты, языки и подходы. Главное — не откладывать, если ваши проекты зависят от библиотек на старой архитектуре.