Переглядаючи коментарі до прийнятої відповіді та загальний характер цього питання ("не працюю"), я подумав, що це може бути хорошим місцем для деяких загальних роз'яснень щодо проблем, які тут пов'язані. Отже, ця відповідь призначена як довідкова інформація / розробка конкретного випадку використання ОП. Будь ласка, нехай зі мною.
Сторона сервера проти клієнта
Перше велике, що потрібно зрозуміти з цього приводу, це те, що зараз є 2 місця, де інтерпретується URL, тоді як раніше було «1». У минулому, коли життя було простим, якийсь користувач надсилав запит наhttp://example.com/about
на сервер, який перевіряв частину шляху URL-адреси, визначав, що користувач запитує сторінку про сторінку, а потім повертає її назад.
З маршрутизацією на стороні клієнта, що і надає React-Router, все є менш простим. Спочатку клієнт ще не завантажив код JS. Тож найперший запит завжди буде до сервера. Після цього повернеться сторінка, що містить необхідні теги скриптів для завантаження React і React Router тощо. Тільки тоді, коли ці сценарії завантажуються, починається етап 2. На другому етапі, коли користувач, наприклад, натискає на навігаційне посилання "Про нас", URL-адреса локально змінюється на http://example.com/about
(що стає можливим за допомогою API історії) ), але запит на сервер не робиться. Натомість маршрутизатор React робить свою справу на стороні клієнта, визначає, який перегляд React відобразити, і відобразить його. Якщо припустити, що на вашій сторінці про інформацію не потрібно телефонувати REST, це вже зроблено. Ви перейшли з дому до нас про нас без жодного запиту сервера.
Отже, коли ви натискаєте посилання, деякі запуски Javascript, що маніпулює URL-адресою в адресному рядку, не викликаючи оновлення сторінки , що, в свою чергу, змушує React Router здійснити перехід сторінки на стороні клієнта .
Але тепер подумайте, що станеться, якщо скопіювати та вставити URL-адресу в адресний рядок та надіслати електронною поштою другові. Ваш друг ще не завантажив ваш веб-сайт. Іншими словами, вона все ще перебуває у фазі 1 . На її машині поки не працює маршрутизатор React. Тож її браузер зробить серверний запит наhttp://example.com/about
.
І ось тут починаються ваші неприємності. До цих пір ви могли втекти, просто розмістивши статичний HTML у веб-корі свого сервера. Але це призведе до 404
помилок у всіх інших URL-адресах, коли запитується від сервера . Ці ж URL-адреси добре працюють на стороні клієнта , оскільки там React Router робить маршрутизацію для вас, але вони не працюють на стороні сервера, якщо ви не змусите їх ваш сервер їх зрозуміти.
Поєднання маршрутизації на стороні сервера та клієнта
Якщо ви хочете, щоб http://example.com/about
URL працював як на сервері, так і на стороні клієнта, вам потрібно встановити маршрути для нього як на сервері, так і на стороні клієнта. Має сенс правильно?
І саме тут починається ваш вибір. Рішення варіюються від повного обходу проблеми, через загальний маршрут, який повертає завантажувальний HTML, до повного ізоморфного підходу, де і сервер, і клієнт виконують один і той же код JS.
.
Обхід проблеми взагалі: Історія хешу
Якщо історія хешу замість історії веб-переглядачів ваша URL-адреса сторінки про сторінку виглядатиме приблизно так:
http://example.com/#/about
Частина після #
символу хеш ( ) не надсилається на сервер. Тож сервер бачить http://example.com/
і відправляє сторінку з індексом як очікувалося. React-Router підбере #/about
частину і покаже правильну сторінку.
Недоліки :
- 'потворні' URL-адреси
- За допомогою цього підходу серверна візуалізація неможлива. Що стосується оптимізації пошукових систем (SEO), ваш веб-сайт складається з однієї сторінки, на якій майже немає вмісту.
.
Ловити все
При такому підході ви використовуєте історію браузера, а просто налаштувати улов-все на сервері , який посилає /*
вindex.html
, фактично даючи вам багато таку ж ситуацію , як з історією Hash. Однак у вас є чисті URL-адреси, і ви можете вдосконалити цю схему пізніше, не скасовуючи всіх своїх улюблених користувачів.
Недоліки :
- Складніше налаштувати
- Все ще немає хорошого SEO
.
Гібридний
У гібридному підході ви розширюєте сценарій загального доступу, додаючи конкретні сценарії для конкретних маршрутів. Ви можете зробити декілька простих скриптів PHP, щоб повернути найважливіші сторінки вашого сайту із вмістом, що міститься, щоб Googlebot міг принаймні побачити, що на вашій сторінці.
Недоліки :
- Ще складніше налаштувати
- Тільки гарне SEO для тих маршрутів, яким ви надаєте спеціальне лікування
- Дублювання коду для візуалізації вмісту на сервері та клієнті
.
Ізоморфний
Що робити, якщо ми використовуємо Node JS як наш сервер, щоб ми могли запустити один і той же JS-код на обох кінцях? Тепер у нас всі маршрути визначені в одній конфігурації маршрутизатора, і нам не потрібно дублювати наш код візуалізації. Це, так би мовити, «святий грааль». Сервер надсилає точно таку ж розмітку, як і в кінцевому підсумку, якби перехід сторінки відбувся у клієнта. Це рішення є оптимальним з точки зору SEO.
Недоліки :
- Сервер повинен (вміти) запускати JS. Я експериментував з Java icw Nashorn, але це не працює для мене. На практиці це здебільшого означає, що ви повинні використовувати сервер на базі вузла JS.
- Багато складних екологічних проблем (використання
window
на сервері тощо)
- Крута крива навчання
.
Який я повинен використовувати?
Виберіть той, з яким ви можете піти. Особисто я вважаю, що все-таки досить просто, щоб встановити, що було б моїм мінімумом. Ця настройка дозволяє вдосконалюватись із часом. Якщо ви вже використовуєте Node JS як свою серверну платформу, я безумовно досліджую, як зробити ізоморфний додаток. Так, спочатку важко, але, як тільки ви отримаєте висіти, це насправді дуже елегантне рішення проблеми.
Отже, в основному, для мене це було б вирішальним фактором. Якщо мій сервер працює на Node JS, я б пішов ізоморфним; інакше я б пішов на рішення Catch-all і просто розширив би його (гібридне рішення) у міру просування часу та вимог SEO.
Якщо ви хочете дізнатися більше про ізоморфне (також його "універсальне") візуалізація за допомогою React, є кілька хороших навчальних посібників з цього питання:
Також, щоб розпочати роботу, рекомендую переглянути кілька початкових наборів. Виберіть той варіант, який відповідає вашому вибору для стека технологій (пам’ятайте, React - це лише V в MVC, вам потрібно більше речей, щоб створити повний додаток). Почніть з розгляду того, який опублікував сам Facebook:
Або виберіть одну із багатьох громадою. Зараз є приємний сайт, який намагається проіндексувати їх усіх:
Я почав з таких:
В даний час я використовую домашню версію універсальної візуалізації, яка була натхненна двома наборами для початку, але вони застаріли.
Успіхів у ваших квестах!