Когда вы пишете одностраничное приложение, вы на самом деле не перемещаетесь между разными HTML документами. Вместо этого вы модифицируете DOM, чтобы отображать другие данные.
Этот выглядит как разные страницы, но на самом деле это не так. Это вызвало всевозможные проблемы, потому что кнопка «Назад» в браузере не работала, и у вас не было разных URL-адресов для разных «страниц».
В качестве взлома люди изменили часть идентификатора фрагмента страницы и использовали JavaScript, чтобы определить, какой раздел SPA должен отображаться. В результате он поместит #
в URL-адрес, поэтому у вас не может быть URL-адреса с /about
, но вместо него будет #/about
.
Это то, что делает HashRouter
. Если вы просто сделаете ссылку на #/about
, это сработает.
Производители браузеров отреагировали на это, добавив History API . Это обеспечивает механизмы для вставки URL-адресов в историю браузера и получения всех преимуществ # навигации с красивыми URL-адресами.
Он разработан для использования вместе с серверным кодом, который имеет тот же эффект, что и DOM. манипуляции, которые выполняет JavaScript.
Итак, если вы нажмете ссылку на /about
:
- JavaScript изменит DOM, чтобы отобразить страницу about
- JavaScript изменяет URL-адрес на
/about
но , если вы посещаете /about
напрямую, сервер вместо этого генерирует страницу с информацией.
Это обеспечивает хорошую пищу для поисковых систем и контент, доступный даже в случае отказа JavaScript.
Это также больше работы , поскольку вам нужно заставить сервер дублировать работа клиента. К счастью, есть инструменты, облегчающие эту задачу. Несколько заполненных: далее. js, который использует isomorphi c JavaScript, чтобы клиентский код React запускался на сервере, и Gatsby , который генерирует stati c страниц во время сборки, поэтому вы можете использовать stati c хостинг.
У них есть свои собственные модули маршрутизатора, которые можно использовать вместо HashRouter.
Если вы хотите использовать URL без #
, страницы, которые работают, даже если JavaScript дает сбой, и бонус к SEO: используйте один из этих подходов .
Существует также дешевый и грязный подход к взлому, который заключается в настройке вашего HTTP-сервера для обслуживания базового c HTML документа, который загружает React JS для каждого URL, который не является t a stati c file.
Это делает обязанностью клиентского кода смотреть URL-адрес и определять, какой контент показывать (точно так же, как это делает HashRouter). Это также имеет тенденцию вызывать множество URL-адресов, которые должны быть ошибками 404, чтобы вернуть 200 и этот базовый c HTML документ.
Вы бы отключили HashRouter для BrowserRouter , если бы вы сделали это.