Ich habe eine Frage zu einer großen Anzahl von Dom elmenets und Leistungen.
Angenommen, ich habe 6000 Dom-Elemente auf einer Seite und die Anzahl der Elemente kann erhöht werden, wenn ein Benutzer mit der Seite interagiert (Benutzer scrollt, um ein neues Dom-Element zu erstellen), wie z. B. Twitter.
Um die Leistung der Seite zu verbessern, kann ich mir nur zwei Dinge vorstellen.
- Setzen Sie die Anzeige auf keine unsichtbaren Elemente, um einen Reflow zu vermeiden
- Entfernen Sie unsichtbare Elemente aus dem Dom und fügen Sie sie nach Bedarf hinzu.
Gibt es andere Möglichkeiten, eine Seite mit vielen Dom-Elementen zu verbessern?
javascript
performance
dom
Mond
quelle
quelle
Antworten:
Ich habe noch keine Erfahrung damit, aber hier gibt es einige großartige Tipps: http://engineering.linkedin.com/linkedin-ipad-5-techniques-smooth-infinite-scrolling-html5
Ich habe mir Facebook angesehen und sie scheinen auf Firefox nichts Besonderes zu tun. Während Sie nach unten scrollen, ändern sich die DOM-Elemente oben auf der Seite nicht. Die Speichernutzung von Firefox steigt auf etwa 500 Megabyte, bevor Facebook Ihnen nicht erlaubt, weiter zu scrollen.
Twitter scheint dasselbe zu sein wie Facebook.
Google Maps ist eine andere Geschichte - nicht sichtbare Kartenkacheln werden aus dem DOM entfernt (wenn auch nicht sofort).
quelle
Wir mussten uns mit einem ähnlichen Problem bei FoldingText befassen . Mit zunehmender Größe des Dokuments wurden mehr Linienelemente und zugehörige Bereichselemente erstellt. Die Browser-Engine schien nur zu ersticken, und so musste eine bessere Lösung gefunden werden.
Folgendes haben wir getan, können für Ihre Zwecke nützlich sein oder auch nicht:
Visualisieren Sie die gesamte Seite als langes Dokument und das Browser-Ansichtsfenster als Objektiv für einen bestimmten Teil des langen Dokuments. Sie müssen wirklich nur den Teil innerhalb des Objektivs zeigen.
Der erste Teil besteht also darin, den sichtbaren Ansichtsport zu berechnen. (Dies hängt davon ab, wie Ihre Elemente platziert sind, absolut / fest / Standard)
var top = document.scrollTop; var width = window.innerWidth; var height = window.innerHeight;
Weitere Ressourcen, um ein browserübergreifenderes Ansichtsfenster zu finden:
Holen Sie sich die Dimensionen des Browser-Ansichtsfensters mit JavaScript
Browserübergreifende Methode zum Erkennen des scrollTop des Browserfensters
Zweitens benötigen Sie eine Datenstruktur, um zu wissen, welche Elemente in diesem Bereich sichtbar sind
Wir hatten bereits einen ausgeglichenen binären Suchbaum für die Textbearbeitung, daher haben wir ihn erweitert, um auch die Zeilenhöhen zu verwalten, sodass dieser Teil für uns relativ einfach war. Ich glaube nicht, dass Sie eine komplexe Datenstruktur für die Verwaltung Ihrer Elementhöhen benötigen. Ein einfaches Array oder Objekt kann gut funktionieren. Stellen Sie einfach sicher, dass Sie Höhen und Maße einfach abfragen können. Wie würden Sie nun die Höhendaten für alle Ihre Elemente erhalten? Eine sehr einfache (aber rechenintensive für große Mengen von Elementen!)
var boundingRect = element.getBoundingClientRect()
Ich bin in Bezug auf die reine Javascript sprechen, aber wenn Sie jQuery verwenden
$.offset
,$.position
und Methoden aufgeführt hier wäre sehr hilfreich.Auch hier ist die Verwendung einer Datenstruktur nur als Cache wichtig. Wenn Sie möchten, können Sie dies jedoch im laufenden Betrieb tun (obwohl diese Vorgänge, wie bereits erwähnt, teuer sind). Achten Sie auch darauf, die CSS-Stile zu ändern und diese Methoden aufzurufen. Diese Funktionen erzwingen das Neuzeichnen, sodass ein Leistungsproblem auftritt.
Zuletzt ersetzen Sie einfach die Elemente außerhalb des Bildschirms durch ein einzelnes, beispielsweise
<div>
Element mit berechneter HöheJetzt haben Sie Höhen für alle in Ihrer Datenstruktur gespeicherten Elemente. Fragen Sie alle Elemente ab, die vor dem sichtbaren Ansichtsfenster liegen.
Erstellen Sie eine
<div>
mit CSS-Höhe festgelegte Höhe (in Pixel) zur Summe der ElementhöhenWiederholen Sie diesen Vorgang für Elemente, die hinter dem sichtbaren Ansichtsfenster liegen.
Suchen Sie nach Ereignissen zum Scrollen und Ändern der Größe. Bei jedem Bildlauf müssen Sie zu Ihrer Datenstruktur zurückkehren, die Füller-Divs entfernen, Elemente erstellen, die zuvor vom Bildschirm entfernt wurden, und dementsprechend neue Füller-Divs hinzufügen.
:) Es ist eine lange, komplexe Methode, aber bei großen Dokumenten hat sie unsere Leistung erheblich gesteigert.
tl; dr
Ich bin mir nicht sicher, ob ich es richtig erklärt habe, aber der Kern dieser Methode ist:
Hoffe das hilft.
quelle
Es ist 2019. Die Frage ist wirklich alt, aber ich denke, sie ist immer noch relevant und interessant und vielleicht hat sich bis heute etwas geändert, da wir alle jetzt auch dazu neigen, React JS zu verwenden.
Mir ist aufgefallen, dass in der Zeitleiste von Facebook scheinbar Inhaltscluster verwendet werden, die ausgeblendet
display: none !important
werden, sobald der Cluster nicht mehr angezeigt wird. Daher werden alle zuvor gerenderten Elemente des DOM im DOM gespeichert. Es ist nur so, dass diejenigen, die nicht angezeigt werden, ausgeblendet werdendisplay: none !important
. Außerdem wird die Gesamthöhe des ausgeblendeten Clusters auf das übergeordnete Elementdiv
des ausgeblendeten Clusters festgelegt.Hier sind einige Screenshots, die ich gemacht habe:
Was halten Sie ab 2019 von diesem Ansatz? Wie kann React für diejenigen, die React verwenden, in React implementiert werden? Es wäre toll, Ihre Meinungen und Gedanken zu diesem kniffligen Thema zu erhalten.
Danke für die Aufmerksamkeit!
quelle