Myślałem i jestem zdezorientowany z routingiem między klientem a serwerem. Załóżmy, że używam ReactJS do renderowania po stronie serwera przed wysłaniem żądania z powrotem do przeglądarki internetowej i używam React-router jako routingu po stronie klienta do przełączania się między stronami bez odświeżania jako SPA.
Przychodzi mi na myśl:
- Jak interpretowane są trasy? Na przykład żądanie ze strony głównej (
/home
) do strony postów (/posts
) - Gdzie przebiega routing, po stronie serwera lub klienta?
- Skąd wie, jak jest przetwarzany?
javascript
reactjs
routes
react-router
url-routing
heartmon
źródło
źródło
Odpowiedzi:
Uwaga, ta odpowiedź dotyczy React Router w wersji 0.13.x - nadchodząca wersja 1.0 wygląda na to, że będzie miała znacznie inne szczegóły implementacji
serwer
To minimum w
server.js
przypadku routera React:Gdzie
routes
moduł eksportuje listę tras:Za każdym razem, gdy do serwera kierowane jest żądanie, tworzysz jednorazową
Router
instancję skonfigurowaną z przychodzącym adresem URL jako jego statyczną lokalizacją, która jest rozpoznawana w drzewie tras w celu skonfigurowania odpowiednich dopasowanych tras, wywołując z powrotem z najwyższym poziomem program obsługi tras, który ma zostać wyrenderowany, oraz rekord, które trasy podrzędne są dopasowane na każdym poziomie. To jest właśnie to, co jest konsultowane podczas używania<RouteHandler>
komponentu w komponencie obsługi tras do renderowania trasy podrzędnej, która została dopasowana.Jeśli użytkownik wyłączył JavaScript lub ładuje się wolno, wszystkie kliknięte przez niego linki ponownie trafią na serwer, co zostanie rozwiązane ponownie, jak powyżej.
Klient
To minimum w
client.js
przypadku react-routera (ponowne użycie tego samego modułu tras):Kiedy dzwonisz
Router.run()
, tworzy dla Ciebie instancję routera za kulisami, która jest ponownie używana za każdym razem, gdy nawigujesz po aplikacji, ponieważ adres URL może być dynamiczny na kliencie, w przeciwieństwie do serwera, na którym pojedyncze żądanie ma stały adres URL.W tym przypadku używamy
HistoryLocation
, który używaHistory
interfejsu API, aby upewnić się, że po naciśnięciu przycisku Wstecz / Dalej dzieje się właściwa rzecz. Istnieje również,HashLocation
który zmienia adres URL,hash
aby tworzyć wpisy historii i nasłuchujewindow.onhashchange
zdarzenia, aby wyzwolić nawigację.Kiedy używasz
<Link>
komponentu react-router , dajesz muto
atrybut, który jest nazwą trasyparams
oraz innymiquery
danymi, których potrzebuje trasa.<a>
Świadczonych przez tego składnika maonClick
obsługi, która ostatecznie wywołujerouter.transitionTo()
na przykład router z rekwizytami dałeś link, który wygląda tak:W przypadku zwykłego łącza ostatecznie wywołuje to
location.push()
dowolny używany typ lokalizacji, który obsługuje szczegóły konfiguracji historii, więc nawigacja za pomocą przycisków Wstecz i Dalej będzie działać, a następnie oddzwoni, abyrouter.handleLocationChange()
router wiedział, że może przejść do przejścia do nowa ścieżka adresu URL.Następnie router wywołuje własną
router.dispatch()
metodę z nowym adresem URL, który obsługuje szczegóły określania, która ze skonfigurowanych tras jest zgodna z adresem URL, a następnie wywołuje wszelkie zaczepy przejścia obecne dla dopasowanych tras. Możesz zaimplementować te haki przejścia na dowolnym z programów obsługi tras, aby podjąć pewne działania, gdy trasa ma być opuszczona lub do której ma być nawigowana, z możliwością przerwania przejścia, jeśli coś Ci się nie podoba.Jeśli przejście nie zostało przerwane, ostatnim krokiem jest wywołanie wywołania zwrotnego, któremu dałeś,
Router.run()
z komponentem obsługi najwyższego poziomu i obiektem stanu ze wszystkimi szczegółami adresu URL i dopasowanych tras. Komponent obsługi najwyższego poziomu jest w rzeczywistościRouter
samą instancją, która obsługuje renderowanie najwyższego poziomu obsługi trasy, który został dopasowany.Powyższy proces jest uruchamiany ponownie za każdym razem, gdy przejdziesz do nowego adresu URL na kliencie.
Przykładowe projekty
źródło
var routes = require('./routes')
Czy jest to lista tras? Użyłem routera Express, ale ten przykład tutaj na SO wydaje się być jedynym przykładem konfiguracji renderowania po stronie serwera za pomocą React Router, więc byłoby dobrze, gdyby był to pełny przykład kodureact-router
wersji. Zaktualizuj go.W wersji 1.0, React-Router jest zależny od modułu historii jako peerDependency. Ten moduł zajmuje się routingiem w przeglądarce. Domyślnie React-Router używa API historii HTML5 (
pushState
,replaceState
), ale możesz go skonfigurować tak, aby używał routingu opartego na hashach (patrz poniżej)Obsługa tras odbywa się teraz za kulisami, a ReactRouter wysyła nowe właściwości do programów obsługi tras, gdy trasa się zmienia. Router ma nowe
onUpdate
wywołanie zwrotne właściwości<title>
za każdym razem, gdy zmienia się trasa, przydatne na przykład do śledzenia odsłon lub aktualizacji .Klient (routing HTML5)
Klient (routing na podstawie skrótu)
serwer
Na serwerze możemy użyć
ReactRouter.match
, jest to pobierane z przewodnika renderowania serweraźródło