Estou criando um aplicativo que usa webpack-dev-server no desenvolvimento junto com o react-router.
Parece que webpack-dev-server é construído em torno da suposição de que você terá um ponto de entrada público em um lugar (ou seja, "/"), enquanto o react-router permite uma quantidade ilimitada de pontos de entrada.
Eu quero os benefícios do webpack-dev-server, especialmente o recurso de recarregamento a quente que é ótimo para produtividade, mas ainda quero ser capaz de carregar rotas definidas no react-router.
Como alguém poderia implementá-lo de forma que eles trabalhassem juntos? Você poderia executar um servidor expresso na frente do webpack-dev-server de forma a permitir isso?
javascript
reactjs
webpack
react-router
Nathan Wienert
fonte
fonte
Respostas:
Eu configurei um proxy para conseguir isso:
Você tem um servidor da web expresso regular que serve o index.html em qualquer rota, exceto se for uma rota de ativo. se for um ativo, a solicitação é enviada por proxy para o web-dev-server
seus pontos de entrada react hot ainda apontarão diretamente para o servidor de desenvolvimento webpack, então o hot recarregamento ainda funciona.
Vamos supor que você execute webpack-dev-server em 8081 e seu proxy em 8080. Seu arquivo server.js será semelhante a este:
agora faça seus pontos de entrada na configuração do webpack assim:
observe a chamada direta para 8081 para hotreload
também certifique-se de passar um url absoluto para a
output.publicPath
opção:fonte
output.publicPath
opção, que também deve ser um url absoluto.historyApiFallback
.Você deve definir
historyApiFallback
deWebpackDevServer
como verdadeiro para que isso funcione. Aqui está um pequeno exemplo (ajuste para se adequar aos seus objetivos):fonte
true
.webpack-dev-server --history-api-fallback
Para qualquer pessoa que ainda esteja procurando por essa resposta. Eu criei um bypass de proxy simples que consegue isso sem muito trabalho e a configuração vai para o webpack.config.js
Tenho certeza de que existem maneiras muito mais elegantes de testar o conteúdo local usando regex, mas isso funciona para minhas necessidades.
fonte
Se você estiver executando webpack-dev-server usando CLI, poderá configurá-lo por meio de webpack.config.js passando o objeto devServer:
Isso irá redirecionar para index.html toda vez que 404 for encontrado.
NOTA: Se você estiver usando publicPath, você precisará passá-lo para devServer também:
Você pode verificar se tudo está configurado corretamente observando as primeiras linhas da saída (a parte com "404s retrocederá para: caminho ").
fonte
Para uma resposta mais recente, a versão atual do webpack (4.1.1), você pode apenas definir isso em seu webpack.config.js da seguinte forma:
A parte importante é
historyApiFallback: true
. Não há necessidade de executar um servidor personalizado, basta usar o cli:fonte
Eu gostaria de acrescentar à resposta para o caso de quando você executa um aplicativo isomórfico (ou seja, renderizando o componente React do lado do servidor).
Nesse caso, você provavelmente também deseja recarregar automaticamente o servidor ao alterar um dos componentes do React. Você faz isso com o
piping
pacote. Tudo que você precisa fazer é instalá-lo e adicionarrequire("piping")({hook: true})
em algum lugar no início de seu server.js . É isso aí. O servidor será reiniciado após você alterar qualquer componente usado por ele.Isso levanta outro problema - se você executar o servidor webpack a partir do mesmo processo que seu servidor expresso (como na resposta aceita acima), o servidor webpack também será reiniciado e recompilará seu pacote todas as vezes. Para evitar isso, você deve executar o servidor principal e o servidor webpack em processos diferentes para que a tubulação reinicie apenas o servidor expresso e não toque no webpack. Você pode fazer isso com o
concurrently
pacote. Você pode encontrar um exemplo disso no react-isomorphic-starterkit . No package.json ele tem:que executa os dois servidores simultaneamente, mas em processos separados.
fonte
historyApiFallback
também pode ser um objeto em vez de um booleano, contendo as rotas.fonte
Pode não ser em todos os casos, mas parece que a
publicPath: '/'
opção no devServer é a solução mais fácil para corrigir o problema de rotas profundas, consulte: https://github.com/ReactTraining/react-router/issues/676fonte
Isso funcionou para mim: basta adicionar os middlewares do webpack primeiro e o
app.get('*'...
resolvedor index.html depois,assim, o expresso verificará primeiro se a solicitação corresponde a uma das rotas fornecidas pelo webpack (como:
/dist/bundle.js
ou/__webpack_hmr_
) e, se não, moverá para oindex.html
com o*
resolvedor.ie:
fonte