He estado pensando y estoy confundido con el enrutamiento entre Cliente y Servidor. Supongamos que uso ReactJS para la representación del lado del servidor antes de enviar la solicitud al navegador web, y uso react-router como un enrutamiento del lado del cliente para cambiar entre páginas sin actualizar como SPA.
Lo que me viene a la mente es:
- ¿Cómo se interpretan las rutas? Por ejemplo, una solicitud de la página de inicio (
/home
) a la página de publicaciones (/posts
) - ¿A dónde va el enrutamiento, en el lado del servidor o en el cliente?
- ¿Cómo sabe cómo se procesa?
javascript
reactjs
routes
react-router
url-routing
corazon
fuente
fuente
Respuestas:
Tenga en cuenta que esta respuesta cubre React Router versión 0.13.x: la próxima versión 1.0 parece que tendrá detalles de implementación significativamente diferentes
Servidor
Este es un mínimo
server.js
con react-router:Donde el
routes
módulo exporta una lista de Rutas:Cada vez que se realiza una solicitud al servidor, crea una
Router
instancia de un solo uso configurada con la URL entrante como su ubicación estática, que se resuelve contra el árbol de rutas para configurar las rutas coincidentes adecuadas, llamando con el nivel superior controlador de ruta que se va a representar y un registro de las rutas secundarias que coinciden en cada nivel. Esto es lo que se consulta cuando usa el<RouteHandler>
componente dentro de un componente de manejo de ruta para representar una ruta secundaria que coincidió.Si el usuario tiene JavaScript desactivado, o si se carga con lentitud, cualquier enlace en el que haga clic llegará al servidor nuevamente, lo que se resuelve nuevamente como se indicó anteriormente.
Cliente
Este es un mínimo
client.js
con react-router (reutilizando el mismo módulo de rutas):Cuando llama
Router.run()
, crea una instancia de enrutador detrás de escena, que se reutiliza cada vez que navega por la aplicación, ya que la URL puede ser dinámica en el cliente, a diferencia de en el servidor donde una sola solicitud tiene un URL fija.En este caso, estamos usando
HistoryLocation
, que usa laHistory
API para asegurarse de que suceda lo correcto cuando presiona el botón Atrás / Adelante. También hay unaHashLocation
que cambia la URLhash
para realizar entradas en el historial y escucha elwindow.onhashchange
evento para activar la navegación.Cuando se utiliza de reaccionar-enrutador
<Link>
componente, que le dan unto
puntal que es el nombre de una ruta, además de cualquierparams
yquery
de datos de las necesidades de ruta. El<a>
renderizado por este componente tiene unonClick
controlador que finalmente llamarouter.transitionTo()
a la instancia del enrutador con los accesorios que le dio al enlace, que se ve así:Para un enlace regular, esto finalmente llama
location.push()
al tipo de ubicación que esté utilizando, que maneja los detalles de la configuración del historial, por lo que la navegación con los botones de retroceso y avance funcionará, luego vuelve a llamarrouter.handleLocationChange()
para informar al enrutador que puede continuar con la transición a la nueva ruta de URL.Luego, el enrutador llama a su propio
router.dispatch()
método con la nueva URL, que maneja los detalles para determinar cuál de las rutas configuradas coincide con la URL, luego llama a cualquier enlace de transición presente para las rutas coincidentes. Puede implementar estos ganchos de transición en cualquiera de sus controladores de ruta para tomar alguna acción cuando una ruta esté a punto de ser navegada o alejada de ella, con la capacidad de abortar la transición si las cosas no son de su agrado.Si la transición no se canceló, el paso final es llamar a la devolución de llamada que le dio
Router.run()
con el componente de controlador de nivel superior y un objeto de estado con todos los detalles de la URL y las rutas coincidentes. El componente de controlador de nivel superior es en realidad laRouter
instancia en sí, que maneja la representación del controlador de ruta más alto que se emparejó.El proceso anterior se vuelve a ejecutar cada vez que navega a una nueva URL en el cliente.
Proyectos de ejemplo
fuente
var routes = require('./routes')
de rutas? ¿Es una lista de rutas? He usado el enrutador Express, pero este ejemplo aquí en SO parece ser el único ejemplo de configuración de la representación del lado del servidor con React Router, por lo que sería bueno si fuera un ejemplo de código completoreact-router
versión más reciente. Actualícelo.Con 1.0, React-Router depende del módulo de historial como peerDependency. Este módulo trata sobre el enrutamiento en el navegador. De forma predeterminada, React-Router usa la API de historial HTML5 (
pushState
,replaceState
), pero puede configurarla para usar enrutamiento basado en hash (ver más abajo)El manejo de la ruta ahora se realiza detrás de escena, y ReactRouter envía nuevos accesorios a los controladores de ruta cuando la ruta cambia. El enrutador tiene una nueva
onUpdate
devolución de llamada de apoyo cada vez que cambia una ruta, útil para el seguimiento de páginas vistas o para actualizar<title>
, por ejemplo.Cliente (enrutamiento HTML5)
Cliente (enrutamiento basado en hash)
Servidor
En el servidor, podemos usar
ReactRouter.match
, esto se toma de la guía de renderización del servidorfuente