O roteador de reação permite que os aplicativos de reação sejam manipulados /arbitrary/route
. Para que isso funcione, preciso que meu servidor envie o aplicativo React em qualquer rota correspondente.
Mas o servidor de desenvolvimento webpack não lida com pontos finais arbitrários.
Há uma solução aqui usando servidor expresso adicional. Como permitir que o webpack-dev-server permita pontos de entrada do react-router
Mas não quero iniciar outro servidor expresso para permitir a correspondência de rota. Eu só quero dizer ao servidor de desenvolvimento webpack para corresponder a qualquer URL e me enviar meu aplicativo de reação. por favor.
reactjs
ecmascript-6
webpack
react-router
eguneys
fonte
fonte
Respostas:
Encontrei a solução mais fácil para incluir uma pequena configuração:
Encontrei isso visitando: PUSHSTATE WITH WEBPACK-DEV-SERVER .
fonte
--history-api-fallback
devServer: { port: 3000, historyApiFallback: true },
A opção historyApiFallback na documentação oficial do webpack-dev-server explica claramente como você pode obter isso usando
que simplesmente retorna ao index.html quando a rota não é encontrada
ou
fonte
historyApiFallback
webpack-dev-server
será o sucessorwebpack-serve
, e não o contrário, como mencionado em stackoverflow.com/questions/31945763/… .Adicionar caminho público à configuração ajuda o webpack a entender o root (
/
) real, mesmo quando você está em sub-roteiros, por exemplo./article/uuid
Portanto, modifique sua configuração do webpack e adicione o seguinte:
Sem
publicPath
recursos, pode não ser carregado corretamente, apenas index.html.Testado no Webpack
4.6
Parte maior da configuração (apenas para ter uma imagem melhor):
fonte
historyApiFallback
truque só funcionou para a última parte do URL por algum motivo./test
funcionaria, mas/test/test
daria 404.historyApiFallback: {index: '/'}
ouhistoryApiFallback: true
(ambos funcionaram para mim), definir opublicPath
também foi essencial no meu caso (roteador 5.2).Funciona para mim assim
Trabalhando no aplicativo anti-motim
fonte
Minha situação era um pouco diferente, pois estou usando a CLI angular com o webpack e a opção 'eject' após executar o comando ng eject . Modifiquei o script npm ejetado para 'npm start' no package.json para passar no sinalizador --history-api-fallback
fonte
Se você optar por usar
webpack-dev-server
, não deverá usá-lo para veicular todo o aplicativo React. Você deve usá-lo para servir seubundle.js
arquivo, bem como as dependências estáticas. Nesse caso, você teria que iniciar 2 servidores, um para os pontos de entrada do Node.js., que realmente processam rotas e veiculam o HTML e outro para os recursos estáticos e de pacote configurável.Se você realmente deseja um servidor único, deve parar de usar o
webpack-dev-server
e começar a usar o webpack-dev-middleware no servidor de aplicativos. Ele processará os pacotes "on the fly" (acho que suporta o armazenamento em cache e as substituições de módulos quentes) e certifique-se de que suas chamadasbundle.js
estejam sempre atualizadas.fonte
Você pode ativar
historyApiFallback
aindex.html
exibição do erro 404 em vez de nenhum outro recurso neste local.Se você deseja fornecer arquivos diferentes para URIs diferentes, você pode adicionar regras básicas de reescrita a essa opção. O
index.html
ainda será servido para outros caminhos.fonte
Eu sei que esta pergunta é para o webpack-dev-server, mas para quem usa o webpack-serve 2.0. com webpack 4.16.5 ; O webpack-serve permite complementos.Você precisará criar
serve.config.js
:Referência
Você precisará alterar o script dev de
webpack-serve
paranode serve.config.js
.fonte
Para mim eu tinha pontos "." no meu caminho, por exemplo,
/orgs.csv
então eu tive que colocar isso no meu webpack confg.fonte
Eu concordo com a maioria das respostas existentes.
Uma coisa importante que eu gostaria de mencionar é que, se você encontrar problemas ao recarregar manualmente as páginas em caminhos mais profundos, onde ele mantém a seção inteira, exceto a última, e o nome do seu
js
arquivo de pacote, você provavelmente precisará de uma configuração extra (especificamente apublicPath
configuração )Por exemplo, se eu tiver um caminho
/foo/bar
e meu arquivo bundler for chamadobundle.js
. Quando tento atualizar manualmente a página, recebo um ditado 404 que/foo/bundle.js
não pode ser encontrado. Curiosamente, se você tentar recarregar a partir do caminho,/foo
não verá problemas (isso ocorre porque o fallback lida com isso).Tente usar o abaixo em conjunto com a sua
webpack
configuração existente para corrigir o problema.output.publicPath
é a peça chave!fonte