J'ai vu une discussion sur le développement de React ( Pete Hunt: React: repenser les meilleures pratiques - JSConf EU 2013 ) et le conférencier a mentionné que la vérification du modèle peut être lente. Mais le calcul de la différence entre les DOM virtuels n'est-il pas encore moins performant puisque le DOM virtuel, dans la plupart des cas, devrait être plus grand que le modèle?
J'aime vraiment la puissance potentielle du Virtual DOM (en particulier le rendu côté serveur) mais j'aimerais connaître tous les avantages et les inconvénients.
javascript
dom
reactjs
virtual-dom
Daniil
la source
la source
Réponses:
Je suis l'auteur principal d'un module de dom virtuel , donc je pourrais être en mesure de répondre à vos questions. Il y a en fait 2 problèmes qui doivent être résolus ici
Dans React, chacun de vos composants a un état. Cet état est semblable à un observable que vous pourriez trouver dans les bibliothèques de style knockout ou MVVM. Essentiellement, React sait quand restituer la scène car il est capable d'observer quand ces données changent. La vérification incorrecte est plus lente que les observables, car vous devez interroger les données à intervalles réguliers et vérifier toutes les valeurs de la structure de données de manière récursive. Par comparaison, la définition d'une valeur sur l'état signalera à un auditeur qu'un certain état a changé, de sorte que React peut simplement écouter les événements de changement sur l'état et mettre en file d'attente un nouveau rendu.
Le DOM virtuel est utilisé pour un nouveau rendu efficace du DOM. Ce n'est pas vraiment lié à une vérification incorrecte de vos données. Vous pouvez effectuer un nouveau rendu à l'aide d'un DOM virtuel avec ou sans vérification incorrecte. Vous avez raison en ce qu'il y a des frais généraux dans le calcul du diff entre deux arborescences virtuelles, mais le diff DOM virtuel consiste à comprendre ce qui doit être mis à jour dans le DOM et non pas si vos données ont changé ou non. En fait, l'algorithme diff est un vérificateur sale lui-même mais il est utilisé pour voir si le DOM est sale à la place.
Nous visons à restituer l'arbre virtuel uniquement lorsque l'état change. Donc, utiliser un observable pour vérifier si l'état a changé est un moyen efficace d'empêcher les re-rendus inutiles, ce qui entraînerait beaucoup de différences d'arbre inutiles. Si rien n'a changé, nous ne faisons rien.
Un DOM virtuel est agréable car il nous permet d'écrire notre code comme si nous restituions la scène entière. Dans les coulisses, nous voulons calculer une opération de correctif qui met à jour le DOM pour voir comment nous nous attendons. Ainsi, alors que l'algorithme de diff / patch DOM virtuel n'est probablement pas la solution optimale , il nous donne un très bon moyen d'exprimer nos applications. Nous déclarons juste exactement ce que nous voulons et React / virtual-dom déterminera comment faire ressembler votre scène à ceci. Nous n'avons pas à faire de manipulation manuelle du DOM ni à être confus au sujet de l'état précédent du DOM. Nous n'avons pas non plus à restituer la scène entière, ce qui pourrait être beaucoup moins efficace que de la patcher.
la source
unnecessary re-renders
?this.state.cats = 99
pouviez le faire, vous auriez toujours besoin d'une vérification sale pour vérifier le changement de modèle, tout comme Angular dirty vérifie l'arborescence $ scope. Ce n'est pas une comparaison de la vitesse des deux techniques, c'est simplement une déclaration que React ne fait pas de vérification sale car il a un setter de style Backbone à la place.J'ai récemment lu un article détaillé sur l'algorithme de diff de React ici: http://calendar.perfplanet.com/2013/diff/ . D'après ce que je comprends, ce qui rend React rapide est:
Par rapport au dirty-check, les principales différences de l'OMI sont:
Vérification des modèles : le composant React est explicitement défini comme sale à chaque
setState
appel, il n'y a donc pas de comparaison (des données) nécessaire ici. Pour les vérifications incorrectes, la comparaison (des modèles) se produit toujours à chaque boucle de résumé.Mise à jour DOM : les opérations DOM sont très coûteuses car la modification du DOM va également appliquer et calculer les styles CSS, les mises en page. Le temps gagné par une modification DOM inutile peut être plus long que le temps passé à différer le DOM virtuel.
Le deuxième point est encore plus important pour les modèles non triviaux tels que ceux avec une énorme quantité de champs ou une grande liste. Un changement de champ d'un modèle complexe se traduira uniquement par les opérations nécessaires pour les éléments DOM impliquant ce champ, au lieu de l'ensemble de la vue / du modèle.
la source
$scope.$digest
est exécuté plusieurs fois par cycle de résumé, il s'agit donc de plusieurs fois de comparaison complète des données par rapport à une seule fois de comparaison d'arborescence DOM virtuelle partielle.React n'est pas la seule bibliothèque de manipulation DOM. Je vous encourage à comprendre les alternatives en lisant cet article d'Auth0 qui comprend des explications détaillées et des références. Je vais souligner ici leurs avantages et leurs inconvénients, comme vous l'avez demandé:
la source
Voici un commentaire du membre de l'équipe React, Sebastian Markbåge, qui met en lumière:
https://news.ycombinator.com/item?id=6937668
la source
Virtual Dom n'est pas inventé par react. Il fait partie de HTML dom. Il est léger et détaché des détails d'implémentation spécifiques au navigateur.
Nous pouvons considérer le DOM virtuel comme une copie locale et simplifiée de React du DOM HTML. Il permet à React de faire ses calculs dans ce monde abstrait et d'ignorer les «vraies» opérations DOM, souvent lentes et spécifiques au navigateur. En fait, il n'y a pas de grande différence entre DOM et VIRTUAL DOM.
Voici les points pourquoi Virtual Dom est utilisé (source Virtual DOM dans ReactJS ):
Ainsi que la mise à jour des propriétés DOM ie. valeurs. Il suit un algorithme.
Supposons maintenant que si vous mettez à jour DOM 10 fois directement, toutes les étapes ci-dessus seront exécutées une par une et la mise à jour des algorithmes DOM prendra du temps pour mettre à jour les valeurs DOM.
C'est pourquoi le Real DOM est plus lent que le DOM virtuel.
la source