Нітро-модулі: як статычныя прыязы здолваюць React Native TurboModules
Пасвячаецца таму, як модулі Nitro выкарыстоўваюць прадаўжаныя статычныя звязкі заместо дынамічных пошукоў, што дазволяе ім значна працаваць краща за модулі TurboModules і Expo Modules у React Native.
TurboModules был задуман як рашэнак. Ён заменіў застарэлую архітектуру моста, пазбавіўся непатрэбных накладнасцей і стаў загальна прыйнятым падходам да напісання натыўнага коду, які взаімадзейнае з JavaScript. Потым з’явілася новэйшая бібліятэка пад назвай Nitro Modules, якая зробіла тыя «востатнія рашэнкі» застарелымі.
Распространеныя тэсты паказваюць, што пры тэставанні ідэнтычных сінхронных вызоваў функцый Nitro Modules можу працаваць на 59 празаўылей краща за Expo Modules, а таксама працаваць на адпоўна 15 разоў краща за TurboModules. Нават калі ўжо включаныя стрынкі, якія зазвычай дадаюць дапаможную навантажэння праз перакід межы JavaScript і натыўнага коду, Nitro все раве мае прыбутак у розмярзе 5 да 13 разоў. Калі перадаюцца большыя об’екты, такія як адпрацоўваныя зображэння чыстыя буферы, Nitro даходзіць да ўсё большага падыграння — на 8 да 40 процэнта, завдак падходу без копіювання, які запобегае дуплікацыі дадзеных у памяці.
Такія цыфры выклекваюць патрабаванне да адказу. Чаго саме дасягае Nitro пад капотам, і чаму такі дизайн не з’явіўся раней?
Проблема, якую ніхто іншы не рашыў
Nitro не быў створаны як інструмент для пераценкі эфектыў. Ён з’явіўся як рэзультат працы Marc Rousavy, создателя VisionCamera, у адпаведнасці да вельмі конкрэтнага абмежэння: ні TurboModules, ні Expo Modules не моглі належным чынам падтрымаць обработку кадраў.
У VisionCamera адзін кадр камеры можна спачатку уявіць як буфер паўнай меры 10 мегабайтаў. Гэты буфер не можа быць скопіяваны через мост, нават з викорыстаннем TurboModules, і ён таксама не пасвячаецца у звычную структуру на кшталт JSON. Насамперад Rousavy патрабаваў спосабу, які бы дазволіў безпасередна перадаць у JavaScript складны, з наявнасцю стану, натыўны об’ект, напісанный на C++ або Swift, разам з функцыямі та атрыбутамі. У TurboModules не было механізма для такога роду об’ектаў.
Такім чынам Nitro быў створаны спецыяльна для таго, каб гэта стала можлівым, а значныя прыросты швальбы виявіліся дадатковой перавагай, якая прывабіла набліжна большую увагу, чым сама первоначальная проблема, якую ён рашыў.
Адна архітэктурная выбор
Практычны разлік между TurboModules і Nitro сводзіцца да аднаго дизайнавага рашэння: як кожная система представляе аб’ект на мове JavaScript, калі ён знаходзится внутрь двыжка JavaScript.
TurboModules выкорыстоўваюць jsi::HostObject. Кожны раз, калі код на JavaScript запускае атрыбут чыста метод на аднам з гэтых об’ектаў, рантайм вынужданы дынамічна, на месцы, рашаць гэты запуск. Гэтае пошукаванне адбываецца за кожны запуск, і гэтыя павтаральныя витраты быстра накапліваюцца для модуляў, якія запускаюцца часта.
Nitro выбірае іншы падход, викорыстоўваючы jsi::NativeState. У поўнай злагодзе з інструментам генеравання коду пад назвай Nitrogen ён заздалегідь стварае всі неабяжныя прыўязкі для C++, Swift чытае Kotlin, яшчэ до запуску прыкладнага програма. Нічога не рашаецца дынамічна пад час выконання. Канвертаванне між JavaScript і натыўнымі типамі компілюецца статычна заздалегідь, што значыць, ўвокалены модуль Nitro працюе больш супраць звычайнай функцыі, чым праз мост выконання.
Гэтае змена — заздалегідь скомпільаваныя статычныя прыўязкі замест дынамічных пошукоў пад час выконання — адпавядае за большую частку розніцы ў выдатнасці, якая бачыцца у тэстах на выдатнасць.
У пасунке Nitro любы аб’ект на мовах C++, Swift чыра Kotlin называецца гібрыдным аб’ектам. Nitrogen парсуе вялікання інтэрфейса на TypeScript і автаматычна стварае код, неабяжны для пераносу такога аб’екта за межы сэрвіса JS, уключаючы обработку энумерацый, з’еднанняў і структураў. Самэ гэта артыкулыяванне дазволіла Rousavy выказаць нечы такое нестандартнае, як кадр жывай камеры, без неабяжнага ручнага напісання адзінаковага коду-моста для кожной з трох платформ.
Чаму гэта выходзіць за межы адной бібліятэкі
VisionCamera стала першым доказам таго, што такі падходы ўзяліся, але проект Nitro ніколі не быў задуманы як разова рашэння для адной конкрэтной ситуацыі. Яго архітектура забезпечвае будь-якаму натыўнаму модулю вбудованую падтрымку для массивных бафероў, об’ектаў з станам і прымытнага взаімадзеявання з C++, якія па пыткам былі неэфектывныя або вовсе немагчымыя за выкарыстоўвання пад пакульшымі падходамі.
Большэйшы экасістэма React Native пачала звертаць на гэта увагу. Проекты такія, як react-native-nitro-cache, а таксама інструменты, прызначаныя для кэшавання зображэнняў, вычыслювальных задач на аднойчынным навучэнні і гейм-енжынаў, перабудуецца на базе Nitro спецыяльна для зменшэння накладных витрачэнняў пад час перакладу коду з JavaScript у аднойчынны формат там, дзе важная ўражоўчысць. Гэта адпавядае шырэйшай тэндэнцыі, якая вядзецца ў React Native — фундаментальныя бібліятэкі перастаюць будавацца на основе старой архітектуры і перастраююцца ў рамках Новай архітектуры, замест таго, каб расследзіць яе як нештось дапаможнае, якое можна застосавіць пазней. Вжыванне Nitro яшчэ значна адстае ад TurboModules, які продовжвае залишацца стандартным выборам для большасці бібліятэкаў, але траекторыя розвитку ўсё бол ясная. Там, дзе прыоритэтам ёстся чыстая уражоўчысць, Nitro стае ўсё частэй першым інструментам, да якога вяртаюцца разработчыкі.
Што гэта значыць для автараў аднойчынных модуляў
Якщо вы зараз адмініструеце модуль на мове програмавання, гэта змяна заслуговае на вашу увагу. TurboModules не зникнуць так скора, а для простых модуляў разлік у продуктывасці, верагатэльна, не будзе помітны для канечных корыстнікаў. Але якщо ваш модуль включае ў сябе элементы, чутлівыя да продуктывасці, высокую частоту вызоў, большыя об’ёмы дадзеных або об’екты, якія не можна чыста пераклацца ў JSON, Nitro зараз верагатэльна являецца лепшай базой для стварэння.
Выбір стварэння абсалютна новага модуля на TurboModules у 2026 годзе фактычна означае працю ў архітэктураО, яую вже пераканала шырэй застосоўваемая, але ўсё яшчэ растучая альтернатыва. Генератор коду Nitro автаматычна виконвае значна большую частку павтаральных задач адразу на всіх трох працоўных платформах, і рэзультаты ў выходзе працуюць быстрэй, а для ўтримання трэбуе менш коду, напісанага вручную. Для команд, якія вже маюць TurboModule, міграцыя — гэта не проста касаванне выключніка, але тыя ж показнікі, якія робяць Nitro прывабным, таксама ствараюць сильную пазычку для таго, каб міграцыю адбылася якомога раней.
React Native уже перазнаў калькі справжніх архітектурных перыядоў: завершэнне викорыстоўвання старой архітектуры, запуск Новай архітектуры, і тепер гэты перыяд. Nitro не з’явіўся пад афіцыйным наказам з боку Meta. Ён з’явіўся таму, што адзін разработчык патрабаваў можнацьця, яку TurboModules проста не моглі запроўадзіць, створыў рашэнне публічна і дазволіў результатам тэстаў самым сабою гаворыць.
Спадневанае чытанне
- React Native, Flutter і іншыя: мобільныя працэсоры на кантроле разных платформ у 2026 годзе — Пораўнальны аналіз React Native, Flutter, Kotlin Multiplatform, Ionic, NativeScript і PWA ў аспектах выконвальных характэрыстыкаў, досвіду разработчыка і зрэласці екасистемы.