Fazendo com que a atualização quente do webpack funcione corretamente no meu aplicativo da web isomórfico
Estou criando um webapp com um nó / back-end expresso e um front-end de reação. Consegui (acho) a maior parte do tempo em funcionamento, mas o último passo para fazer o navegador executar uma atualização a quente não funciona conforme o esperado. Vou tentar postar toda a configuração relevante aqui. Informe-me se precisar de mais alguma coisa para descobrir onde cometi um erro:
Eu inicio meu aplicativo comnode ./server/index.js
webpack.config.js var path = require ('caminho'); var webpack = require ('webpack');
let webpackConfig = {
name: 'server',
output: {
path: path.join(__dirname, 'dist'),
filename: 'bundle.js',
publicPath: '/dist/',
},
resolve: {
extensions: [
'', '.js', '.jsx', '.json'
]
},
module: {
loaders: [
{
test: /\.(js|jsx)$/,
loader: 'babel-loader',
exclude: /node_modules/,
query:{
presets: ['es2015', 'react', 'stage-2']
}
},
{
test: /\.json$/,
loader: 'json-loader'
}
]
},
entry: [
'webpack-hot-middleware/client',
'./app/client/client.jsx'
],
plugins: [
new webpack.DefinePlugin({
'process.env': {
NODE_ENV: JSON.stringify('production')
}
}),
new webpack.optimize.OccurenceOrderPlugin(),
new webpack.HotModuleReplacementPlugin(),
new webpack.NoErrorsPlugin()
]
};
export default webpackConfig;
index.js inclua apenas 'babel-register' e 'server.js'
server / server.js importar webpack de 'webpack'; importar webpackConfig de '../webpack.config'; importar webpackDevMiddleware de 'webpack-dev-middleware'; importar webpackHotMiddleware de 'webpack-hot-middleware';
import express from 'express';
const app = express();
const renderPage = () => {
return `
<!doctype html>
<html>
<head>
<title>Brewing Day</title>
<meta charset='utf-8'>
</head>
<body>
<h1>Hello from server.js!!</h1>
<div id='root'></div>
<script src='/dist/bundle.js'></script>
</body>
</html>
`;
};
const compiler = webpack(webpackConfig);
app.use(webpackDevMiddleware(compiler, {
noInfo: true,
publicPath: webpackConfig.output.publicPath })
);
app.use(webpackHotMiddleware(compiler));
app.use((req, res, next) => {
res.status(200).end(renderPage());
});
const server = app.listen(3005, () => {
const host = server.address().address;
const port = server.address().port;
console.log(`Listening at http://${host}:${port}`);
})
export default server;
Eapp / client / client.jsx esse é o ponto de entrada na configuração do webpack:
import React from 'react';
import ReactDOM from 'react-dom';
import Application from '../components/application.jsx';
window.addEventListener('load', () => {
ReactDOM.render(<Application />, document.getElementById('root')
);
});
No console, quando eu inicio, ele lista a seguinte linha:
webpack built cc1194a11614a3ba54a3 in 730ms
Quando faço uma alteração para, por exemploclient.jsx
ouapplication.jsx
que contém o componente correto, recebo duas novas linhas no meu console:
webpack building...
webpack built 8d340a8853d3cfe9478d in 195ms
Por enquanto, tudo bem!
No entanto, no navegador, ele não é atualizado e fornece o seguinte aviso no console:
[HMR] The following modules couldn't be hot updated: (Full reload needed)
This is usually because the modules which have changed (and their parents) do not know how to hot reload themselves. See http://webpack.github.io/docs/hot-module-replacement-with-webpack.html for more details.
[HMR] - ./app/components/application.jsx
Eu tentei adicionar aleatoriamentemodule.hot.accept()
paraapplication.jsx
. Isso se livra dos avisos, mas ainda não há atualização sem pressionar F5 e recarregar o navegador.
Alguma idéia do que estou perdendo aqui? Eu vi outro exemplo configurado quase como o meu, onde isso funciona sem nenhummodule.hot.accept()
chamadas em qualquer lugar, mas não consigo ver onde minha configuração difere da outra.
Toda e qualquer ajuda será apreciada.