90% programistów React optymalizuje ponowne renderowanie w niewłaściwy sposób
Większość programistów używających React optymalizuje ponowne renderowanie w niewłaściwy sposób. Gdzie faktycznie idzie wydajność React i które rozwiązania są pomocne, plus lista kontrolna do ich zastosowania.
Źródła: 90% of React Developers Optimize Re-Renders Incorrectly — Here’s What Actually Works
Poniższe notatki przedstawiają praktyczne podejście do tematu „90% programistów React optymalizuje ponowne renderowanie w niewłaściwy sposób — oto co naprawdę działa”. Nacisk kładziony jest na umowy, sprawdzania oraz placeholderi kodu, a nie na motywacyjne aspekty. Podczas przechodzenia przez etap przeglądu najpierw zapisz umowę: wymagane dane wejściowe, sygnał sukcesu oraz to, co dzieje się w przypadku częściowego niepowodzenia. Taka lista kontrolna zapewnia uczciwość późniejszych zmian w kodzie. Traktuj ten etap jako umowę pomiędzy danymi wejściowymi a zweryfikowanymi wynikami. Nadaj nazwy poszczególnym elementom, zdefiniuj kryteria sukcesu i odrzuć możliwość cichego, częściowego ukończenia zadania.
Prawdziwy problem: nie rozumiemy, kiedy React ponownie renderuje
Nasze rozwiązania działają najlepiej, gdy traktuje się je jako mierzalną powierzchnię do analizy. Zapisz jeden idealny przykład działania, jeden przypadek awarii oraz notatkę dotyczącą cofnięcia zmian, zanim rozszerzysz zakres pracy. Zapisuj czasy wykonywania oraz koszt tokenów lub zapytań obok wyników funkcjonalnych. Wczesna widoczność kosztów zapobiega niespodziewanym rachunkom, gdy przechodzi się z środowiska demonstracyjnego do współdzielonych środowisk. Utrzymuj koszty renderowania na niskim poziomie i odkładaj drogie operacje wyliczeniowe na później, dopiero po ich zmierzeniu. Przedwczesne stosowanie mechanizmów memoizacji może ukrywać błędy związane ze starymi danymi.
Dzień, w którym w końcu otworzyłeś React Profiler
The Day you Finally stage działa najlepiej, gdy traktuje się je jako mierzalną powierzchnię. Zapisz jeden udany przypadek, jeden przypadek awarii oraz notatkę o cofnięciu zmian, zanim rozszerzysz zakres. Trzymaj konfigurację poza kodem aplikacji. Pliki środowiskowe, magazyny tajnych danych oraz flagi funkcjonalne powinny znajdować się w jednym miejscu, które operatorzy mogą sprawdzić bez konieczności czytania całej struktury. Utrzymuj koszty renderowania na niskim poziomie i odkładaj drogie operacje obliczeniowe na później, dopiero po ich zmierzeniu. Przedwczesne stosowanie mechanizmów memoizacji może ukrywać błędy związane ze starymi danymi.
Główna prawda: Ponowne renderowanie nie jest wrogiem — wrogami są te niepotrzebne
Faza The Core Truth Re-Renders funkcjonuje najlepiej, gdy jest traktowana jako mierzalna powierzchnia do analizy. Zapisz jeden idealny przypadek działania, jeden przypadek awarii oraz notatkę dotyczącą cofnięcia zmian, zanim rozszerzysz zakres pracy. Zdokumentuj zarówno prawidłowy przebieg działania, jak i ścieżkę naprawczą. Próby ponownych działań, kontrolne punkty ludzkie oraz obsługa wiadomości błędowych stanowią część produktu, a nie elementy dodawane później w celu udoskonalenia. Utrzymuj koszty procesu renderowania na niskim poziomie i odkładaj drogie operacje wywodzenia na później, tylko po dokonaniu pomiarów. Przedwczesne stosowanie mechanizmów memoizacji może ukrywać błędy związane ze starymi danymi. Faza The Core Truth Re-Renders funkcjonuje najlepiej, gdy jest traktowana jako mierzalna powierzchnia do analizy. Zapisz jeden idealny przypadek działania, jeden przypadek awarii oraz notatkę dotyczącą cofnięcia zmian, zanim rozszerzysz zakres pracy. Traktuj tę fazę jako umowę pomiędzy danymi wejściowymi a zweryfikowanymi wynikami. Nadaj nazwy poszczególnym elementom, zdefiniuj kryteria sukcesu i odrzucaj ciche, częściowe ukończenie zadań.
Rozdział 1: Model mentalny, który w końcu sprawił, że React zaczął działać
Dla etapu Mental w Sekcji 1 należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić dany krok na podstawie znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Należy rejestrować czasy wykonywania oraz koszt tokenów lub zapytań obok wyników funkcjonalnych. Wczesna widoczność kosztów zapobiega nieoczekiwanym rachunkom, gdy ścieżka przechodzi z środowiska demonstracyjnego do współdzielonych środowisk. W przypadku, gdy następnym krokiem jest kod lub wywołanie narzędzia, lepiej używać ustrukturyzowanych wyników z walidacją schematu niż tekstu w formie swobodnej.
React = Silnik Wykonywania Funkcji
W fazie silnika wykonywania funkcji React należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed zmianą kodu. Operatorzy powinni móc ponownie uruchomić dany krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Konfigurację należy przechowywać poza kodem aplikacji. Pliki środowiskowe, magazyny tajnych danych oraz flagi funkcjonalne powinny znajdować się w jednym miejscu, które operatorzy mogą sprawdzić bez konieczności czytania całej struktury aplikacji. Stan powinien być przechowywany razem z komponentem, który odpowiada za jego modyfikację. Umieszczanie wszystkiego w globalnym magazynie utrudnia wykrycie błędów związanych z czasem wykonywania operacji.
Component(props) → JSX
Rozdział 2: Dlaczego komponenty renderują się częściej, niż myślisz
W sekcji 2 „Dlaczego ten etap?” należy przed zmianą kodu określić dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia. Operatorzy powinni móc ponownie uruchomić ten krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Należy udokumentować zarówno prawidłowy przebieg procesu, jak i ścieżkę naprawczą. Próby ponownych działań, kontrolne punkty ludzkie oraz obsługa wiadomości błędnych stanowią część produktu, a nie elementy dodawane później. Stan powinien być przechowywany razem z komponentem, który odpowiada za jego modyfikację. Umieszczanie wszystkiego w globalnym magazynie utrudnia wykrycie błędów związanych z czasem realizacji. W sekcji 2 „Dlaczego ten etap?” należy przed zmianą kodu określić dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia. Operatorzy powinni móc ponownie uruchomić ten krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Traktuj ten etap jako umowę pomiędzy danymi wejściowymi a zweryfikowanymi wynikami. Nazwij poszczególne elementy, zdefiniuj kryteria sukcesu i odrzucaj ciche, częściowe ukończenie zadań.
1. Obiekty i funkcje wewnątrzliniowe
Gdy przechodzisz przez etap 1 Obiekty i funkcje wewnątrzliniowe, najpierw zapisz umowę: wymagane dane wejściowe, sygnał sukcesu oraz to, co dzieje się w przypadku częściowego niepowodzenia. Taka lista kontrolna zapewnia uczciwość późniejszych zmian w kodzie. Zapisz czas wykonywania oraz koszt tokena lub zapytania obok wyników funkcjonalnych. Wczesna widoczność kosztów zapobiega nieoczekiwanym rachunkom, gdy ścieżka przechodzi z środowiska demonstracyjnego do współdzielonych środowisk. Traktuj efekty jako synchronizację z otaczającym światem, a nie jako zamiennik wartości pochodnych podczas renderowania.
<MyComponent options={{ theme: "dark" }} />
{} !== {}
onClick={() => doSomething()}
2. Stan podniesiony zbyt wysoko
Gdy przechodzisz przez etap 2 State Lifted Too, najpierw zapisz umowę: wymagane dane wejściowe, sygnał sukcesu oraz to, co dzieje się w przypadku częściowego niepowodzenia. Taka lista kontrolna zapewnia uczciwość późniejszych zmian w kodzie. Przechowuj konfigurację poza kodem aplikacji. Pliki środowiskowe, magazyny tajnych danych oraz flagi funkcjonalne powinny znajdować się w jednym miejscu, które operatorzy mogą sprawdzić bez konieczności czytania całej struktury. Traktuj efekty jako synchronizację z otaczającym światem, a nie jako zamiennik wartości pochodnych podczas renderowania.
3. Stan pochodny przechowywany jako stan
Gdy przechodzisz przez etap 3 „Derived State Stored”, najpierw zapisz umowę: wymagane dane wejściowe, sygnał sukcesu oraz to, co dzieje się w przypadku częściowego niepowodzenia. Taka lista kontrolna zapewnia uczciwość późniejszych zmian w kodzie. Zdokumentuj zarówno ścieżkę prawidłowego działania, jak i ścieżkę naprawczą. Próby ponowne, kontrola przez ludzi oraz obsługa wiadomości błędnych stanowią część produktu, a nie elementy dodawane później. Traktuj efekty jako synchronizację z otaczającym światem, a nie jako zamiennik wartości pochodnych podczas renderowania. Gdy przechodzisz przez etap 3 „Derived State Stored”, najpierw zapisz umowę: wymagane dane wejściowe, sygnał sukcesu oraz to, co dzieje się w przypadku częściowego niepowodzenia. Taka lista kontrolna zapewnia uczciwość późniejszych zmian w kodzie. Traktuj ten etap jako umowę pomiędzy danymi wejściowymi a zweryfikowanymi wynikami. Nadaj nazwy poszczególnym elementom, zdefiniuj kryteria sukcesu i odrzucaj ciche, częściowe ukończenie zadania.
const [filtered, setFiltered] = useState([]);
useEffect(() => {
setFiltered(items.filter(...));
}, [items]);
Rozdział 3: Zasada, która wszystko dla mnie zmieniła
Etap „Rozdział 3: Zasady” funkcjonuje najlepiej, gdy traktowany jest jako mierzalna powierzchnia. Zapisz jeden idealny przykład działania, jeden przypadek awarii oraz notatkę dotyczącą cofnięcia zmian, zanim rozszerzysz zakres pracy. Zapisuj czasy wykonywania oraz koszt tokenów lub zapytań obok wyników funkcjonalnych. Wczesna widoczność kosztów zapobiega nieoczekiwanym rachunkom, gdy ścieżka przechodzi z środowiska demonstracyjnego do współdzielonych środowisk. Utrzymuj koszty renderowania na niskim poziomie i odkładaj drogie operacje wywodzenia na później, dopiero po ich zmierzeniu. Przedwczesne stosowanie mechanizmów memoizacji może ukrywać błędy związane ze starymi danymi.
Rozdział 4: 4 poziomy kontroli ponownego renderowania w React
Rozdział 4: Proces 4 etapów działa najlepiej, gdy traktuje się go jako mierzalną powierzchnię. Zapisz jeden idealny przykład działania, jeden przypadek awarii oraz notatkę o cofnięciu zmian, zanim rozszerzysz zakres pracy. Trzymaj konfigurację poza kodem aplikacji. Pliki środowiskowe, magazyny tajnych danych oraz flagi funkcjonalne powinny znajdować się w jednym miejscu, które operatorzy mogą sprawdzić bez konieczności przeglądania całej struktury. Utrzymuj koszty renderowania na niskim poziomie i odkładaj drogie operacje obliczeniowe na później, dopiero po ich zmierzeniu. Przedwczesne stosowanie mechanizmów memoizacji może ukrywać błędy związane ze starymi wartościami.
Poziom 1: Optymalizacja strukturalna (najważniejsza)
Etap optymalizacji strukturalnej poziomu 1 działa najlepiej, gdy traktuje się go jako mierzalną powierzchnię. Zapisz jeden „złoty” zapis działania, jeden przypadek awarii oraz notatkę dotyczącą cofnięcia działań, zanim rozszerzysz zakres. Zdokumentuj zarówno prawidłowy przebieg działania, jak i ścieżkę przywracania do normalnego stanu. Próby ponownych działań, kontrolne punkty ludzkie oraz obsługa wiadomości nieprzyjętych stanowią część produktu, a nie elementy dodawane później. Utrzymuj koszty renderowania na niskim poziomie i odkładaj drogie operacje wyliczeniowe na później, dopiero po ich zmierzeniu. Przedwczesne stosowanie mechanizmów memoizacji może ukrywać błędy związane ze starymi danymi. Etap optymalizacji strukturalnej poziomu 1 działa najlepiej, gdy traktuje się go jako mierzalną powierzchnię. Zapisz jeden „złoty” zapis działania, jeden przypadek awarii oraz notatkę dotyczącą cofnięcia działań, zanim rozszerzysz zakres. Traktuj ten etap jako umowę pomiędzy danymi wejściowymi a zweryfikowanymi wynikami. Nadaj nazwy poszczególnym elementom, zdefiniuj kryteria sukcesu i odrzucaj ciche, częściowe ukończenie zadań.
Poziom 2: Memoizacja (gdy jest to konieczne)
W fazie memoizacji poziomu 2 należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić ten krok na podstawie znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Należy rejestrować czasy wykonywania oraz koszt tokenów lub zapytań obok wyników funkcjonalnych. Wczesna widoczność kosztów zapobiega nieoczekiwanym rachunkom, gdy ścieżka przechodzi z środowiska demonstracyjnego do współdzielonych środowisk. Stan powinien być umieszczany obok komponentu, który odpowiada za jego modyfikację. Umieszczanie wszystkiego w globalnym magazynie utrudnia wykrycie błędów związanych z czasem wykonywania.
Poziom 3: Stabilność referencyjna
W fazie stabilności referencyjnej poziomu 3 należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić ten krok na podstawie znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Konfigurację należy przechowywać poza kodem aplikacji. Pliki środowiskowe, magazyny tajnych danych oraz flagi funkcjonalne powinny znajdować się w jednym miejscu, które operatorzy mogą sprawdzić bez konieczności przeglądania całej struktury. Stan powinien być przechowywany razem z komponentem, który odpowiada za jego modyfikację. Umieszczanie wszystkiego w globalnym magazynie utrudnia wykrycie błędów związanych z czasem wykonywania operacji.
const handler = () => doSomething();
const handler = useCallback(() => {
doSomething();
}, []);
const config = useMemo(() => ({
theme: "dark"
}), []);
Poziom 4: Izolacja architektoniczna
W fazie Izolacji Architektonicznej poziomu 4 należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed zmianą kodu. Operatorzy powinni móc ponownie uruchomić ten krok na podstawie znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Należy udokumentować zarówno prawidłowy przebieg działania, jak i ścieżkę naprawczą. Próby ponownych działań, kontrolne punkty ludzkie oraz obsługa wiadomości błędnych stanowią część produktu, a nie elementy dodawane później w celu udoskonalenia. Stan powinien być przechowywany razem z komponentem, który odpowiada za jego modyfikację. Umieszczanie wszystkiego w globalnym magazynie utrudnia wykrycie błędów związanych z czasem realizacji operacji. W fazie Izolacji Architektonicznej poziomu 4 należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed zmianą kodu. Operatorzy powinni móc ponownie uruchomić ten krok na podstawie znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Traktuj tę fazę jako umowę pomiędzy danymi wejściowymi a zweryfikowanymi wynikami. Nazwij poszczególne elementy, zdefiniuj kryteria sukcesu i odrzucaj ciche, częściowe ukończenie zadań.
Rozdział 5: React.memo — Najczęściej nadużywana optymalizacja
Gdy przechodzisz przez etap React memo w Rozdziale 5, najpierw zapisz umowę: wymagane dane wejściowe, sygnał sukcesu oraz to, co dzieje się przy częściowym niepowodzeniu. Taka lista kontrolna zapewnia uczciwość późniejszych zmian w kodzie. Zapisz czasy wykonywania oraz koszt tokenów lub zapytań obok wyników funkcjonalnych. Wczesna widoczność kosztów zapobiega nieoczekiwanym rachunkom, gdy ścieżka przechodzi z środowiska demonstracyjnego do współdzielonych środowisk. Traktuj efekty jako synchronizację z otaczającym światem, a nie jako zamiennik wartości wyliczanych podczas renderowania.
Kiedy React.memo NIC nie robi
Gdy pracujesz nad etapem „Kiedy React.memo działa”, najpierw zapisz umowę: wymagane dane wejściowe, sygnał sukcesu oraz to, co dzieje się w przypadku częściowego niepowodzenia. Taka lista kontrolna zapewnia uczciwość późniejszych zmian w kodzie. Trzymaj konfigurację poza kodem aplikacji. Pliki środowiskowe, magazyny tajnych danych oraz flagi funkcjonalne powinny znajdować się w jednym miejscu, które operatorzy mogą sprawdzić bez konieczności czytania całej struktury. Traktuj efekty jako synchronizację z otaczającym światem, a nie jako zamiennik wartości wyliczanych podczas renderowania.
Kiedy React.memo jest przydatne
Gdy przechodzisz przez etap „When React memo Shines”, najpierw zapisz umowę: wymagane dane wejściowe, sygnał sukcesu oraz to, co dzieje się w przypadku częściowego niepowodzenia. Taka lista kontrolna zapewnia uczciwość późniejszych zmian w kodzie. Zdokumentuj zarówno ścieżkę prawidłowego działania, jak i ścieżkę naprawczą. Próby ponowne, kontrola przez ludzi oraz obsługa wiadomości błędnych stanowią część produktu, a nie elementy dopiero późniejszej optymalizacji. Traktuj efekty jako synchronizację z otaczającym światem, a nie jako zamiennik wartości wyliczanych podczas renderowania. Gdy przechodzisz przez etap „When React memo Shines”, najpierw zapisz umowę: wymagane dane wejściowe, sygnał sukcesu oraz to, co dzieje się w przypadku częściowego niepowodzenia. Taka lista kontrolna zapewnia uczciwość późniejszych zmian w kodzie. Traktuj ten etap jako umowę pomiędzy danymi wejściowymi a zweryfikowanymi wynikami. Nadaj nazwy poszczególnym elementom, zdefiniuj kryteria sukcesu i odrzuć ciche, częściowe ukończenie zadania.
Rozdział 6: Pułapka useCallback
Rozdział 6: Etap useCallback działa najlepiej, gdy traktuje się go jako mierzalną powierzchnię do analizy. Zapisz jeden idealny przykład działania, jeden przypadek awarii oraz notatkę dotyczącą cofnięcia zmian, zanim rozszerzysz zakres analizy. Zarejestruj czasy wykonywania oraz koszt tokenów lub zapytań obok wyników funkcjonalnych. Wczesna widoczność kosztów zapobiega nieoczekiwanym rachunkom, gdy ścieżka przechodzi z środowiska demonstracyjnego do współdzielonych środowisk. Utrzymuj koszty renderowania na niskim poziomie i odkładaj drogie operacje wyliczeniowe na później, dopiero po ich zmierzeniu – przedwczesna memoizacja może ukrywać błędy związane ze starymi wartościami propów.
const handleClick = useCallback(() => {
setCount(c => c + 1);
}, []);
Rozdział 7: Ukryty koszt kontekstu
Rozdział 7 „Ukryta scena” funkcjonuje najlepiej, gdy traktowany jest jako mierzalna powierzchnia. Zapisz jeden „złoty” przepis, jeden przypadek awarii oraz notatkę o cofnięciu zmian, zanim rozszerzysz zakres. Trzymaj konfigurację poza kodem aplikacji. Pliki środowiskowe, magazyny tajnych danych oraz flagi funkcji powinny znajdować się w jednym miejscu, które operatorzy mogą sprawdzić bez konieczności czytania całej struktury. Utrzymuj koszty renderowania na niskim poziomie i odkładaj drogie operacje wyliczeniowe na później, dopiero po ich zmierzeniu. Przedwczesna memoizacja może ukrywać błędy związane ze starymi wartościami.
Zły przykład:
Faza Bad funkcjonuje najlepiej, gdy traktowana jest jako mierzalna powierzchnia. Zapisz jeden przykład udanego działania, jeden przypadek awarii oraz notatkę dotyczącą cofnięcia zmian, zanim rozszerzysz zakres pracy. Zdokumentuj zarówno ścieżkę udanego działania, jak i ścieżkę przywracania do stanu poprzedniego. Próby ponownych działań, kontrolne punkty ludzkie oraz obsługa wiadomości błędnych stanowią część produktu, a nie elementy dodawane później. Utrzymuj koszty przetwarzania na niskim poziomie i odkładaj drogie operacje wywodzenia na później, tylko po dokonaniu pomiarów. Przedwczesne stosowanie mechanizmów memoizacji może ukrywać błędy związane ze starymi danymi.
<AuthContext.Provider value={{ user, theme }}>
Lepiej:
Etap Better funkcjonuje najlepiej, gdy traktowany jest jako mierzalna powierzchnia. Zapisz jeden idealny przykład działania, jeden przypadek awarii oraz notatkę dotyczącą cofnięcia zmian, zanim rozszerzysz zakres pracy. Wolno preferować małe, testowalne jednostki zamiast rozbudowanych skryptów. Gdy jakiś krok zawiedzie, awaria powinna wskazywać na konkretną odpowiedzialność, a nie na skomplikowany łańcuch operacji. Utrzymuj koszty renderowania na niskim poziomie i odkładaj drogie operacje wyliczeniowe na później, dopiero po ich zmierzeniu. Przedwczesne stosowanie mechanizmów memoizacji może ukrywać błędy związane ze starymi danymi.
<UserContext />
<ThemeContext />
Rozdział 8: Listy, klucze i iluzja stabilności
Faza Lista Kluczy z Sekcji 8 działa najlepiej, gdy traktuje się ją jako mierzalną powierzchnię do analizy. Zapisz jeden idealny przykład działania, jeden przypadek niepowodzenia oraz notatkę dotyczącą cofnięcia zmian, zanim rozszerzysz zakres pracy. Traktuj tę fazę jako umowę pomiędzy danymi wejściowymi a zweryfikowanymi wynikami. Nadaj nazwy poszczególnym elementom, zdefiniuj kryteria sukcesu i odrzuć przypadki częściowego ukończenia pracy bez informacji. Utrzymuj koszty procesu renderowania na niskim poziomie i odkładaj drogie operacje wywodzenia na później, dopiero po przeprowadzeniu pomiarów. Przedwczesne stosowanie mechanizmów memoizacji może ukrywać błędy związane ze starymi danymi.
items.map((item, i) => <Row key={i} />)
items.map(item => <Row key={item.id} />)
Sekcja 9: Lista kontrolna osobistych wyników
Rozdział 9 dotyczący etapu osobistego funkcjonuje najlepiej, gdy traktowany jest jako mierzalna powierzchnia. Zapisz jeden udany przykład, jeden przypadek niepowodzenia oraz notatkę o cofnięciu zmian, zanim rozszerzysz zakres pracy. Zapisuj czasy wykonywania oraz koszt tokenów lub zapytań obok wyników funkcjonalnych. Wczesna widoczność kosztów zapobiega niespodziewanym rachunkom, gdy przechodzi się z środowiska demonstracyjnego do współdzielonych środowisk. Utrzymuj koszty renderowania na niskim poziomie i odkładaj drogie operacje wywodzenia na później, dopiero po ich zmierzeniu. Przedwczesne stosowanie mechanizmów memoizacji może ukrywać błędy związane ze starymi danymi.
Rozdział 10: Duża zmiana sposobu myślenia
Rozdział 10: Scena „The Big” funkcjonuje najlepiej, gdy traktowana jest jako powierzchnia poddawalna pomiarom. Zapisz jeden przykład udanego działania, jeden przypadek awarii oraz notatkę dotyczącą cofnięcia zmian, zanim rozszerzysz zakres pracy. Trzymaj konfigurację poza kodem aplikacji. Pliki środowiskowe, magazyny haseł oraz flagi funkcjonalne powinny znajdować się w jednym miejscu, które operatorzy mogą sprawdzić bez konieczności przeglądania całej struktury. Utrzymuj koszty renderowania na niskim poziomie i odkładaj drogie operacje obliczeniowe na później, dopiero po dokonaniu pomiarów. Przedwczesne stosowanie mechanizmów memoizacji może ukrywać błędy związane ze starymi danymi.
Ostateczne refleksje: prawdziwy sekret
Ostateczne uwagi: etap The Real funkcjonuje najlepiej, gdy traktowany jest jako mierzalna powierzchnia. Zapisz jeden „złoty” zapis działania, jeden przypadek awarii oraz notatkę dotyczącą cofnięcia zmian, zanim rozszerzysz zakres. Zdokumentuj zarówno prawidłowy przebieg działania, jak i ścieżkę przywracania do stanu poprzedniego. Próby ponownych działań, kontrolne punkty ludzkie oraz obsługa wiadomości nieprzyjętych stanowią część produktu, a nie elementy dodawane później. Utrzymuj koszty renderowania na niskim poziomie i odkładaj drogie operacje wywodzenia na później, tylko po dokonaniu pomiarów. Przedwczesne stosowanie mechanizmów memoizacji może ukrywać błędy związane ze starymi danymi. Ostateczne uwagi: etap The Real funkcjonuje najlepiej, gdy traktowany jest jako mierzalna powierzchnia. Zapisz jeden „złoty” zapis działania, jeden przypadek awarii oraz notatkę dotyczącą cofnięcia zmian, zanim rozszerzysz zakres. Traktuj ten etap jako umowę pomiędzy danymi wejściowymi a zweryfikowanymi wynikami. Nadaj nazwy poszczególnym elementom, zdefiniuj kryteria sukcesu i odrzucaj ciche, częściowe ukończenie zadań.
Wydajność i optymalizacja w React
W fazie optymalizacji wydajności React należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić ten krok na podstawie znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu.
Hooki w React i zarządzanie stanem
Wzory i architektura w React
Rozwijanie aplikacji w React w praktyce
Ekosystem i narzędzia React
Ścieżka nauki React (początkujący → zaawansowani)
Bезpieczeństwo i skalowanie aplikacji React
Interwjuje z React i kariera
Najnowsze aktualizacje React
Jeszcze jedna rzecz, która może cię zaskoczyć
Rozwijanie aplikacji w React przy użyciu AI
Listwa kontrolna operacyjna
Powiązane materiały
- Praktyczne notatki: Developerzy TypeScript używają Zod w niepoprawny sposób. To nie jest tylko — Szczegółowy przewodnik po Praktycznych notatkach: Developerzy TypeScript używają Zod w niepoprawny sposób. To nie jest tylko: kontrakty, sprawdzania oraz gotowe elementy kodu dla zespołów wdrażających ten wzorzec.
- Praktyczne notatki: React 19 wdrożony przed dziewięcioma miesiącami. Większość zespołów nadal pisze — Szczegółowy przewodnik po Praktycznych notatkach: React 19 wdrożony przed dziewięcioma miesiącami. Większość zespołów nadal pisze: kontrakty, sprawdzania oraz gotowe elementy kodu dla zespołów wdrażających ten wzorzec.