I'm creating an app that uses webpack-dev-server in development alongside react-router.
It seems that webpack-dev-server is built around the assumption that you will have a public entry point at one place (i.e. "/"), whereas react-router allows for an unlimited amount of entry points.
I want the benefits of the webpack-dev-server, especially the hot reloading feature that is great for productivity, but I still want to be able to load routes set in react-router.
How could one implement it such that they work together? Could you run an express server in front of webpack-dev-server in such a way to allow this?
You should set
historyApiFallback
ofWebpackDevServer
as true for this to work. Here's a small example (tweak to fit your purposes):I'd like to add to the answer for the case when you run an isomorphic app (i.e. rendering React component server-side.)
In this case you probably also want to automatically reload the server when you change one of your React components. You do this with the
piping
package. All you have to do is install it and addrequire("piping")({hook: true})
somewhere in the beginning of you server.js. That's it. The server will restart after you change any component used by it.This rises another problem though - if you run webpack server from the same process as your express server (as in the accepted answer above), the webpack server will also restart and will recompile your bundle every time. To avoid this you should run your main server and webpack server in different processes so that piping would restart only your express server and won't touch webpack. You can do this with
concurrently
package. You can find an example of this in react-isomorphic-starterkit. In the package.json he has:which runs both servers simultaneously but in separate processes.
For a more recent answer, the current version of webpack (4.1.1) you can just set this in your webpack.config.js like such:
The important part is
historyApiFallback: true
. No need to run a custom server, just use the cli:If you're running webpack-dev-server using CLI, you can configure it through webpack.config.js passing devServer object:
This will redirect to index.html everytime it 404 is encountered.
NOTE: If you're using publicPath, you'll need to pass it to devServer too:
You can verify that everything is setup correctly by looking at the first few lines of the output (the part with "404s will fallback to: path").
May be not in all cases, but seems the
publicPath: '/'
option in the devServer is easiest solution to fix deep routes issue, see: https://github.com/ReactTraining/react-router/issues/676historyApiFallback
can also be an object instead of a Boolean, containing the routes.