Почему создается сборка React Webpack, показывающая пустую страницу?
Я создаю приложение для реагирования, и в настоящий момент webpack-dev-server
работает просто отлично (появляется привет мир), но webpack -p показывает пустую страницу. Для сборки "Производство" Вкладка "Сеть" под инструментами chrome dev показывает index.html
и index_bundle.js
чтобы иметь размер 0 B (см. Рисунок) . Но это явно не так. Размер файла HTML - 227 B & index_bundle.js
file размер составляет 195Kb (см. рисунок)
Также вкладка Chrome Devtools Elements отображает следующее (см. Рисунок)
Мой конфигурационный файл webpack выглядит следующим образом:
Ответы
Ответ 1
Я понял это, я использовал browserHistory без настройки локального сервера. Если я изменил его на hashHistory, он сработал. Чтобы тестировать производство веб-пакетов локально с помощью истории браузера с реакционным маршрутизатором, мне нужно было это сделать. Настроить сервер:
Ваш сервер должен быть готов для обработки реальных URL-адресов. Когда приложение сначала загружается с /, оно, вероятно, будет работать, но по мере того, как пользователь будет перемещаться, а затем будет обновляться в /accounts/23, ваш веб-сервер получит запрос /accounts/23. Он понадобится для обработки этого URL-адреса и включения вашего приложения JavaScript в ответ.
Экспресс-приложение может выглядеть так:
const express = require('express')
const path = require('path')
const port = process.env.PORT || 8080
const app = express()
// serve static assets normally
app.use(express.static(__dirname + '/public'))
// handle every other route with index.html, which will contain
// a script tag to your application JavaScript file(s).
app.get('*', function (request, response){
response.sendFile(path.resolve(__dirname, 'public', 'index.html'))
})
app.listen(port)
console.log("server started on port " + port)
И на всякий случай, когда кто-то развертывается в firebase, используя реактивный маршрутизатор с историей браузера, выполните следующие действия:
{
"firebase": "<YOUR-FIREBASE-APP>",
"public": "<YOUR-PUBLIC-DIRECTORY>",
"ignore": [
"firebase.json",
"**/.*",
"**/node_modules/**"
],
"rewrites": [
{
"source": "**",
"destination": "/index.html"
}
]
}
Ответ 2
использование
import { HashRouter } from 'react-router-dom';
вместо
import { BrowserRouter} from 'react-router-dom';
и не забудьте заменить его в коде маршрутов
<HashRouter>
...
</HashRouter>
Ответ 3
GitHub Pages не поддерживает маршрутизаторы, которые используют HTML5 pushState
API истории под капотом (например, React Router с использованием browserHistory
). Это связано с тем, что при наличии новой загрузки страницы для URL- http://user.github.io/todomvc/todos/42
, например http://user.github.io/todomvc/todos/42
, где /todos/42
является интерфейсом, сервер GitHub Pages возвращает 404, потому что он ничего не знает of /todos/42
. Если вы хотите добавить маршрутизатор в проект, размещенный на страницах GitHub, вот несколько решений:
- Вы можете перейти от использования API истории HTML5 к маршрутизации с помощью хэшей. Если вы используете React Router, вы можете переключиться на
hashHistory
для этого эффекта, но URL будет длиннее и подробнее (например, http://user.github.io/todomvc/#/todos/42?_k=yknaj
), Подробнее о различных реализациях истории в React Router. - Кроме того, вы можете использовать трюк, чтобы научить страницы GitHub обрабатывать 404 путем перенаправления на страницу
index.html
со специальным параметром перенаправления. Вам нужно будет добавить файл 404.html
с кодом перенаправления в папку build
перед развертыванием вашего проекта, и вам нужно будет добавить код, обрабатывающий параметр перенаправления index.html
. Подробное объяснение этой техники вы найдете в этом руководстве.