Я создаю приложение, которое использует в разработке webpack-dev-server вместе с response-router.
Похоже, что webpack-dev-server построен на предположении, что у вас будет общедоступная точка входа в одном месте (т.е. «/»), тогда как response-router допускает неограниченное количество точек входа.
Мне нужны преимущества webpack-dev-server, особенно функция горячей перезагрузки, которая отлично подходит для производительности, но я все еще хочу иметь возможность загружать маршруты, установленные в response-router.
Как можно было реализовать это так, чтобы они работали вместе? Не могли бы вы запустить экспресс-сервер перед webpack-dev-server таким образом, чтобы это было возможно?
javascript
reactjs
webpack
react-router
Натан Винерт
источник
источник
Ответы:
Я настроил прокси для этого:
У вас есть обычный экспресс-веб-сервер, который обслуживает index.html на любом маршруте, за исключением маршрута актива. если это актив, запрос передается на веб-сервер разработчика.
ваши реактивные горячие точки входа по-прежнему будут указывать непосредственно на сервер разработчика webpack, поэтому горячая перезагрузка все еще работает.
Предположим, вы запускаете webpack-dev-server на 8081 и ваш прокси на 8080. Ваш файл server.js будет выглядеть так:
теперь сделайте свои точки входа в конфигурации webpack следующим образом:
обратите внимание на прямой вызов 8081 для горячей перезагрузки
также убедитесь, что вы передаете абсолютный URL-адрес
output.publicPath
опции:источник
output.publicPath
опции, которая тоже должна быть абсолютным URL.historyApiFallback
.Вы должны установить
historyApiFallback
вWebpackDevServer
качестве истинно для этого к работе. Вот небольшой пример (настройте для ваших целей):источник
true
.webpack-dev-server --history-api-fallback
Для всех, кто все еще может искать этот ответ. Я собрал простой обход прокси, который позволяет добиться этого без особых хлопот, а конфигурация переходит в webpack.config.js
Я уверен, что есть гораздо более элегантные способы проверки локального содержимого с использованием регулярных выражений, но это работает для моих нужд.
источник
Если вы используете webpack-dev-server с помощью CLI, вы можете настроить его через webpack.config.js, передав объект devServer:
Это будет перенаправлять на index.html каждый раз, когда встречается ошибка 404.
ПРИМЕЧАНИЕ. Если вы используете publicPath, вам также необходимо передать его на devServer:
Вы можете убедиться, что все настроено правильно, посмотрев на первые несколько строк вывода (часть с «404s будет откатиться на: path »).
источник
Чтобы получить более свежий ответ, текущую версию webpack (4.1.1) вы можете просто установить в своем webpack.config.js следующим образом:
Важная часть
historyApiFallback: true
. Нет необходимости запускать собственный сервер, просто используйте cli:источник
Я хотел бы добавить к ответу на случай, когда вы запускаете изоморфное приложение (т.е. рендеринг компонента React на стороне сервера).
В этом случае вы, вероятно, также захотите автоматически перезагрузить сервер при изменении одного из компонентов React. Вы делаете это с
piping
пакетом. Все, что вам нужно сделать, это установить его и добавитьrequire("piping")({hook: true})
в начало файла server.js . Вот и все. Сервер перезапустится после того, как вы измените любой используемый им компонент.Однако возникает другая проблема - если вы запустите сервер веб-пакетов из того же процесса, что и экспресс-сервер (как в принятом ответе выше), сервер веб-пакетов также будет перезапущен и каждый раз будет перекомпилировать ваш пакет. Чтобы избежать этого, вы должны запускать свой основной сервер и сервер веб-пакетов в разных процессах, чтобы конвейер перезапускал только ваш экспресс-сервер и не касался веб-пакета. Вы можете сделать это с помощью
concurrently
package. Вы можете найти пример этого в react-isomorphic-starterkit . В package.json у него есть:который запускает оба сервера одновременно, но в отдельных процессах.
источник
historyApiFallback
также может быть объектом вместо логического значения, содержащим маршруты.источник
Может быть не во всех случаях, но кажется, что
publicPath: '/'
вариант в devServer - это самое простое решение для устранения проблемы с глубокими маршрутами, см. Https://github.com/ReactTraining/react-router/issues/676источник
Это сработало для меня: просто добавьте сначала промежуточное ПО для веб-пакетов, а
app.get('*'...
затем преобразователь index.html,поэтому express сначала проверит, соответствует ли запрос одному из маршрутов, предоставленных webpack (например:
/dist/bundle.js
или/__webpack_hmr_
), а если нет, то он переместится вindex.html
с помощью*
преобразователя.то есть:
источник