BrowserHistory vs HashHistory

ОБНОВЛЕНИЕ 2018: в учебнике хорошая теория, но ему уже два года. Проверяйте версии пакетов. За выходом нового учебника можно следить в telegram каналеarrow-up-right или twitterarrow-up-right

На каналеarrow-up-right так же проводятся бесплатные вебинары, публикуются переводы и авторские материалы, присоединяйтесьarrow-up-right!

BrowserHistory vs HashHistory

(глава для расширения кругозора)

До текущего времени мы использовали browserHistory (смотри src/index.js).

Можно использовать и hashHistory. Замените в src/index.js все вхождения browserHistory на hashHistory, откройте снова localhost:3000, видите в адресе #? Покликайте по ссылкам.

hash history

"Мусор" в адресе используется так сказать, для того чтобы приблизиться к нативному поведению браузера. Что-то вроде уникального ключа. (дословно здесьarrow-up-right (EN)).

Спрашивается, зачем нам hashHistory ? Ответ простой - если использовать hashHistory, придется меньше телодвижений делать для настройки роутинга на сервере. Давайте вернемся к browserHistory, а так же добавим компонент <NotFound />.

src/components/NotFound.js

Добавим <NotFound /> в список роутов:

Попробуйте открыть http://localhost:3000/genrepewpewpewarrow-up-right

correct not found

А теперь - http://localhost:3000/genrepewpewpew/anotherpagearrow-up-right

incorrect nof found

Почему? Зайдите на вкладку Network и проверьте, что отдает сервер внутри bundle.js

Корректный bundle.js для http://localhost:3000/genrepewpewpewarrow-up-right

correct bundle IMG

Некорректный bundle.js для http://localhost:3000/genrepewpewpew/anotherpagearrow-up-right

incorrect bundle IMG

Как думаете, в чем проблема?

Ответ кроется во фразе: "нам придется меньше телодвижений делать для настройки роутинга на сервере". Посмотрите сами

server.js

Переведем написанное: на все запросы отдавай index.html. Код index.html предельно прост:

index.html

Тем не менее, здесь допущена ошибка! Используется относительный путь для файла bundle.js, снова посмотрим в консоль хрома:

incorrect bundle path screen

К счастью, такую ошибку легко исправить, и мы по прежнему можем лицезреть красивый вид адресов, используя browserHistory.

index.html

Не забудьте перезапустить webpack, так как index.html не находится под наблюдением для пересборки.

Проверьте куда уходит запрос для bundle.js сейчас и убедитесь, что путь верен. Убедитесь, что в случае неправильного адреса показывается компонент <NotFound />

correct bundle path screen

Альтернативное мнениеarrow-up-right James K Nelson'a: не нужно использовать pushState (а следовательно browserHistory).

P.S. James предлагаетarrow-up-right вообще не использовать react-router, но нам же нужно что-то разбирать в этом туториале ;)

Итого: browserHistory требует большей поддержки на сервере, но url-адрес выглядит симпатичнее.

Исходный кодarrow-up-right на данный момент.

Last updated