Анализ новой архитектуры React Native

React Native
Анализ новой архитектуры React Native

В этой статье в основном представлена ​​новая архитектура ReactNative (далее именуемая RN), которую команда FB рефакторит, основная текущая архитектура, проблемы, связанные с Bridge, новая архитектура, концепции JSI, Fabric, TurboModules, CodenGen и LeanCore.

текущая архитектура

old

RN теперь имеет в основном 3 потока

  1. JS-нить. Поток выполнения кода JS отвечает за обработку на логическом уровне. Metro (инструмент для создания пакетов) упаковывает исходный код React в один файл JS (то есть JSBundle на картинке). Затем передайте его JS-движку для выполнения.Теперь ios и android используют JSC вместе.
  2. Поток пользовательского интерфейса (основной поток/собственный поток). Этот поток в основном отвечает за собственный рендеринг (собственный пользовательский интерфейс) и вызов собственных возможностей (собственных модулей), таких как Bluetooth.
  3. Теневая нить. Этот поток предназначен в основном для создания Shadow Tree для имитации дерева структуры React. Shadow Tree может быть похож на виртуальный дом. RN использует макет Flexbox, но он не поддерживается изначально, поэтому Yoga — это метод макета, используемый для преобразования макета Flexbox в родную платформу.

проблема моста

Во-первых, давайте рассмотрим текущий процесс текущего моста.

Когда мы пишем исходный код React, как показано ниже.

<View style={{
        backgroundColor: 'pink',
        width: 200, 
        height: 200}}/> 

Поток JS сначала сериализует его, чтобы сформировать следующее сообщение

UIManager.createView([343,"RCTView",31,{"backgroundColor":-16181,"width":200,"height":200}])

Отправить в ShadowThread через мост. Получив эту информацию, Shadow Tread сначала десериализует ее для формирования дерева теней, а затем передает ее в Yoga для формирования собственной информации о макете.

Затем он передается в поток пользовательского интерфейса через мост.

После того, как поток пользовательского интерфейса получает сообщение, он также сначала десериализует его, а затем рисует в соответствии с заданной информацией о макете.

Из приведенного выше процесса видно, что взаимодействие трех потоков происходит через мост, поэтому узкое место здесь.

Соедините три функции:

  1. асинхронный. Эти очереди сообщений являются асинхронными и не гарантируют обработку событий.
  2. Сериализация. Чтобы передать сообщение в формате JSON, оно должно каждый раз проходить сериализацию и десериализацию, что очень дорого.
  3. пакетная обработка. Ставьте вызовы Native в очередь и обрабатывайте их пакетами.

Преимущество асинхронного дизайна в том, что он не блокирует.Этот дизайн в большинстве случаев удовлетворяет требованиям производительности, но в некоторых случаях это будет проблематично, например, при водопадной прокрутке.

Когда водопад сползает вниз, ему нужно отправить запрос на сервер, чтобы получить данные для следующего рендеринга.

Событие прокрутки происходит в потоке пользовательского интерфейса, а затем отправляется в поток JS через мост. Поток JS отправляет запрос после прослушивания сообщения, сервер возвращает данные, а затем возвращает их в Native для рендеринга через Bridge. Поскольку все они асинхронны, будут появляться пустые модули, вызывающие проблемы с производительностью.

Как видно из вышеизложенного, узкое место в производительности в основном возникает при взаимодействии JS-потока с Native, если взаимодействия нет, то производительность RN хорошая.

Поэтому для оптимизации RN в основном ориентирован на Bridge, и есть следующие три принципа:

  1. JS и нативная сторона не взаимодействуют. Самый тщательный способ, новости не идут Мост.
  2. JS и Native сокращают общение. В случае, если обе стороны не могут этого избежать, постарайтесь максимально сократить количество сообщений. Например, несколько запросов объединяются в один.
  3. Меньший размер JSON. Например, преобразование изображения в формат Base64 приведет к тому, что передаваемые данные станут больше и заменят их сетевым образом.

РН может пройтиMessageQueueЧтобы контролировать связь моста, основной код выглядит следующим образом

import MessageQueue from 'react-native/Libraries/BatchedBridge/MessageQueue.js';

const spyFunction = (msg) => {
  console.log(msg);
};

MessageQueue.spy(spyFunction);

Ниже приведена отслеживаемая информацияjs2n

новая архитектура

Команда FB постепенно узнала об этих проблемах, и Flutter также оказал на нее давление, чтобы предложить новую архитектуру в 2018 году.newa

Он в основном состоит из JSI, Fabric, TurboModules, CodeGen и LeanCode.

JSI

JSI является ядром и краеугольным камнем всей архитектуры, и на нем все построено.

JSI — это аббревиатура от Javascript Interface, облегченная структура, написанная на C++, ее роль заключается вЧерез JSI объект JS может напрямую получить ссылку на объект C++ (Host Objects) и вызвать соответствующий метод..

Кроме того, JSI не имеет ничего общего с React и может использоваться в любом JS-движке (V8, Hermes).

С JSI JS и Native могут общаться напрямую.Процесс вызова выглядит следующим образом:

JS->JSI->C++->ObjectC/Java

С тех пор связь между тремя потоками больше не должна проходить через мост, и о существовании друг друга можно узнать напрямую, что делает синхронную связь реальностью. Для конкретного использования см.официальный пример.

Еще одним преимуществом является то, что с JSI движок JS больше не ограничивается АО и может быть свободно заменен на V8, Hermes, что еще больше повышает скорость разбора и выполнения JS.

Fabric

Fabric — это новый уровень пользовательского интерфейса во всей архитектуре, включая средство визуализации и теневой поток на новой архитектурной диаграмме.

На рисунке ниже представлена ​​старая модель связи.

old1

Три потока взаимодействуют асинхронно через мост, и данные необходимо копировать в нескольких копиях.

С JSI JS может напрямую вызывать другие потоки для реализации механизма синхронной связи. Кроме того, на данные можно ссылаться напрямую без копирования, поэтому они становятся следующим новым режимом связи.fabric

В дополнение к возможностям синхронизации, прямая ссылка, еще одним преимуществом является то, что Fabric теперь поддерживает приоритеты рендеринга, такие как режимы React Concurrent и Suspense.

На следующих двух рисунках показаны изменения до и после добавления Fabric от запуска до этапа рендеринга.fabric之前

После превращения в тканьFabric之后

TurboModules

TurboModules в основном связаны с собственными возможностями приложений и соответствуют собственным модулям на новой архитектурной диаграмме Оптимизация этой части:

  1. Через JSI JS может напрямую вызывать модуль Native для выполнения некоторых синхронных операций. Такие, как вызов возможности камеры.
  2. Нативные модули загружаются лениво. Раньше при запуске RN framework загружались все собственные модули, что приводило к медленному запуску и длительному времени. Теперь с помощью TurboModules можно выполнять загрузку по требованию, сокращая время запуска и повышая производительность.

CodeGen

С помощью CodeGen статически типизированный код JS, такой как Flow или Ts, автоматически переводится в собственный код, используемый Fabric и TurboModules.

Lean Core

Эта часть в основном посвящена уменьшению размера пакета, так как все предыдущие пакеты были размещены в основном проекте RN. Теперь ядро ​​РН хранит только нужные пакеты, остальные перемещаются вreact-native-communityИли разбейте отдельные компоненты, такие как Webview и AsyncStore.

текущий прогресс

  1. JSI следует за выпуском RN0.59 (JSIExecuter.cpp), но затем либо использует мост для связи
  2. Fabric и TurboModules все еще находятся в разработке, LeanCore готов.
  3. Теперь доступны кроссплатформенные модули C++.
  4. Он будет обратно совместим с JS, но не совместим с собственными модулями.
  5. Конкретный прогресс см.Обсуждение прогресса тканиа такжеОбсуждение прогресса TurboModulesа такжеОбсуждение прогресса JSIа такжеОбсуждение прогресса CodeGen,так же какРеагировать на официальный исходный код

В настоящее время новая архитектура RN находится в стадии интенсивного рефакторинга, который немного отстает от запланированного графика, и мы с нетерпением ждем выхода и производительности нового фреймворка.

Набор инженера-разработчика интерфейса NetEase Cloud Music

описание работы

1. Отвечает или участвует в начальной разработке различных типов проектов (Web&Webview, RN, Hybrid Web, PC&MAC, небольшие программы, творческая деятельность, промежуточные и серверные системы и т. д.), а также полный дизайн системы, технология выбор и разработка модуля. 

2. С целью постоянного улучшения качества, эффективности и опыта, упаковывайте компоненты, депозитарные документы, производственные инструменты, стройте системы и наслаждайтесь повседневной жизнью инженеров.

3. Делитесь тем, что вы видите и думаете каждый день, помогайте коллегам расти вместе и создавайте позитивную и здоровую техническую атмосферу.

Профессиональные требования

1. Владеет различными технологиями и стандартами веб-интерфейса (Javascript, HTML, CSS), знаком с распространенными решениями для макета страницы и имеет глубокое понимание разделения представления и данных, веб-семантики и т. д.

2. Умение работать с инфраструктурой представления, управляемой данными (React, Angular, Vue...).

3. Знакомы с распространенными инструментами разработки интерфейса (webpack и т. д.) и имеете зрелое модульное мышление при разработке.

4. Знакомы с распространенными интерфейсными решениями для управления данными (такими как Redux, Mobx, Rxjs и т. д.), а также знаете их преимущества и недостатки, а также сценарии применения.

5. Знакомство с протоколом HTTP, владение инструментами сетевой отладки и базовые знания в области разработки серверов.

6. Низкая терпимость к повторяющейся или нерегулярной работе, которая может быть решена спонтанно с помощью связи или технических средств.

Дополнительные бонусные баллы:

1. Иметь принципиальное представление о более широком интерфейсе, выходящем за рамки рекомендаций по документации.

2. Solid Node Foundation, имеют собственный практический опыт асинхронного программирования Node, управления стабильностью и т. д., а также имеют опыт работы в крупномасштабной и высокодоступной производственной среде Node. 

3. Богатый опыт кросс-энд (ПК и IOS и Android) разработки, с практическим опытом интеграции кросс-энд технологий.

4. Практический опыт в веб-творческой деятельности и играх, а также вывод соответствующих фреймворков или решений.

5. Лучше иметь опыт работы зрелой и крупной фронтенд-команды на крупном заводе, участвовать в разработке или умело применять внутреннюю инфраструктуру осаждения и уметь понимать их точки улучшения.

6. Руководил или участвовал в высококачественных проектах с открытым исходным кодом в качестве основного участника и обладал глубоким пониманием работы технических сообществ.

Контакты

hzzhangweidong@corp.netease.com

использованная литература

  1. react-native-fabric-why-am-i-so-excited
  2. React Native: See the Past, the Present and the Future
  3. How React Native constructs app layouts
  4. React Native EU 2019: Emily Janzer - The New React Native
  5. React Native — мост к Project Fabric
  6. Chen Feldman - React Native - Under the Bridge