Andei pensando e me confundi com o roteamento entre Cliente e Servidor. Suponha que eu use ReactJS para renderização do lado do servidor antes de enviar a solicitação de volta ao navegador da web, e use o react-router como um roteamento do lado do cliente para alternar entre as páginas sem atualizar como SPA.
O que vem à mente é:
- Como as rotas são interpretadas? Por exemplo, uma solicitação da página inicial (
/home
) para a página de postagens (/posts
) - Para onde vai o roteamento, no lado do servidor ou no cliente?
- Como sabe como é processado?
javascript
reactjs
routes
react-router
url-routing
Heartmon
fonte
fonte
Respostas:
Note, esta resposta cobre React Router versão 0.13.x - a próxima versão 1.0 parece que terá detalhes de implementação significativamente diferentes
Servidor
Isso é mínimo
server.js
com react-router:Onde o
routes
módulo exporta uma lista de Rotas:Cada vez que uma solicitação é feita ao servidor, você cria uma
Router
instância de uso único configurada com o URL de entrada como seu local estático, que é resolvido na árvore de rotas para configurar as rotas correspondentes adequadas, chamando de volta com o nível superior o manipulador de rotas a ser renderizado e um registro de quais rotas secundárias correspondem em cada nível. Isso é o que é consultado quando você usa o<RouteHandler>
componente dentro de um componente de manipulação de rota para renderizar uma rota secundária que foi correspondida.Se o usuário tiver o JavaScript desativado ou se ele estiver demorando para carregar, todos os links em que ele clicar chegarão ao servidor novamente, o que é resolvido como descrito acima.
Cliente
Isso é mínimo
client.js
com react-router (reutilizando o mesmo módulo de rotas):Quando você chama
Router.run()
, ele cria uma instância de Roteador para você nos bastidores, que é reutilizada toda vez que você navega pelo aplicativo, já que a URL pode ser dinâmica no cliente, ao contrário do servidor onde uma única solicitação tem um URL fixo.Nesse caso, estamos usando o
HistoryLocation
, que usa aHistory
API para garantir que a coisa certa aconteça quando você clicar no botão voltar / avançar. Há também umHashLocation
que altera o URLhash
para fazer entradas de histórico e ouve owindow.onhashchange
evento para acionar a navegação.Quando você usa de reagir-router
<Link>
componente, você dar-lhe umto
suporte que é o nome de uma rota, além de quaisquerparams
equery
de dados das necessidades de rota. O<a>
renderizado por este componente tem umonClick
manipulador que, em última análise, chamarouter.transitionTo()
a instância do roteador com os props que você forneceu ao link, que se parece com isto:Para um link regular, isso acaba chamando
location.push()
qualquer tipo de local que você está usando, que lida com os detalhes de configuração do histórico para que a navegação com os botões voltar e avançar funcione e, em seguida, chama de volta pararouter.handleLocationChange()
para informar ao roteador que pode prosseguir com a transição para o novo caminho de URL.O roteador então chama seu próprio
router.dispatch()
método com a nova URL, que lida com os detalhes de determinar quais das rotas configuradas correspondem à URL, a seguir chama quaisquer ganchos de transição presentes para as rotas correspondentes. Você pode implementar esses ganchos de transição em qualquer um de seus manipuladores de rota para realizar alguma ação quando uma rota estiver prestes a ser navegada ou afastada, com a capacidade de abortar a transição se as coisas não forem do seu agrado.Se a transição não foi abortada, a etapa final é chamar o retorno de chamada que você deu
Router.run()
com o componente manipulador de nível superior e um objeto de estado com todos os detalhes do URL e as rotas correspondentes. O componente manipulador de nível superior é, na verdade, aRouter
própria instância, que lida com a renderização do manipulador de rota superior que foi correspondido.O processo acima é executado novamente sempre que você navegar para um novo URL no cliente.
Projetos de exemplo
fonte
var routes = require('./routes')
É uma lista de rotas? Eu usei o roteador Express, mas este exemplo aqui no SO parece ser o único exemplo de configuração da renderização do lado do servidor com o React Router, então seria bom se fosse um exemplo de código completoreact-router
versão mais recente. Por favor, atualize-o.Com o 1.0, o React-Router depende do módulo de histórico como um peerDependency. Este módulo trata do roteamento no navegador. Por padrão, o React-Router usa a API HTML5 History (
pushState
,replaceState
), mas você pode configurá-lo para usar o roteamento baseado em hash (veja abaixo)O tratamento da rota agora é feito nos bastidores e o ReactRouter envia novos adereços para os manipuladores da rota quando a rota muda. O roteador tem um novo
onUpdate
retorno de chamada prop sempre que uma rota muda, útil para rastreamento de exibição de página ou atualização de<title>
, por exemplo.Cliente (roteamento HTML5)
Cliente (roteamento baseado em hash)
Servidor
No servidor, podemos usar
ReactRouter.match
, isso é retirado do guia de renderização do servidorfonte