0Pricing
React Academy · Lekcja

Problem renderowania dużych list

Proszę poznać przyczyny, dla których renderowanie 10 000 węzłów DOM drastycznie obniża wydajność, oraz dowiedzieć się, jak rozwiązuje to wirtualizacja.

Problem renderowania dużych list to bezpłatna lekcja React Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej React Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs React Academy zawiera 4 lekcji w sumie.

Renderowanie 10 000 elementów li

Załóżmy, że iteruje się po tablicy dziesięciu tysięcy elementów i renderuje element li dla każdego z nich. React skrupulatnie utworzy dziesięć tysięcy węzłów DOM, mimo że jednocześnie na ekranie mieści się zaledwie kilkadziesiąt.

Większość tych węzłów znajduje się poza ekranem i jest niewidoczna, jednak przeglądarka nadal musi je wszystkie utworzyć, obliczyć ich układ i utrzymywać.

Koszt układu przeglądarki dla dużych drzew DOM

Duże drzewa DOM wiążą się dla przeglądarki z realnym kosztem. Układ, ponowne obliczanie stylów i zużycie pamięci rosną wraz z liczbą węzłów, dlatego ogromna lista spowalnia początkowe renderowanie i zwiększa zużycie pamięci.

Nawet proste interakcje mogą się zacinać, gdy silnik musi śledzić i ponownie obliczać układ dziesiątek tysięcy węzłów.

Pogorszenie płynności przewijania

To właśnie podczas przewijania ogromnej listy użytkownicy odczuwają problem najbardziej. Przeglądarka ponownie rysuje zawartość i może ponownie obliczać układ, gdy zawartość się przesuwa, a przy zbyt dużej liczbie węzłów liczba klatek spada poniżej poziomu zapewniającego płynność.

Rezultatem jest szarpane, opóźnione przewijanie, przez które interfejs wydaje się nie reagować, niezależnie od tego, jak szybko działa reszta aplikacji.

Pomiar liczby węzłów w DevTools

Problem można potwierdzić w panelu Memory narzędzi deweloperskich przeglądarki, który pokazuje liczbę węzłów DOM na stronie. Lista tworząca tysiące węzłów jest tam wyraźnie widoczna.

Obserwowanie, jak liczba ta rośnie podczas renderowania kolejnych elementów, dostarcza konkretnych dowodów na to, że wąskim gardłem jest rozmiar DOM.

Koncepcja wirtualizacji

Wirtualizacja, nazywana czasem okienkowaniem, renderuje tylko aktualnie widoczne elementy wraz z niewielkim buforem, zamiast całej listy. Podczas przewijania elementy wchodzące w obszar widoczny są montowane, a te, które go opuszczają, są odmontowywane.

Dzięki temu aktywny DOM pozostaje niewielki niezależnie od liczby elementów w danych, a jego rozmiar zostaje uniezależniony od rozmiaru zbioru danych.

Obliczanie widocznego okna

Widoczne okno wyznacza się na podstawie pozycji przewijania, wysokości kontenera i wysokości elementu. Podzielenie wysokości obszaru widoku przez wysokość elementu daje przybliżoną liczbę mieszczących się wierszy, a przesunięcie przewijania wskazuje, które to wiersze.

Biblioteka używa tych wartości, aby w każdej chwili dokładnie określić, jaki fragment elementów należy wyrenderować.

react-virtualized vs react-window vs TanStack Virtual

Istnieje kilka bibliotek implementujących okienkowanie. react-virtualized jest rozbudowana i oferuje wiele funkcji, ale jest większa, react-window to mniejsza, ukierunkowana wersja napisana przez tego samego autora, a TanStack Virtual to nowoczesna opcja headless.

W przypadku większości list react-window zapewnia doskonały kompromis między prostotą a wydajnością, dlatego właśnie na niej skupia się ten kurs.

Kiedy wirtualizacja jest konieczna

Wirtualizacja przynosi korzyści w przypadku długich list, zwykle liczących kilkaset wierszy lub więcej, albo gdy wiersze zawierają dużo obrazów i zagnieżdżonych komponentów. To sytuacje, w których rozmiar DOM rzeczywiście negatywnie wpływa na działanie aplikacji.

Nieskończone strumienie danych, duże tabele danych i historie czatów to typowe scenariusze, w których okienkowanie staje się niezbędne, a nie opcjonalne.

Kiedy nie warto jej stosować

W przypadku krótkich list zawierających kilkadziesiąt prostych elementów wirtualizacja zwiększa złożoność bez wymiernych korzyści. Narzut związany z pozycjonowaniem absolutnym i pomiarem może nawet przynieść stratę netto.

Okienkowanie warto rezerwować dla rzeczywiście dużych zbiorów danych; w przypadku małych zwykłe mapowanie jest prostsze i wystarczająco szybkie.

Efekt

Dzięki okienkowaniu lista licząca sto tysięcy elementów przechowuje w DOM tylko kilka widocznych elementów, dlatego początkowe renderowanie jest szybkie, zużycie pamięci pozostaje niskie, a przewijanie jest płynne.

W zamian za odrobinę większą złożoność konfiguracji otrzymuje się wydajność, która nie zależy już od ilości danych. To właśnie jest główna obietnica wirtualizacji.

Szybki test: kiedy stosować wirtualizację

Ustal, kiedy wirtualizacja się opłaca.

Podsumowanie: problem dużych list

Renderowanie tysięcy węzłów DOM zwiększa koszt obliczania układu i zużycie pamięci oraz powoduje szarpanie podczas przewijania. Problem ten można potwierdzić, sprawdzając liczbę węzłów w DevTools. Wirtualizacja renderuje tylko widoczne okno wraz z buforem, dzięki czemu DOM pozostaje niewielki.

react-window to ukierunkowana, lekka opcja spośród react-virtualized i TanStack Virtual. Należy używać jej w przypadku dużych lub ciężkich list, a pomijać przy krótkich i prostych.

Często zadawane pytania

Czy lekcja „Problem renderowania dużych list” jest bezpłatna?

Tak — pełny tekst „Problem renderowania dużych list” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu React Academy, przejdź na CoddyKit PRO. Kurs React Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Problem renderowania dużych list”?

Proszę poznać przyczyny, dla których renderowanie 10 000 węzłów DOM drastycznie obniża wydajność, oraz dowiedzieć się, jak rozwiązuje to wirtualizacja. Ćwiczysz React Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć React Academy?

Nie wymagamy żadnego doświadczenia. React Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.

Ile czasu zajmuje lekcja „Problem renderowania dużych list”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji React Academy?

Tak. Każda lekcja React Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Problem renderowania dużych list
  2. FixedSizeList: renderowanie tysięcy elementów
  3. VariableSizeList: dynamiczne wysokości wierszy
  4. Łączenie wirtualizacji z pobieraniem danych
← Powrót do React Academy