webpack-dev-server
webpack-dev-server copied to clipboard
behavior of static and historyApiFallback
Expected Behavior
Static serving middleware for the dev server should only need to be applied to the express server once via this.app.use(...)
Actual Behavior
static middleware is applied to the express server multiple times in order to make historyApiFallback
work as expected. This is explained here: https://github.com/webpack/webpack-dev-server/pull/2670#discussion_r464946541
A similar thing seems to have been added for the middleware
feature as seen here, as it is added multiple times:
https://github.com/webpack/webpack-dev-server/blob/4ab1f21bc85cc1695255c739160ad00dc14375f1/lib/Server.js#L548-L559
Solution
We need to find a way to either apply all of this middleware once without having any breaking changes, or have intentional slight breaking changes while only applying the middleware once. We should also look into if applying the same middleware many times causes performance losses, or if it is an acceptable thing to do.
Yes, if the proxy
feature or the historyApiFallback
feature is enabled, http-proxy-middleware
will be applied to the express server multiple times.
historyApiFallback
also break HEAD request in some cases, we need fix it, more information here https://github.com/webpack/webpack-dev-middleware/issues/749
Partially fixed https://github.com/webpack/webpack-dev-server/pull/4501
I ran into this issue earlier and spent a few hours trying to debug it. In my case it turned out that configuring the webpack-dev-server proxy
option with context
and router
options, but not target
causes webpack-dev-server to ignore the context
option when configuring the proxy:
https://github.com/webpack/webpack-dev-server/blob/49efdf87341d4e40106baae60670a4aabf3285fb/lib/Server.js#L2174-L2189
My understanding is that if you're using router
you don't need to specify target
, but if I don't then webpack-dev-server configures the proxy to intercept every request, rather than just the requests that match the context.
In my case I'm only proxying a single endpoint, so I've configured context
and target
to the same value, and let the router reconfigure the target on each request. This appears to fix the conflict with historyApiFallback
.
I think we can improve/fix:
return createProxyMiddleware(proxyConfig);
So we will always pass options even you don't have router, what do you think?