Есть ли у React Native виртуальный DOM?
Из ReactJS wiki о виртуальном DOM:
React создает кеш структуры данных в памяти, вычисляет в результате различий, а затем обновляет отображаемый браузер DOM эффективно. Это позволяет программисту писать код, как если бы вся страница отображается при каждом изменении, а библиотеки React только рендерите субкомпоненты, которые действительно меняются.
Другими словами, Virtual DOM позволяет нам повысить производительность, избегая прямых манипуляций с DOM.
Но как насчет React Native?
Мы знаем, что теоретически на других платформах существуют собственные представления и компоненты пользовательского интерфейса. Сам DOM ничего не знает. Итак, можем ли мы сказать, что у React Native есть "Virtual DOM", или мы говорим о чем-то еще?
Например, существует раздел в Weex спецификации, которые описывают методы работы с DOM-деревом напрямую. И мое предположение заключается в том, что потенциально мы можем думать, что у React Native должно быть какое-то DOM-дерево, а также слой абстракции "Virtual DOM", который является основной идеей самого Реагента.
Итак, мой вопрос:
Есть ли у React Native какой-то "виртуальный DOM" (или его представление), и если да, то как этот "виртуальный DOM" переносится на разные платформы?
UPDATE:
Цель этого вопроса - пролить некоторый свет на то, как React Native управляет рендерингом собственных компонентов пользовательского интерфейса. Есть ли какой-либо конкретный подход, и если да, то как он официально называется?
ОБНОВЛЕНИЕ 2:
В этой статье описывается новая архитектура React, называемая Fiber который выглядит как ответ на этот вопрос.
Ответы
Ответ 1
Я не знаю, является ли это ответом на ваш вопрос, но я нашел это в официальном документе React:
Реагирует строит и поддерживает внутреннее представление визуализированного пользовательского интерфейса. Он включает элементы React, которые вы возвращаете из своих компонентов. Это представление позволяет React избегать создания узлов DOM и доступа к существующим без необходимости, поскольку это может быть медленнее операций над объектами JavaScript. Иногда он называется "виртуальным DOM", но он работает аналогично с React Native.
Итак, я бы сказал, что да, он управляет очень похожим внутренним представлением тому, что используется в React.js. Тогда я предполагаю, что он использует Javascript API для рендеринга собственных представлений так же, как прочитанная статья.
ИЗМЕНИТЬ
Этот комментарий, предоставленный Sebas в комментарии, также интересен тем, что член команды React (и React Native) говорит, что:
React Native показывает, что ReactJS всегда был больше о "zero DOM", чем "virtual DOM" (вопреки распространенному мнению).
Похоже, что так называемый "React virtual DOM" намного ближе к внутренней структуре/представлению элементов, которые могут быть сопоставлены с различными технологиями, чем с HTML DOM.
Ответ 2
Здесь приведено упрощение: ReactJS выводит DOM, который может отображаться в браузерах. Как вы уже знаете, виртуальная DOM помогает ReactJS эффективно отслеживать дельта того, что изменилось. Для React Native для iOS в конечном итоге выводится код UIKit. То же самое происходит с React Native для Android, но вместо вывода DOM или UI Kit выход создается с помощью Android SDK. Таким образом, виртуальный DOM является лишь промежуточным этапом. Его можно рассматривать как комбинацию внутренней структуры данных для хранения данных, которые описывают, где отображать кнопку и текстовое поле, что происходит, когда вы нажимаете кнопку и т.д., И эффективный алгоритм для отслеживания изменений. Тот же код может использоваться для всех платформ. Только последний шаг отличается. В зависимости от платформы у него есть код, который генерирует код DOM, UIKit или любое другое имя Android UI lib.
Ответ 3
В этой статье описывается новая архитектура React, называемая Fiber. Кажется, это правильный ответ о том, что происходит в React Native или, по крайней мере, о том, что React Native будет пытаться достичь в ближайшем будущем.
DOM - это только одна из сред рендеринга, которую может оказать Реакт, другие основные цели - это родные виды iOS и Android через React Родной. (Вот почему "виртуальный DOM" является немного неправильным.)
Причина, по которой он может поддерживать так много целей, состоит в том, что React разработан так что сверка и рендеринг являются отдельными фазами. примиритель выполняет работу по вычислению, какие части дерева имеют изменено; рендеринг затем использует эту информацию для фактического обновления рендеринговое приложение.
Это разделение означает, что React DOM и React Native могут использовать их собственные рендереры, совместно использующие один и тот же примиритель, предоставленный React Ядро.
Волокно повторяет примиритель.
Ответ 4
Короче
Ну... в сущности, да, точно так же, как Reactjs Virtual DOM, React-Native создает иерархию дерева для определения исходного макета и создает разницу этого дерева при каждом изменении макета для оптимизации рендеринга. Кроме того, React-Native управляет обновлениями пользовательского интерфейса через пару уровней архитектуры, которые в конечном итоге преобразуют способы представления представлений при попытке оптимизировать изменения до минимума, чтобы обеспечить максимально возможный рендеринг.
Более подробное объяснение
Чтобы понять, как реагировать native создает представления в фоновом режиме, вам нужно понять основы, и для этого я предпочел бы начать с нуля
1. Механизм компоновки йоги
Yoga - это механизм кросс-платформенной компоновки, написанный на C, который реализует Flexbox через привязки к собственным представлениям (Java Android Просмотров /Objective-C iOS UIKit).
Все раскладки макетов различных видов, тексты aodnd images в React-Native выполняются с помощью йоги, это в основном последний шаг, прежде чем наши представления будут отображаться на экране
2. Теневое дерево/Узлы тени
Когда response-native отправляет команды для рендеринга макета, группа теневых узлов собирается для сборки теневого дерева, которое представляет измененную собственную сторону макета (то есть: записывается на соответствующем родном языке, Java для Android и Objective-C для iOS), который затем переводится в фактические представления на экране (с использованием йоги).
3. ViewManager
ViewManger - это интерфейс, который знает, как перевести виды просмотра, отправленные из JavaScript, в их собственные компоненты пользовательского интерфейса.
ViewManager знает, как создать тень node, собственный вид node и обновить представления.
В структуре React-Native существует много ViewManager, которые позволяют использовать собственные компоненты.
Если, например, вы когда-нибудь хотели бы создать новое настраиваемое представление и добавить его в native-native, это представление должно будет реализовать интерфейс ViewManager
4. UIManager
UIManager - это последний фрагмент головоломки, или же первый.
Декларативные команды JavaScript JSX отправляются в native как императивные команды, которые сообщают React-Native, как развернуть представления, шаг за шагом итеративно.
Таким образом, как первый рендер, UIManager отправит команду для создания необходимых представлений и продолжит отправлять обновления, поскольку пользовательский интерфейс приложения изменяется со временем.
So React-Native по-прежнему использует способность Reactjs вычислять разницу между предыдущим и текущим представлением рендеринга и соответственно отправляет события в UIManger
Чтобы узнать о процессе немного более подробно, я рекомендую следующую презентацию Эмиль Шёландер из конференции "Реагент-родная ЕС 2017" во Вроцлаве