Я думал, и меня смущает маршрутизация между клиентом и сервером. Предположим, я использую ReactJS для рендеринга на стороне сервера перед отправкой запроса обратно в веб-браузер и использую response-router в качестве маршрутизации на стороне клиента для переключения между страницами без обновления как SPA.
На ум приходит:
- Как трактуются маршруты? Например, запрос с домашней страницы (
/home
) на страницу сообщений (/posts
) - Куда идет маршрутизация, на стороне сервера или на стороне клиента?
- Как он узнает, как обрабатывается?
javascript
reactjs
routes
react-router
url-routing
Heartmon
источник
источник
Ответы:
Обратите внимание, что этот ответ касается React Router версии 0.13.x - похоже, что в грядущей версии 1.0 будут значительно отличаться детали реализации.
Сервер
Это минимум
server.js
с реактивным маршрутизатором:Где
routes
модуль экспортирует список маршрутов:Каждый раз, когда делается запрос к серверу, вы создаете одноразовый
Router
экземпляр, настроенный с входящим URL-адресом в качестве статического местоположения, которое разрешается в дереве маршрутов для настройки соответствующих сопоставленных маршрутов, вызывая ответ с помощью верхнего уровня обработчик маршрута, который необходимо отобразить, и запись о том, какие дочерние маршруты совпадают на каждом уровне. Это то, к чему вы обращаетесь при использовании<RouteHandler>
компонент в компоненте обработки маршрута для визуализации дочернего маршрута, который был сопоставлен.Если у пользователя отключен JavaScript или он медленно загружается, любые ссылки, по которым он нажимает, снова попадут на сервер, что снова разрешится, как указано выше.
Клиент
Это минимум
client.js
с реактивным маршрутизатором (повторное использование того же модуля маршрутов):Когда ты звонишь
Router.run()
, он создает для вас за кулисами экземпляр Router, который повторно используется каждый раз, когда вы перемещаетесь по приложению, поскольку URL-адрес может быть динамическим на клиенте, в отличие от сервера, где один запрос имеет фиксированный URL.В этом случае мы используем
HistoryLocation
, который используетHistory
API, чтобы убедиться, что все происходит правильно, когда вы нажимаете кнопку назад / вперед. Также есть,HashLocation
который изменяет URL-адресhash
для создания записей в истории и прослушиваетwindow.onhashchange
событие для запуска навигации.Когда вы используете
<Link>
компонент response-router , вы даете емуto
опору, которая представляет собой имя маршрута, а также любые данныеparams
иquery
данные, необходимые для маршрута.<a>
Оказываемое этот компонент имеетonClick
обработчик , который в конечном счете вызываетrouter.transitionTo()
на экземпляре маршрутизатора с реквизитом вы дали ссылку, которая выглядит следующим образом :Для обычной ссылки это в конечном итоге вызывает
location.push()
любой тип местоположения, который вы используете, который обрабатывает детали настройки истории, поэтому навигация с помощью кнопок назад и вперед будет работать, а затем обратный вызов,router.handleLocationChange()
чтобы сообщить маршрутизатору, что он может перейти к новый путь URL.Затем маршрутизатор вызывает свой собственный
router.dispatch()
метод с новым URL-адресом, который обрабатывает детали определения того, какой из настроенных маршрутов соответствует URL-адресу, а затем вызывает любые перехватчики перехода. имеющиеся для сопоставленных маршрутов. Вы можете реализовать эти перехватчики перехода на любом из ваших обработчиков маршрутов, чтобы предпринять некоторые действия, когда маршрут должен быть отклонен от маршрута или перемещен к нему, с возможностью прервать переход, если вам что-то не нравится.Если переход не был прерван, последний шаг - вызвать обратный вызов, который вы передали
Router.run()
с помощью компонента обработчика верхнего уровня и объекта состояния со всеми подробностями URL-адреса и согласованных маршрутов. Компонент обработчика верхнего уровня на самом деле являетсяRouter
самим экземпляром, который обрабатывает отображение самого верхнего обработчика маршрута, который был сопоставлен.Вышеупомянутый процесс повторно запускается каждый раз, когда вы переходите к новому URL-адресу на клиенте.
Примеры проектов
источник
var routes = require('./routes')
Это список маршрутов? Я использовал маршрутизатор Express, но этот пример здесь, на SO, кажется, единственный пример настройки рендеринга на стороне сервера с помощью React Router, поэтому было бы хорошо, если бы это был пример полного кодаreact-router
версии. Пожалуйста, обновите его.В версии 1.0 React-Router зависит от модуля истории как от peerDependency. Этот модуль занимается маршрутизацией в браузере. По умолчанию React-Router использует API истории HTML5 (
pushState
,replaceState
), но вы можете настроить его для использования маршрутизации на основе хеша (см. Ниже)Обработка маршрута теперь выполняется за кулисами, и ReactRouter отправляет новые свойства обработчикам маршрутов при изменении маршрута. Маршрутизатор имеет новую
onUpdate
функцию обратного вызова при изменении маршрута, полезную для отслеживания просмотров страниц или обновления<title>
, например.Клиент (маршрутизация HTML5)
Клиент (маршрутизация на основе хеша)
Сервер
На сервере мы можем использовать
ReactRouter.match
, это взято из руководства по рендерингу сервераисточник