Strumieniowanie w React 18: jak działa renderToPipeableStream
Poznają Państwo sposób, w jaki renderToPipeableStream stopniowo wysyła fragmenty HTML, zanim wszystkie dane asynchroniczne zostaną rozwiązane.
Strumieniowanie w React 18: jak działa renderToPipeableStream 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.
Przed React 18: synchroniczne wąskie gardło
Przed React 18 renderowanie po stronie serwera korzystało z renderToString, które działa synchronicznie: React renderuje całe drzewo komponentów do postaci ciągu znaków, zanim wyśle jakikolwiek kod HTML do przeglądarki. Jeśli którykolwiek komponent ładuje dane, serwer musi czekać na wszystkie dane, zanim pierwszy bajt dotrze do użytkownika.
React 18: renderToPipeableStream
React 18 wprowadził renderToPipeableStream, który renderuje drzewo komponentów jako strumień fragmentów HTML. Zamiast czekać na przygotowanie całości, React wysyła HTML w miarę ukończenia poszczególnych części drzewa, dzięki czemu przeglądarka może natychmiast rozpocząć renderowanie widocznej zawartości.
Anatomia: pipe i abort
renderToPipeableStream zwraca obiekt z dwiema metodami: pipe(writable) i abort(). Metoda pipe przyjmuje strumień zapisywalny Node.js (zwykle odpowiedź HTTP) i rozpoczyna strumieniowe przesyłanie do niego kodu HTML. Metoda abort() anuluje strumień; używa się jej po anulowaniu żądania lub przekroczeniu limitu czasu.
Co jest przesyłane jako pierwsze: shell
Strumień rozpoczyna się od powłoki HTML — całej zawartości, której nie blokuje oczekująca granica Suspense. Obejmuje ona sekcję head dokumentu, nawigację, stopkę, elementy układu oraz wszelką zawartość dostępną synchronicznie. Shell jest przesyłany natychmiast, zanim komponenty zależne od danych zostaną rozstrzygnięte.
Wartości zastępcze Suspense w strumieniu
Komponenty znajdujące się wewnątrz granic Suspense i oczekujące na dane są początkowo przesyłane jako ich zastępczy interfejs użytkownika (np. wskaźnik ładowania). React wysyła później tag skryptu, który zastępuje wartość zastępczą rozstrzygniętą zawartością — wszystko to bez ponownego renderowania shellu po stronie klienta.
bootstrapScripts na potrzeby hydracji po stronie klienta
Przekazanie bootstrapScripts: ['/static/js/client.js'] do renderToPipeableStream informuje React, aby wstawił tag skryptu na końcu strumienia. Przeglądarka ładuje ten bundle i wywołuje hydrateRoot, dołączając handlery zdarzeń Reacta do DOM wyrenderowanego przez serwer.
onShellReady: właściwy moment na wywołanie pipe
onShellReady jest wywoływany, gdy shell HTML (wszystko poza oczekującymi granicami Suspense) jest gotowy do wysłania. To właściwy moment na wywołanie pipe(res) — należy jednak pamiętać, aby przed wywołaniem pipe ustawić kod statusu HTTP i nagłówki odpowiedzi, ponieważ strumieniowanie utrwala status HTTP.
Ustawianie nagłówków przed rozpoczęciem strumieniowania
Ponieważ strumieniowanie rozpoczyna się natychmiast po wywołaniu pipe(), wszystkie przypisania do res.setHeader lub res.statusCode muszą nastąpić przed wywołaniem pipe. Często stosowany wzorzec polega na ustawieniu statusu 200 i Content-Type: text/html w wywołaniu zwrotnym onShellReady, a następnie natychmiastowym wywołaniu pipe(res).
onShellError: Błędy krytyczne przed ukończeniem renderowania powłoki
onShellError jest wywoływane, gdy przed ukończeniem renderowania powłoki wystąpi nieodwracalny błąd — na przykład gdy komponent najwyższego poziomu zgłosi wyjątek poza granicami Suspense. W takiej sytuacji nie można strumieniować częściowej odpowiedzi; zamiast tego należy przekierować użytkownika na stronę błędu lub wysłać statyczny dokument HTML z błędem.
onAllReady: Dla botów i robotów indeksujących
onAllReady jest wywoływane, gdy w całym drzewie Reacta zakończy się rozwiązywanie danych — w tym we wszystkich granicach Suspense. W przypadku robotów indeksujących wyszukiwarek i narzędzi generujących podglądy linków w mediach społecznościowych należy wysłać kompletny dokument HTML bez strumieniowania. Należy sprawdzić, czy żądanie pochodzi od bota, i wywołać pipe(res) w onAllReady zamiast w onShellReady.
Odzyskiwanie po błędach podczas strumieniowania
onError jest wywoływane w przypadku błędów w granicach Suspense — React może nadal strumieniować pozostałą część strony, podczas gdy ta granica przechodzi do swojego interfejsu błędu. Należy użyć onError do zarejestrowania błędu w potoku observability bez przerywania strumienia dla użytkownika.
onAllReady a onShellReady
Kiedy należy użyć onAllReady zamiast onShellReady, aby rozpocząć strumieniowanie za pomocą pipe?
Podsumowanie lekcji
renderToPipeableStream to mechanizm strumieniowego SSR w React 18 przeznaczony dla serwerów Node.js. Strumieniuje powłokę HTML natychmiast za pomocą onShellReady, uzupełnia granice Suspense w miarę rozwiązywania danych i nawodnia klienta za pomocą bootstrapScripts. Należy używać onAllReady w przypadku botów i robotów indeksujących, onShellError w przypadku krytycznych awarii oraz zawsze ustawiać nagłówki HTTP przed wywołaniem pipe().
Często zadawane pytania
Czy lekcja „Strumieniowanie w React 18: jak działa renderToPipeableStream” jest bezpłatna?
Tak — pełny tekst „Strumieniowanie w React 18: jak działa renderToPipeableStream” 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 „Strumieniowanie w React 18: jak działa renderToPipeableStream”?
Poznają Państwo sposób, w jaki renderToPipeableStream stopniowo wysyła fragmenty HTML, zanim wszystkie dane asynchroniczne zostaną rozwiązane. Ć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 „Strumieniowanie w React 18: jak działa renderToPipeableStream”?
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
- Strumieniowanie w React 18: jak działa renderToPipeableStream
- Granice Suspense i priorytet strumieniowania
- Progresywna hydratacja z selektywną hydratacją
- Pomiar wpływu strumieniowania: FCP, TTI i LCP