我目前正在尝试使用我的 webpack 项目设置热模块替换。在我对源代码中的反应组件进行更改的那一刻,我看到模块在没有刷新的情况下在浏览器中重新加载,然后是页面的完全刷新。
这是我在控制台中看到的。
- 下一行是 404,对于 GET http://localhost:8088/dist/0580e96e5dacd24618e5.hot-update.json 404(未找到)我出于公司隐私考虑删除了这个 :)
然后控制台中的这两行:
- 项目清单
dev-server.js:28 [HMR] 找不到更新。需要完全重新加载!(匿名函数)@ dev-server.js:28(匿名函数)@
- 项目清单
index.js:238request.onreadystatechange @ index.js:37 dev-server.js:29 [HMR] (可能是因为重启了 webpack-dev-server)
如您所见,'client:37 [WDS] 应用程序已更新。重新编译...' 似乎运行了两次...这可能就是为什么它既是热交换又是完全重新加载的原因。
有任何想法吗?
这是我的 webpack.config
module.exports = {
devtool: 'eval',
cache: true,
entry: {
index: [
'react-hot-loader/patch',
'webpack-dev-server/client?http://localhost:8080',
'webpack/hot/only-dev-server',
'./js/src/index.js'
],
login: './login/index.js',
},
output: {
path: path.join(__dirname, 'dist'),
publicPath: '/dist/',
filename: '[name].js',
chunkFilename: '[name].js'
},
module: {
loaders: [
// Transpile ES6 JSX to ES5 JS
{
test: /\.(js|jsx)$/,
exclude: /node_modules/,
loader: 'babel',
},
// SCSS
{
test: /\.scss$/,
loaders: [
'style',
'css?importLoaders=1&localIdentName=[local]-[hash:base64:5]',
'postcss-loader',
'resolve-url',
'sass'
]
},
{
test: /\.json$/,
loaders: ['json-loader'],
}
]
},
postcss: function () {
return {
defaults: [autoprefixer],
cleaner: [autoprefixer({ browsers: ['last 2 versions'], cascade: true })]
};
},
plugins: [
new webpack.ContextReplacementPlugin(/moment[\/\\]locale$/, /en|de|fr|zh|ja|it/),
new webpack.HotModuleReplacementPlugin(),
new webpack.IgnorePlugin(/ReactContext/),
new webpack.DefinePlugin({ 'process.env.apiEndPointUrl': '"'+apiEndPointUrl+'"' }),
new JsonBundlerPlugin({
fileInput: '**/locales/*.json',
omit: /\/locales|\/?components|\/?services|\/?scenes|\/?features/g,
rootDirectory: 'src'
}),
],
resolve: {
extensions: ['', '.js', '.json', '.jsx']
}
};
这是我在 npm 任务中运行的 devServer.js 文件。
const webpack = require('webpack');
const WebpackDevServer = require('webpack-dev-server');
const opener = require('opener');
const config = require('./webpack.config.js');
const host = 'localhost';
const port = 8080;
new WebpackDevServer(webpack(config), {
publicPath: config.output.publicPath,
hot: true,
historyApiFallback: true,
stats: {
colors: true // color is life
},
})
.listen(port, host, (err) => {
if (err) {
console.log(err);
}
console.log(`Listening at ${host}:${port}`);
opener(`http://${host}:${port}`);
});