Подтвердить что ты не робот

Как заставить работу маршрутизатора работать со статическими активами, html5 режиме, API истории и вложенными маршрутами?

Мне казалось, что я начинаю понимать React Router, но я ударил новую стену, добавляя библиотеку, которая загружает css для своих компонентов. Все работает отлично, когда перемещается из моего дома, на страницу, содержащую компонент, но когда я его обновляю, URL-адреса шрифтов сломаны...

Я нашел здесь указатель и здесь, но пока не повезло. Это распространенная проблема? Как обойти это?

Я использую сервер webpack dev с конфигурацией по умолчанию, созданной yoman scaffolder.

Библиотека, которую я использую, React Fa для отображения значков.

Когда я загружаю свое приложение на http://localhost:8000/, все отображается нормально, затем я перехожу к http://localhost:8000/customer/ABCD1234/chat, и мои значки в порядке. Шрифт был загружен должным образом.

Затем я обновляю страницу, и я вижу в консоли:

DOMLazyTree.js? 019b: 56 GET http://localhost:8000/customer/ABCD1234/assets/926c93d201fe51c8f351e858468980c3.woff2

Что явно нарушено, потому что часть клиента не должна быть здесь...

Вот мой маршрутизатор:

ReactDOM.render(
  <Router history={browserHistory}>
    <Route path='/' component={App}>
      <IndexRoute component={Index}/>
      <Route path='customer/:id'        component={Customer}    />
      <Route path='customer/:id/chat'   component={CustomerChat}/>
      <Route path="*"                   component={ NotFound }  />
    </Route>
  </Router>
, document.getElementById('support-app'));

Я также попытался добавить <base href="/"/> в свой index.html, но я получаю красивое предупреждение в красном на консоли, поэтому, возможно, не лучшая идея:

Предупреждение. Автоматическая установка базового имени с помощью устарел и будет удален в следующем крупном выпуске. семантика тонко отличается от базового. пожалуйста передайте базовое имя явно в параметрах createHistory

4b9b3361

Ответ 1

Похоже, вы определили относительные пути к вашим активам и значкам в вашем CSS.

background-image: url('assets/image/myicon.png')

попробуйте абсолютный путь:

background-image: url('/assets/image/myicon.png')

Поскольку приложения React - одностраничные приложения, и вы вводите свое приложение на /, все URL-адреса будут работать нормально, независимо от того, на какую страницу вы переходите, поскольку они относятся к корню, в котором вы начали.

Но как только вы перезагрузите страницу на другом пути, например /customer/ABCD, все ваши активы будут относиться к этому, следовательно, неправильный URL-адрес, который вы видите на своей консоли.

Кроме того, если вы используете webpack, вы можете попробовать установить publicPath в свой конфигурационный файл следующим образом:

...
output: {
    path: 'assets',
    publicPath: '/'
},
...

Ответ 2

У меня такая же проблема.

  • Добавьте тег <base href="#" onclick="location.href='http://whatever'; return false;"> в начало страницы, содержащей HTML-адрес-маршрутизатор с использованием браузера по умолчанию

  • Загрузите страницу - history.js выведет 2 ошибки. Предупреждение. Автоматическая установка basename с помощью <base href> устарела и будет удалена в следующей крупной версии. Семантика тонко отличается от базового. Пожалуйста, передайте базовое имя явно в параметрах createHistory

  • Измените историю взаимодействия с маршрутизатором, чтобы использовать историю, в которой история const history = useRouterHistory(createHistory)({ basename: 'http://whatever' }), которая должна устранить проблему (поскольку базовое имя теперь явно передано)

  • Обновить страницу

https://github.com/reactjs/react-router/issues/3387

Обновление 5/9

В моем случае.

index.html

<head>
  <base href="/" />
  <script src="app.js"></script>
</head>
<body>
  <div id="app">
  </div>
</body>

app.js

import { Router , useRouterHistory } from 'react-router'
import { createHistory } from 'history'

const browserHistory = useRouterHistory(createHistory)({ basename: '/' })

render(
  <Router routes={routes} history={browserHistory}/>,
  document.getElementById("app")
);

И затем перезагрузите предупреждение, чтобы исчезнуть. надеюсь, это полезно.