Jedną z największych zalet React.js ma być renderowanie po stronie serwera . Problem polega na tym, że funkcja klucza React.renderComponentToString()
jest synchroniczna, co uniemożliwia ładowanie jakichkolwiek danych asynchronicznych, gdy hierarchia komponentów jest renderowana na serwerze.
Powiedzmy, że mam uniwersalny komponent do komentowania, który mogę umieścić w dowolnym miejscu na stronie. Ma tylko jedną właściwość, jakiś identyfikator (np. Id artykułu, pod którym umieszczane są komentarze), a całą resztą zajmuje się sam komponent (ładowanie, dodawanie, zarządzanie komentarzami).
Bardzo podoba mi się architektura Flux, ponieważ znacznie ułatwia wiele rzeczy, a jej sklepy są idealne do udostępniania stanu między serwerem a klientem. Po zainicjowaniu mojego sklepu zawierającego komentarze mogę go po prostu serializować i wysłać z serwera do klienta, gdzie można go łatwo przywrócić.
Pytanie brzmi, jak najlepiej zapełnić mój sklep. W ciągu ostatnich dni dużo googlowałem i natknąłem się na kilka strategii, z których żadna nie wydawała się naprawdę dobra, biorąc pod uwagę, jak bardzo ta funkcja React jest „promowana”.
Moim zdaniem najprostszym sposobem jest wypełnienie wszystkich moich sklepów przed rozpoczęciem właściwego renderowania. Oznacza to, że znajduje się poza hierarchią komponentów (na przykład podłączony do mojego routera). Problem z tym podejściem polega na tym, że musiałbym prawie dwukrotnie zdefiniować strukturę strony. Rozważ bardziej złożoną stronę, na przykład stronę bloga z wieloma różnymi składnikami (rzeczywisty post na blogu, komentarze, pokrewne posty, najnowsze posty, strumień na Twitterze ...). Musiałbym zaprojektować strukturę strony za pomocą komponentów Reacta, a następnie gdzie indziej musiałbym zdefiniować proces zapełniania każdego wymaganego sklepu dla tej bieżącej strony. Nie wydaje mi się to miłym rozwiązaniem. Niestety większość samouczków izomorficznych jest zaprojektowana w ten sposób (na przykład ten wspaniały samouczek dotyczący flux ).
React-async . To podejście jest doskonałe. Pozwala mi to po prostu zdefiniować w specjalnej funkcji w każdym komponencie, jak zainicjować stan (nie ma znaczenia, czy synchronicznie czy asynchronicznie), a te funkcje są wywoływane, gdy hierarchia jest renderowana do HTML. Działa w taki sposób, że składnik nie jest renderowany, dopóki stan nie zostanie całkowicie zainicjowany. Problem w tym, że wymaga włókienczyli, o ile rozumiem, rozszerzenie Node.js, które zmienia standardowe zachowanie JavaScript. Chociaż bardzo mi się podoba wynik, nadal wydaje mi się, że zamiast znaleźć rozwiązanie, zmieniliśmy zasady gry. I myślę, że nie powinniśmy być do tego zmuszani, aby korzystać z tej podstawowej funkcji React.js. Nie jestem też pewien ogólnego wsparcia tego rozwiązania. Czy można używać Fibre na standardowym serwerze WWW Node.js?
Myślałem trochę sam. Tak naprawdę nie zastanawiałem się nad szczegółami implementacji, ale ogólna idea jest taka, że powinienem rozszerzyć komponenty w podobny sposób jak React-async, a następnie wielokrotnie wywoływać React.renderComponentToString () na komponencie głównym. Podczas każdego przejazdu zbierałem przedłużające się callbacki, a następnie dzwoniłem do nich na końcu przepustki, aby zapełnić sklepy. Powtarzałbym ten krok, aż wszystkie magazyny wymagane przez aktualną hierarchię komponentów zostałyby wypełnione. Jest wiele rzeczy do rozwiązania i jestem szczególnie niepewny co do wydajności.
Przegapiłem coś? Czy jest inne podejście / rozwiązanie? W tej chwili myślę o przejściu na drogę reagowania asynchronicznego / włókien, ale nie jestem tego do końca pewien, jak wyjaśniono w drugim punkcie.
Powiązana dyskusja na GitHub . Najwyraźniej nie ma oficjalnego podejścia ani nawet rozwiązania. Może prawdziwe pytanie brzmi, jak mają być używane komponenty React. Na przykład prosta warstwa widoku (w zasadzie moja sugestia numer jeden) czy prawdziwie niezależne i samodzielne komponenty?