Performance avec un nombre infini de défilement ou beaucoup d'éléments du dom?
J'ai une question sur un grand nombre de dom elmenets et de la performance.
Disons que j'ai 6000 éléments du dom de la page et le nombre d'éléments peut être augmenté à un utilisateur d'interagir avec la page (rouleaux d'utilisateur pour créer un nouvel élément du dom) comme twitter.
Pour améliorer les performances de la page, je pense qu'à deux choses.
- set display none pour éléments invisibles pour éviter de redistribution
- supprimer des éléments invisibles de la dom, puis rajoutez-les au besoin.
Sont-ils d'autres moyens d'améliorer une page avec beaucoup d'éléments du dom?
- Réglage de l'affichage à aucun des déclencheurs de redistribution qui est complètement à l'opposé de ce que vous voulez si vous voulez éviter de redistribution. Ne rien faire ne déclenche pas de redistribution. La définition de la visibilité à caché et aussi de ne pas déclencher de redistribution. Cependant, ne pas faire quelque chose de beaucoup plus facile.
- Vous devriez aussi être conscient que votre gestionnaire de fenêtre déjà supprime les pixels invisibles à partir de l'écran pour accélérer la vitesse de l'INTERFACE utilisateur de l'interaction. Le faire vous-même en javascript sera probablement ralentir les choses au lieu de précipiter les choses.
- Lorsque j'ai mis en display none, il déclenche de redistribution. C'est vrai. mais..quand vous faites défiler, il déclenche également la redistribution et le navigateur doit calculer disposition pour tous les éléments sur la page. J'ai pensé affichage de réglage aucun certains des éléments sur la page de les aider à réduire l'aménagement du temps de calcul.
- avec votre 2ème commentaire, je pense que l'affichage de réglage de aucun ne les aidera pas.
- Non, la redistribution n'est pas déclenché lorsque vous faites défiler. Le navigateur attire tous les éléments à la fois, même en dessous de défilement ligne.
- selon phpied.com/rendering-repaint-reflowrelayout-restyle on dirait qu'elle fait..
- Non, il n'est pas. Vous pouvez le vérifier vous-même par la compilation de firefox ou de google chrome avec debug et en cours d'exécution à travers un générateur de profils. Le défilement des déclencheurs repeint, tout en faisant défiler tous les programmes Word ou le bloc-notes déclenche repeint. Même en déplaçant le pointeur de la souris déclenche repeint. Mais repeint sont pas cher - ils ont déjà été optimisé depuis la fin des années 1980 et sont mis en œuvre par l'OS/gestionnaire de fenêtre elle-même plutôt que de le programme. Le défilement ne déclenche pas de redistribution.
- merci pour l'aperçu. Je vais vérifier!
- ah..j'ai eu l'impression de défilement de redistribution à partir de paulirish.com/2011/dom-html5-css3-performance la vidéo. La vidéo des listes de cette fenêtre.scrollBy causes de redistribution. Je me demande pourquoi il le fait pour l'utilisateur de défilement ne fonctionne pas.
- C'est le ultime script de performance - airbnb.github.io/infinity
- Aussi, un grand article sur ce - dannysu.com/2012/07/07/infinite-scroll-memory-optimization
- J'ai posté une question similaire, stackoverflow.com/questions/33340901/... s'il vous Plaît partager toutes les informations dont vous avez peut-développés.
Vous devez vous connecter pour publier un commentaire.
Aucune expérience moi-même avec cela, mais il ya quelques conseils ici: http://engineering.linkedin.com/linkedin-ipad-5-techniques-smooth-infinite-scrolling-html5
J'ai eu un coup d'oeil à Facebook et ils ne semblent pas faire quoi que ce soit sur Firefox. Comme vous le faites défiler vers le bas, les éléments du DOM en haut de la page ne change pas. Firefox est l'utilisation de la mémoire monte à environ 500 meg avant que Facebook ne vous permet pas de faire défiler plus.
Twitter semble être le même que Facebook.
Google Maps est une autre histoire - des carreaux de la carte hors de la vue sont supprimés à partir du DOM (mais pas immédiatement).
Nous avons dû composer avec un problème similaire sur FoldingText. Comme le document est devenue plus grande, plus d'éléments de ligne et associés span éléments ont été créés. Le moteur de navigateur semblait s'étouffer, et donc une meilleure solution devait être trouvée.
Voici ce que nous avons fait, peut ou peut ne pas être utile pour vos besoins:
Visualiser l'ensemble de la page comme un long document, et le navigateur de la fenêtre d'affichage comme la lentille pour une partie spécifique du document long. Vous n'avez qu'à montrer la partie à l'intérieur de la lentille.
Donc, la première partie est de calculer la vue visible port. (Cela dépend de la façon dont les éléments sont placés, absolu /fixe /valeur par défaut)
Certains de plus de ressources pour trouver plus de croix-navigateur basé sur le viewport:
Obtenez la fenêtre d'affichage du navigateur dimensions avec JavaScript
Croix-navigateur méthode de détection de la scrollTop de la fenêtre du navigateur
Deuxièmement, vous avez besoin d'une structure de données afin de connaître les éléments qui sont visibles dans la zone
Nous avons déjà eu l'équilibre binaires de recherche arbres en place pour l'édition de texte, nous avons donc élargi pour gérer la ligne de hauteurs trop, cette partie nous a été relativement facile. Je ne pense pas que vous aurez besoin d'une structure de données complexes pour la gestion de votre élément en hauteur; un simple tableau ou d'un objet peuvent faire très bien. Juste assurez-vous que vous pouvez interroger les hauteurs et dimensions facilement sur elle. Maintenant, comment voulez-vous obtenir la hauteur de données pour l'ensemble de vos éléments. Un exemple très simple (mais gourmand en ressources pour de grandes quantités d'éléments!)
Je parle en termes de pur javascript, mais si vous êtes à l'aide de jQuery
$.offset
,$.position
, et les méthodes énumérées ici serait très utile.De nouveau, en utilisant une structure de données est important seulement comme un cache, mais si vous voulez, vous pouvez le faire à la volée (même si, comme je l'ai dit ces opérations sont coûteuses). Aussi, méfiez-vous de l'évolution des styles css et de l'appel de ces méthodes. Ces fonctions de la force de redessiner, de sorte que vous verrez un problème de performance.
Enfin, il suffit de remplacer les éléments à l'écran avec un seul, dire
<div>
élément calculé la hauteurMaintenant, vous avez des hauteurs de tous les éléments stockés dans la structure de Données, les requêtes de tous les éléments qui se trouvent avant la vue visible.
Créer un
<div>
avec css hauteur (en pixels) de la somme de l'élément hauteursRépétez l'opération pour les éléments qui se trouvent après la vue visible.
Look pour faire défiler et de redimensionner les événements. Sur chaque rouleau, vous aurez besoin de revenir à votre structure de données, retirez la plaque de vrd, de créer des éléments qui ont été retirés précédemment de l'écran, et en conséquence d'ajouter de nouvelles remplissage divs.
🙂 C'est un travail long, complexe de la méthode, mais pour les gros documents, il a augmenté notre performance par une grande marge.
tl;dr
Je ne suis pas sûr que je l'ai expliqué correctement, mais l'essentiel de cette méthode est:
Espère que cette aide.
getClientRects
,getBoundingClientRect
et d'autres de l'interrogation des styles css / dimensions de l'élément va forcer le navigateur à appliquer toutes les modifications que vous avez apportées aux éléments et à la force d'un dessin.C'est 2019. La question est vraiment vieux, mais je pense qu'il est toujours pertinent et intéressant, et peut-être quelque chose qui a changé aujourd'hui, comme nous tous aujourd'hui ont aussi tendance à utiliser Réagir JS.
J'ai remarqué que Facebook timeline semble utiliser des clusters de contenu qui est cachée avec
display: none !important
dès que le cluster se passe hors de la vue, de sorte que tout le rendu des éléments du DOM sont conservés dans les DOM, c'est juste que ceux en dehors de la vue sont cachés avecdisplay: none !important
.Aussi, la hauteur totale de l'caché cluster est configuré pour le parent
div
cachés cluster.Voici quelques captures d'écran que j'ai fait:
À compter de 2019, que pensez-vous de cette approche? Aussi, pour ceux qui utilisent Réagir, comment pourrait-il être mis en œuvre de Réagir? Il serait formidable de recevoir vos opinions et de vos réflexions sur ce sujet délicat.
Je vous remercie pour l'attention!