Je crée une application qui utilise webpack-dev-server en développement aux côtés de react-router.
Il semble que webpack-dev-server est construit autour de l'hypothèse que vous aurez un point d'entrée public à un endroit (c'est-à-dire "/"), alors que react-router permet un nombre illimité de points d'entrée.
Je veux les avantages du serveur webpack-dev-server, en particulier la fonction de rechargement à chaud qui est excellente pour la productivité, mais je veux toujours pouvoir charger les routes définies dans react-router.
Comment pourrait-on le mettre en œuvre de manière à ce qu'ils travaillent ensemble? Pourriez-vous exécuter un serveur express devant webpack-dev-server de manière à permettre cela?
javascript
reactjs
webpack
react-router
Nathan Wienert
la source
la source
Réponses:
J'ai mis en place un proxy pour y parvenir:
Vous disposez d'un serveur Web express régulier qui sert l'index.html sur n'importe quel itinéraire, sauf s'il s'agit d'un itinéraire d'actif. s'il s'agit d'un actif, la requête est envoyée par proxy au serveur web-dev-server
vos points d'entrée réactifs pointeront toujours directement vers le serveur de développement webpack, donc le rechargement à chaud fonctionne toujours.
Supposons que vous exécutiez webpack-dev-server sur 8081 et votre proxy sur 8080. Votre fichier server.js ressemblera à ceci:
maintenant, créez vos points d'entrée dans la configuration du webpack comme ceci:
notez l'appel direct au 8081 pour hotreload
assurez-vous également de transmettre une URL absolue à l'
output.publicPath
option:la source
output.publicPath
option, qui devrait également être une URL absolue.historyApiFallback
.Vous devez définir
historyApiFallback
deWebpackDevServer
vrai pour que cela fonctionne. Voici un petit exemple (ajustez pour répondre à vos besoins):la source
true
.webpack-dev-server --history-api-fallback
Pour tous ceux qui recherchent encore cette réponse. J'ai mis en place un simple contournement de proxy qui réalise cela sans trop de tracas et la configuration va dans le webpack.config.js
Je suis sûr qu'il existe des moyens beaucoup plus élégants de tester le contenu local à l'aide de regex, mais cela fonctionne pour mes besoins.
la source
Si vous exécutez webpack-dev-server en utilisant la CLI, vous pouvez le configurer via webpack.config.js en passant l'objet devServer:
Cela redirigera vers index.html à chaque fois qu'il 404 est rencontré.
REMARQUE: Si vous utilisez publicPath, vous devrez également le transmettre à devServer:
Vous pouvez vérifier que tout est correctement configuré en regardant les premières lignes de la sortie (la partie avec "404s se repliera sur: chemin ").
la source
Pour une réponse plus récente, la version actuelle de webpack (4.1.1) vous pouvez simplement définir ceci dans votre webpack.config.js comme ceci:
La partie importante est
historyApiFallback: true
. Pas besoin d'exécuter un serveur personnalisé, utilisez simplement le cli:la source
Je voudrais ajouter à la réponse pour le cas où vous exécutez une application isomorphe (c'est-à-dire le rendu côté serveur du composant React.)
Dans ce cas, vous souhaitez probablement également recharger automatiquement le serveur lorsque vous modifiez l'un de vos composants React. Vous faites cela avec le
piping
package. Tout ce que vous avez à faire est de l'installer et de l'ajouterrequire("piping")({hook: true})
quelque part au début de votre server.js . C'est tout. Le serveur redémarrera après avoir modifié l'un des composants qu'il utilise.Cela pose cependant un autre problème - si vous exécutez le serveur webpack à partir du même processus que votre serveur express (comme dans la réponse acceptée ci-dessus), le serveur webpack redémarrera également et recompilera votre bundle à chaque fois. Pour éviter cela, vous devez exécuter votre serveur principal et votre serveur Webpack dans des processus différents afin que la tuyauterie ne redémarre que votre serveur express et ne touche pas Webpack. Vous pouvez le faire avec
concurrently
package. Vous pouvez en trouver un exemple dans react-isomorphic-starterkit . Dans le package.json, il a:qui exécute les deux serveurs simultanément mais dans des processus séparés.
la source
historyApiFallback
peut également être un objet au lieu d'un booléen, contenant les routes.la source
Peut-être pas dans tous les cas, mais il semble que l'
publicPath: '/'
option dans devServer soit la solution la plus simple pour résoudre le problème des routes profondes, voir: https://github.com/ReactTraining/react-router/issues/676la source
Cela a fonctionné pour moi: ajoutez simplement les middlewares webpack en premier et le
app.get('*'...
résolveur index.html plus tard,so express vérifiera d'abord si la requête correspond à l'une des routes fournies par webpack (comme:
/dist/bundle.js
ou/__webpack_hmr_
) et sinon, il se déplacera vers leindex.html
avec le*
résolveur.c'est à dire:
la source