Estoy creando una aplicación que usa webpack-dev-server en desarrollo junto con react-router.
Parece que webpack-dev-server se basa en la suposición de que tendrá un punto de entrada público en un lugar (es decir, "/"), mientras que react-router permite una cantidad ilimitada de puntos de entrada.
Quiero los beneficios de webpack-dev-server, especialmente la función de recarga en caliente que es excelente para la productividad, pero aún quiero poder cargar rutas configuradas en react-router.
¿Cómo podría uno implementarlo para que trabajen juntos? ¿Podría ejecutar un servidor rápido frente a webpack-dev-server de tal manera que permita esto?
javascript
reactjs
webpack
react-router
Nathan Wienert
fuente
fuente
Respuestas:
Configuré un proxy para lograr esto:
Tiene un servidor web expreso regular que sirve el index.html en cualquier ruta, excepto si es una ruta de activos. si es un activo, la solicitud se envía al servidor web-dev-server
sus puntos de entrada de react hot seguirán apuntando directamente al servidor de desarrollo webpack, por lo que la recarga en caliente aún funciona.
Supongamos que ejecuta webpack-dev-server en 8081 y su proxy en 8080. Su archivo server.js se verá así:
ahora haga sus puntos de entrada en la configuración del paquete web así:
tenga en cuenta la llamada directa al 8081 para hotreload
también asegúrese de pasar una URL absoluta a la
output.publicPath
opción:fuente
output.publicPath
opción, que también debería ser una URL absoluta.historyApiFallback
.Se debe ajustar
historyApiFallback
deWebpackDevServer
tan cierto para que esto funcione. Aquí hay un pequeño ejemplo (modifíquelo para que se ajuste a sus propósitos):fuente
true
.webpack-dev-server --history-api-fallback
Para cualquier otra persona que todavía esté buscando esta respuesta. Reuní un bypass de proxy simple que logra esto sin mucha molestia y la configuración entra en webpack.config.js
Estoy seguro de que hay formas mucho más elegantes de probar el contenido local usando expresiones regulares, pero esto funciona para mis necesidades.
fuente
Si está ejecutando webpack-dev-server usando CLI, puede configurarlo a través de webpack.config.js pasando el objeto devServer:
Esto redirigirá a index.html cada vez que se encuentre el 404.
NOTA: Si está utilizando publicPath, también deberá pasarlo a devServer:
Puede verificar que todo esté configurado correctamente observando las primeras líneas de la salida (la parte con "404s volverá a: ruta ").
fuente
Para una respuesta más reciente, la versión actual de webpack (4.1.1) puede configurar esto en su webpack.config.js como tal:
La parte importante es
historyApiFallback: true
. No es necesario ejecutar un servidor personalizado, solo use el cli:fuente
Me gustaría agregar a la respuesta para el caso cuando ejecuta una aplicación isomorfa (es decir, renderizando el componente React del lado del servidor).
En este caso, probablemente también desee volver a cargar automáticamente el servidor cuando cambie uno de sus componentes de React. Haz esto con el
piping
paquete. Todo lo que tienes que hacer es instalarlo y agregarlorequire("piping")({hook: true})
en algún lugar al principio de tu server.js . Eso es. El servidor se reiniciará después de que cambie cualquier componente utilizado por él.Sin embargo, esto plantea otro problema: si ejecuta el servidor webpack desde el mismo proceso que su servidor express (como en la respuesta aceptada anteriormente), el servidor webpack también se reiniciará y volverá a compilar su paquete cada vez. Para evitar esto, debe ejecutar su servidor principal y el servidor de paquete web en diferentes procesos para que la tubería reinicie solo su servidor express y no toque el paquete web. Puede hacer esto con
concurrently
package. Puede encontrar un ejemplo de esto en react-isomorphic-starterkit . En el package.json tiene:que ejecuta ambos servidores simultáneamente pero en procesos separados.
fuente
historyApiFallback
también puede ser un objeto en lugar de un booleano, que contiene las rutas.fuente
Puede que no sea en todos los casos, pero parece que la
publicPath: '/'
opción en devServer es la solución más fácil para solucionar el problema de las rutas profundas, consulte: https://github.com/ReactTraining/react-router/issues/676fuente
Esto funcionó para mí: simplemente agregue el middlewares del paquete web primero y el solucionador
app.get('*'...
index.html más tarde,por lo que express primero verificará si la solicitud coincide con una de las rutas proporcionadas por el paquete web (como:
/dist/bundle.js
o/__webpack_hmr_
) y si no, se moverá a laindex.html
con el*
solucionador.es decir:
fuente