Я видел выступление разработчика React ( Пит Хант: React: переосмысление лучших практик - JSConf EU 2013 ), и докладчик отметил, что проверка модели может быть медленной. Но не является ли вычисление различий между виртуальными DOM на самом деле еще менее производительным, поскольку виртуальная DOM в большинстве случаев должна быть больше, чем модель?
Мне действительно нравится потенциальная мощь Virtual DOM (особенно рендеринг на стороне сервера), но я хотел бы знать все плюсы и минусы.
javascript
dom
reactjs
virtual-dom
Daniil
источник
источник
Ответы:
Я основной автор модуля virtual-dom , поэтому я могу ответить на ваши вопросы. На самом деле есть 2 проблемы, которые необходимо решить здесь
В React каждый из ваших компонентов имеет состояние. Это состояние похоже на наблюдаемое, которое вы можете найти в нокауте или других библиотеках стилей MVVM. По сути, React знает, когда нужно заново визуализировать сцену, потому что он способен наблюдать, когда эти данные изменяются. Грязная проверка выполняется медленнее, чем наблюдаемые, потому что необходимо регулярно опрашивать данные и рекурсивно проверять все значения в структуре данных. Для сравнения, установка значения для состояния будет сигнализировать слушателю, что какое-то состояние изменилось, поэтому React может просто прослушать события изменения состояния и поставить в очередь повторный рендеринг.
Виртуальный DOM используется для эффективного повторного рендеринга DOM. Это на самом деле не связано с грязной проверкой ваших данных. Вы можете выполнить рендеринг с использованием виртуального DOM с грязной проверкой или без нее. Вы правы в том, что при вычислении различий между двумя виртуальными деревьями возникают некоторые накладные расходы, но виртуальная разность DOM заключается в понимании того, что необходимо обновить в DOM, а не в том, изменились ли ваши данные. Фактически, алгоритм diff сам по себе является грязной проверкой, но он используется, чтобы увидеть, не является ли DOM грязным.
Мы стремимся перерисовывать виртуальное дерево только при изменении состояния. Таким образом, использование наблюдаемой для проверки, изменилось ли состояние, является эффективным способом предотвращения ненужных повторных визуализаций, которые могут привести к большому количеству ненужных различий дерева. Если ничего не изменилось, мы ничего не делаем.
Виртуальный DOM хорош, потому что он позволяет нам писать наш код, как будто мы перерисовываем всю сцену. За кулисами мы хотим вычислить операцию исправления, которая обновляет DOM, чтобы посмотреть, как мы ожидаем. Таким образом, хотя алгоритм DOM diff / patch виртуальных DOM, вероятно, не является оптимальным решением , он дает нам очень хороший способ выразить наши приложения. Мы просто объявляем, чего именно хотим, и React / virtual-dom решит, как сделать вашу сцену такой. Нам не нужно вручную манипулировать DOM или запутываться в предыдущем состоянии DOM. Нам также не нужно перерисовывать всю сцену, что может быть гораздо менее эффективно, чем ее исправление.
источник
unnecessary re-renders
?this.state.cats = 99
вам все равно понадобится грязная проверка для проверки изменения модели, так же как Angular dirty проверяет дерево $ scope. Это не сравнение скорости двух техник, это просто утверждение, что React не выполняет грязную проверку, потому что вместо него есть установщик стиля Backbone.Недавно я прочитал подробную статью об алгоритме сравнения React здесь: http://calendar.perfplanet.com/2013/diff/ . Из того, что я понимаю, что делает React быстрым:
По сравнению с грязной проверкой ключевые отличия IMO:
Грязная проверка модели : компонент React явно устанавливается как грязный при каждом
setState
вызове, поэтому здесь не требуется никакого сравнения (данных). Для грязной проверки сравнение (моделей) всегда происходит в каждом цикле дайджеста.Обновление DOM : операции DOM очень дороги, потому что модификация DOM также будет применяться и вычислять стили CSS, макеты. Сэкономленное время от ненужной модификации DOM может быть больше, чем время, потраченное на распространение виртуальной DOM.
Второй пункт еще более важен для нетривиальных моделей, таких как модель с огромным количеством полей или большим списком. Одно изменение поля сложной модели приведет только к операциям, необходимым для элементов DOM, включающих это поле, вместо всего представления / шаблона.
источник
$scope.$digest
выполняются несколько раз за цикл дайджеста, поэтому это многократное время полного сравнения данных по сравнению с одним временем частичного сравнения виртуального дерева DOM.React - не единственная библиотека манипулирования DOM. Я рекомендую вам понять альтернативы, прочитав эту статью от Auth0, которая включает подробное объяснение и тесты. Я выделю здесь их плюсы и минусы, как вы спросили:
источник
Вот комментарий члена команды React Себастьяна Маркбога, который проливает некоторый свет:
https://news.ycombinator.com/item?id=6937668
источник
Виртуальный Дом не изобретен по реакции. Это часть HTML-домена. Он легкий и не связан с деталями реализации браузера.
Мы можем рассматривать виртуальный DOM как локальную и упрощенную копию React HTML DOM. Это позволяет React выполнять свои вычисления в этом абстрактном мире и пропускать «реальные» операции DOM, часто медленные и специфичные для браузера. На самом деле нет большой разницы между DOM и VIRTUAL DOM.
Ниже приведены пункты, по которым используется Virtual Dom (исходный Virtual DOM в ReactJS ):
А также обновление свойств DOM т.е. ценности. Это следует алгоритму.
Теперь предположим, что если вы обновляете DOM напрямую 10 раз, то все вышеперечисленные шаги будут выполняться один за другим, а обновление алгоритмов DOM потребует времени для обновления значений DOM.
Вот почему Real DOM медленнее, чем виртуальный DOM.
источник