Я настраиваю серверную серверную часть в экспрессе для приложения React, которое использует React-Router v4. До сих пор я настроил Express так, чтобы любой запрос перенаправлялся в index.html, позволяя React Router выполнять остальную часть работы. Это работает для маршрутов '/beats'
, '/loops'
, '/kits'
и т. Д. Проблема возникает, когда в URL имеется несколько каталогов, например, с URL-адресом '/beats/1/name-of-beat'
(который анализируется как '/beats/:id/:name?'
в реакции маршрутизатор).
Использование этого экспресс-кода:
app.use(express.static(path.join(__dirname, '../frontend/build')));
app.get('/*', (req, res) => {
res.sendFile(path.join(__dirname, '../frontend/build/index.html'));
});
Это перенаправит все запросы в / kit, / beats и тому подобное в index.html, и все источники <script>
будут работать. Тем не менее, при попытке достичь '/beats/1/name'
, index.html обслуживается, но теги <script>
также обслуживаются index.html, что приводит к загрузке index.html в браузере, но не к JavaScript.
Это происходит, если я добавляю в URL любые другие каталоги в дополнение к первому, поэтому '/beats/example'
или '/beats/1/2/3'
, но не для '/example'
(что будет правильно показывать 404, настроенный в реакции-маршрутизаторе).
Если это необходимо, вот код маршрутизатора:
<Router>
<div className="App">
<Header />
<Switch>
<Route exact path="/" component={Home} />
<Route path="/kits" component={Kits} />
<Route exact path="/beats" component={Beats} />
<Route path="/beats/:id/:beatName?" component={SoundPage} />
<Route path="/loops" component={Loops} />
<Route path="/contact" component={Contact} />
<Route component={NoMatch} />
</Switch>
</div>
</Router>
Вот теги встроенного сценария index.html:
<script src="./static/js/1.731b4af1.chunk.js"></script>
<script src="./static/js/main.498cadba.chunk.js"></script>
А вот и структура проекта:
-frontend
-build
-static
-index.html
-src
-public
-backend
-server.js